From 855bc9a731de6bb7c070e11a38c52c91018d1754 Mon Sep 17 00:00:00 2001 From: "vincent@cubedesigners.com" Date: Sun, 18 Sep 2011 17:38:35 +0000 Subject: [PATCH] --- .../FWSTK_Resources/dist/FWSTK_Resources.jar | Bin 8004216 -> 8001863 bytes .../resources/LayoutStripper.properties | 78 +-- fluidbook/tools/convert.pe | 4 +- fluidbook/tools/descriptors.pe | 25 + .../fwstk/nbproject/private/config.properties | 2 +- .../private/configs/Extract_Layout.properties | 2 +- .../private/configs/Extract_texts.properties | 2 +- .../apache/pdfbox/pdfviewer/PageDrawer.java | 557 ++++++++++++++++++ .../apache/pdfbox/util/PDFStreamEngine.java | 21 +- .../Util/fontextractor/class.ws.pdf.font.php | 65 +- .../class.ws.pdf.fontextractor.php | 48 +- inc/ws/Util/html5/class.ws.html5.compiler.php | 21 +- 12 files changed, 754 insertions(+), 71 deletions(-) create mode 100644 fluidbook/tools/descriptors.pe create mode 100644 fluidbook/tools/fwstk/src/org/apache/pdfbox/pdfviewer/PageDrawer.java diff --git a/fluidbook/tools/FWSTK_Resources/dist/FWSTK_Resources.jar b/fluidbook/tools/FWSTK_Resources/dist/FWSTK_Resources.jar index 04d781ae03ba332aae4b05a7b41012e446dd7953..3cbc926cbdc87c87047bc488df3b3a4f6d34a8cc 100644 GIT binary patch delta 10100 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 tBen Litchfield + * @version $Revision: 1.22 $ + */ +public class PageDrawer extends PDFStreamEngine +{ + + /** + * Log instance. + */ + private static final Log log = LogFactory.getLog(PageDrawer.class); + + private Graphics2D graphics; + protected Dimension pageSize; + protected PDPage page; + + private GeneralPath linePath = new GeneralPath(); + + /** + * Default constructor, loads properties from file. + * + * @throws IOException If there is an error loading properties from the file. + */ + public PageDrawer() throws IOException + { + super( ResourceLoader.loadProperties( + "org/apache/pdfbox/resources/PageDrawer.properties", true ) ); + } + + public PageDrawer(Properties properties) throws IOException { + super(properties); + } + + /** + * This will draw the page to the requested context. + * + * @param g The graphics context to draw onto. + * @param p The page to draw. + * @param pageDimension The size of the page to draw. + * + * @throws IOException If there is an IO error while drawing the page. + */ + public void drawPage( Graphics g, PDPage p, Dimension pageDimension ) throws IOException + { + graphics = (Graphics2D)g; + page = p; + pageSize = pageDimension; + graphics.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON ); + graphics.setRenderingHint( RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON ); + // Only if there is some content, we have to process it. + // Otherwise we are done here and we will produce an empty page + if ( page.getContents() != null) + { + PDResources resources = page.findResources(); + processStream( page, resources, page.getContents().getStream() ); + } + + return;/* + List annotations = page.getAnnotations(); + for( int i=0; i '00C6', 'ae' => '00E6', 'OE' => '0152', 'oe' => '0152', 'IJ' => '0132', 'ij' => '0133', @@ -59,10 +67,43 @@ class wsPDFFont { $e = explode(" ", $line); if (strpos($e[0], "/FontFile") !== false) { $this->font_file_id = $e[1]; + } elseif ($e[0] == '/ItalicAngle') { + $this->italicAngle = $e[1]; + } elseif ($e[0] == '/FontWeight') { + $this->fontWeight = $e[1]; + } elseif ($e[0] == '/FontStretch') { + $this->fontStretch = ltrim($e[1], "/"); + } elseif ($e[0] == '/Ascent') { + $this->ascent = $e[1]; + } elseif ($e[0] == '/Descent') { + $this->descent = abs($e[1]); + } elseif ($e[0] == '/XHeight') { + $this->xheight = $e[1]; + } elseif ($e[0] == '/CapHeight') { + $this->capheight = $e[1]; + } elseif ($e[0] == '/Flags') { + $this->flags = $e[1]; } } } + public function setDescriptorsToFile($file) { + $fontforge = new cubeCommandLine('descriptors.pe'); + $fontforge->setPath(CONVERTER_PATH); + + $font=$this; + if(!is_null($this->descendant)){ + $font=$this->decendant; + } + + $fontforge->setArg(null, $file); + $fontforge->setArg(null, $font->italicAngle); + $fontforge->setArg(null, $font->ascent); + $fontforge->setArg(null, $font->descent); + $fontforge->execute(); + $this->addToLog($fontforge); + } + public function getInfos() { $lines = $this->showObject($this->id); // Test redirection @@ -70,7 +111,7 @@ class wsPDFFont { $e = explode(' ', $lines[0]); if ($e[0] == '[' && $e[4] == ']') { // Change id and get infos again - $this->id=$e[1]; + $this->id = $e[1]; return $this->getInfos(); } else { return; @@ -261,15 +302,35 @@ class wsPDFFont { return $this->font_file_id; } + public function getName() { + return $this->name; + } + + public function getCanonicalName() { + $n = $this->getName(); + $e = explode('+', $n); + if (count($e) > 1) { + array_shift($e); + $n = implode('+', $e); + } + return $n; + } + + public function getTTFFile() { + return $this->ttffile; + } + public function writeTTF($dir) { $cmap = $this->writeCMAP(); $file = $this->writeFont(); + $this->ttffile = $dir . '/' . $this->name . '-' . $this->id . '.ttf'; + $fontforge = new cubeCommandLine('convert.pe'); $fontforge->setPath(CONVERTER_PATH); $fontforge->setArg(null, $file); $fontforge->setArg(null, $cmap); - $fontforge->setArg(null, $dir . '/' . $this->name . '-' . $this->id . '.ttf'); + $fontforge->setArg(null, $this->ttffile); $fontforge->execute(); $this->addToLog($fontforge); diff --git a/inc/ws/Util/fontextractor/class.ws.pdf.fontextractor.php b/inc/ws/Util/fontextractor/class.ws.pdf.fontextractor.php index a6ad65ddb..4cd286275 100644 --- a/inc/ws/Util/fontextractor/class.ws.pdf.fontextractor.php +++ b/inc/ws/Util/fontextractor/class.ws.pdf.fontextractor.php @@ -23,8 +23,7 @@ class wsPDFFontExtractor { $this->getFonts(); $this->convertToTTF(); - - $this->addToLog(print_r($this,true)); + $this->mergeFonts(); } public function convertToTTF() { @@ -33,6 +32,35 @@ class wsPDFFontExtractor { } } + public function mergeFonts() { + $collections = array(); + foreach ($this->fonts as $font) { + if (!isset($collections[$font->getCanonicalName()])) { + $collections[$font->getCanonicalName()] = array(); + } + $collections[$font->getCanonicalName()][] = $font; + } + + foreach ($collections as $name => $fonts) { + $out = $this->outweb . '/' . $fonts[0]->getCanonicalName() . '.ttf'; + if (count($fonts) == 1) { + copy($fonts[0]->getTTFFile(), $out); + } else { + $fontforge = new cubeCommandLine('convert.pe'); + $fontforge->setPath(CONVERTER_PATH); + foreach ($fonts as $font) { + $fontforge->setArg(null, $font->getTTFFile()); + } + $fontforge->setArg(null, '-'); + $fontforge->setArg(null, $out); + $fontforge->execute(); + $this->addToLog($fontforge); + } + + $fonts[0]->setDescriptorsToFile($out); + } + } + public function getFonts() { $pdfinfo = $this->getCommandLine('pdfinfo'); $pdfinfo->setArg('f'); @@ -66,7 +94,7 @@ class wsPDFFontExtractor { */ - if (preg_match_all("|\s+\d+\s+\(\s+\d+\s+\d+\s+\w+\):\s+\w+\s+'([A-Za-z-+]+)'\s+\((\d+)\s+\d+\s+\w+\)\s|", $pdfinfo->output, $matches)) { + if (preg_match_all("|\s+\d+\s+\(\s+\d+\s+\d+\s+\w+\):\s+\w+\s+'([^']+)'\s+\((\d+)\s+\d+\s+\w+\)\s|", $pdfinfo->output, $matches)) { foreach ($matches[1] as $k => $name) { $this->fonts[$matches[2][$k]] = new wsPDFFont($this, $matches[2][$k], $name); } @@ -92,25 +120,21 @@ class wsPDFFontExtractor { $pdfshow->setArg(null, $this->in); $pdfshow->setArg(null, $object); $pdfshow->execute(); - + $this->addToLog($pdfshow); - + $obj = $pdfshow->output; $obj = explode("\n", $obj); $res = array(); foreach ($obj as $o) { - $o=trim($o); - if($o==''){ + $o = trim($o); + if ($o == '') { continue; } $res[] = trim($o); - } array_shift($res); array_pop($res); - - $this->addToLog(print_r($res,true)); - return $res; } @@ -122,7 +146,7 @@ class wsPDFFontExtractor { $pdfshow->setArg(null, $this->in); $pdfshow->setArg(null, $obj); $pdfshow->execute(); - + $this->addToLog($pdfshow->commande); } diff --git a/inc/ws/Util/html5/class.ws.html5.compiler.php b/inc/ws/Util/html5/class.ws.html5.compiler.php index 52aac6046..a7ac27cb2 100644 --- a/inc/ws/Util/html5/class.ws.html5.compiler.php +++ b/inc/ws/Util/html5/class.ws.html5.compiler.php @@ -67,7 +67,7 @@ class wsHTML5Compiler { protected $optimalWidth = 567; protected $optimalHeight = 709; protected $additionalConfig = array(); - protected $fontScale = 0.9775; + protected $fontScale = 1; function __construct($book_id) { global $core; @@ -369,6 +369,9 @@ class wsHTML5Compiler { $fontforge->setArg(null, '-'); $fontforge->setArg(null, $this->vdir . '/data/style/F' . $index . '.' . $format); $fontforge->execute(); + + fb($fontforge->commande); + fb($fontforge->output); } } } @@ -728,7 +731,7 @@ class wsHTML5Compiler { foreach ($this->cssTransform as $transform => $index) { - list($rotation, $scaleX, $scaleY) = explode(',', $transform); + list($rotation, $scaleX, $scaleY, $translateX, $translateY) = explode(',', $transform); $rotation*= - 1; @@ -739,6 +742,9 @@ class wsHTML5Compiler { if ($scaleX != 1 || $scaleY != 1) { $t[] = 'scale(' . $scaleX . ',' . $scaleY . ')'; } + if ($translateX != '0' || $translateY != '') { + $t[] = 'translate(' . $translateX . ',' . $translateY . ')'; + } $css = '.t' . $index . '{'; $css.=self::writeCSSUA('transform', implode(' ', $t)) . ';'; @@ -881,6 +887,12 @@ class wsHTML5Compiler { protected function getCSSFont($font, $oblique, $document_id) { $font = (string) $font; + $e = explode('+', $font); + if (count($e) > 1) { + array_shift($e); + $font = implode('+', $e); + } + if (!isset($this->fontDocs[$font])) { $this->fontDocs[$font] = array(); } @@ -930,10 +942,7 @@ class wsHTML5Compiler { $scaleY*=-1; } - if ($rotation == 0 && $scaleX == 1 && $scaleY = 1) { - return null; - } - return $this->getIndex($rotation . ',' . $scaleX . ',' . $scaleY, $this->cssTransform); + return $this->getIndex($rotation . ',' . $scaleX . ',' . $scaleY . ',0,-0.8em', $this->cssTransform); } protected function getCSSX($x) { -- 2.39.5