]> _ Git - cubeextranet.git/commitdiff
done #741 @3
authorvincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Thu, 17 Nov 2016 15:12:57 +0000 (15:12 +0000)
committervincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Thu, 17 Nov 2016 15:12:57 +0000 (15:12 +0000)
inc/ws/Controlleur/class.ws.services.php
inc/ws/DAO/class.ws.dao.book.php
inc/ws/Metier/class.ws.book.parametres.php
inc/ws/Util/_common.php
inc/ws/Util/class.ws.pdf.convert.php [new file with mode: 0644]

index f8b3a3a4ce29c2636237e7627d0ce90bf08104fa..e164017fda1798310f80778393702b794c9a832c 100644 (file)
@@ -175,7 +175,26 @@ class wsServices extends cubeFlashGateway {
                                $cover = $c;
                        }
                }
+               if ($book->parametres->pdfThumbnails) {
+                       $pdf = wsDAOBook::getWorkingFile($book->parametres->pdfThumbnails, $book->book_id);
+
+                       if (file_exists($pdf)) {
+                               $dir = WS_CACHE . '/thumbs/' . sha1($pdf) . '/';
+                               if (!file_exists($dir)) {
+                                       mkdir($dir, 0777, true);
+                               }
+                               $jpeg = $dir . '/cover.jpg';
+                               $mtime = filemtime($jpeg);
+
+                               if (!file_exists($jpeg) || $mtime < filemtime(__FILE__) || $mtime < filemtime($pdf)) {
+                                       wsPDFConvert::makeShot($pdf, $jpeg, 1, '', 150, 90, 4, 'PNM', 1200, -1);
+                               }
+                               $cover = $jpeg;
+                       }
+               }
+
                if (!isset($cover)) {
+
                        $pages = $dao->getPagesOfBook($this->args['id']);
                        $dir = wsDocument::getDir($pages[1]['document_id']);
                        $cover = $dir . '/html/t150-' . $pages[1]['document_page'] . '.jpg';
@@ -183,6 +202,7 @@ class wsServices extends cubeFlashGateway {
                                $cover = $dir . '/p' . $pages[1]['document_page'] . '.jpg';
                        }
 
+
                        $i = WS_FILES . '/cover/' . $this->args['id'] . '.jpg';
 
                        if (!file_exists($i) || filemtime(__FILE__) > filemtime($i) || filemtime($cover) > filemtime($i)) {
index d275cbd046cbb0a1e74f3a72640f64697e193125..723bbb88216608213ebaf3ebd42f4ce43ea8c21c 100644 (file)
@@ -1311,10 +1311,18 @@ class wsDAOBook extends commonDAO {
                                }
                        }
 
+                       $thumb = false;
+                       if ($book->parametres->pdfThumbnails) {
+                               $thumb = $this->getThumbFromPDF($workingDir . '/' . $book->parametres->pdfThumbnails, $i);
+                       }
+                       if (!$thumb) {
+                               $thumb = $base . '.jpg';
+                       }
+
                        if ($i == 1) {
-                               $flexLight->addBitmap($base . '.jpg', 'thumb1');
+                               $flexLight->addBitmap($thumb, 'thumb1');
                        } else {
-                               $flex->addBitmap($base . '.jpg', 'thumb' . $i);
+                               $flex->addBitmap($thumb, 'thumb' . $i);
                        }
                        $sizes[$i] = $fsize;
                }
@@ -1475,13 +1483,31 @@ class wsDAOBook extends commonDAO {
                $flexLight->addVariable('checksum', $hash, false, true, 'String');
        }
 
+       public function getThumbFromPDF($pdf, $page) {
+               if (!file_exists($pdf)) {
+                       return false;
+               }
+               $dir = WS_CACHE . '/thumbs/' . sha1($pdf) . '/';
+               if (!file_exists($dir)) {
+                       mkdir($dir, 0777, true);
+               }
+               $jpeg = $dir . '/p' . $page . '.jpg';
+               $mtime = filemtime($jpeg);
+
+               if (!file_exists($jpeg) || $mtime < filemtime(__FILE__) || $mtime < filemtime($pdf)) {
+                       wsPDFConvert::makeMiniShot($pdf, $jpeg, $page);
+               }
+
+               return $jpeg;
+       }
+
        public static function getWorkingFile($path, $book_id, $dir = "") {
                if (substr($path, 0, 1) == '/' && file_exists($path)) {
                        return $path;
                }
 
                $workingDir = WS_BOOKS . '/working/' . $book_id . '/';
-               return $workingDir . $dir . '/' . $path;
+               return $workingDir . trim($dir,'/') . '/' . $path;
        }
 
        public function compileWidget($book, $pages) {
index 7fadfc4d962b9e9f6e2e483aa3150b4c1f8b759d..fde55e1ed36785e8226185cdaeea61154dc42399 100644 (file)
@@ -133,7 +133,10 @@ class wsBookParametres extends wsParametres {
                // .
                //
                $this->fields['indexAutoScroll'] = array('type' => 'boolean', 'default' => false, 'editable' => true, 'label' => __('Activer le scroll automatique'));
-               $this->forms['index'] = array('label' => __('Index'), 'fieldsnames' => array('indexAutoScroll'));
+               $this->fields['pdfThumbnails'] = array('type' => 'freefile', 'default' => '', 'editable' => true,
+                                                      'label' => __('PDF utilisé pour générer les miniatures'), 'grade' => 1, 'fileFilter' => $pdfFilter);
+
+               $this->forms['index'] = array('label' => __('Index'), 'fieldsnames' => array('indexAutoScroll','pdfThumbnails'));
 
                // .
                //
index 847f42242945bb0ffb78a8ad3607b9ccf0f74c97..52079bc31b158b2b986333c8c4185cf9d5950fbb 100644 (file)
@@ -18,4 +18,5 @@ $__autoload['wsPDFFont'] = dirname(__FILE__) . '/fontextractor/class.ws.pdf.font
 $__autoload['wsSVN'] = dirname(__FILE__) . '/class.ws.svn.php';\r
 $__autoload['wsLinks'] = dirname(__FILE__) . '/class.ws.links.php';\r
 $__autoload['wsExporter'] = dirname(__FILE__) . '/class.ws.exporter.php';\r
+$__autoload['wsPDFConvert'] = dirname(__FILE__) . '/class.ws.pdf.convert.php';\r
 ?>
\ No newline at end of file
diff --git a/inc/ws/Util/class.ws.pdf.convert.php b/inc/ws/Util/class.ws.pdf.convert.php
new file mode 100644 (file)
index 0000000..49e9f5b
--- /dev/null
@@ -0,0 +1,122 @@
+<?php\r
+\r
+/**\r
+ * Created by IntelliJ IDEA.\r
+ * User: Vincent\r
+ * Date: 17/11/2016\r
+ * Time: 14:24\r
+ */\r
+class wsPDFConvert {\r
+\r
+       public static function makeMiniShot($in, $out, $page) {\r
+               self::makeShotFixedWidth($in, $out, $page, 'p', 100, 90, 4, 'PNM');\r
+       }\r
+\r
+       public static function makeShotFixedWidth($in, $out, $page, $prefix = '', $w = 100, $quality = 90, $antialiasing = 4, $method = 'PNM') {\r
+               // Make thumbs of $w width\r
+               self::makeShot($in, $out, $page, $prefix, null, $quality, $antialiasing, $method, $w, -1);\r
+       }\r
+\r
+       public static function makeShotFixedHeight($in, $out, $page, $prefix = '', $h = '', $quality = 90, $antialiasing = 4, $method = 'PNM') {\r
+               // Make thumbs of $h height\r
+               self::makeShot($in, $out, $page, $prefix, null, $quality, $antialiasing, $method, -1, $h);\r
+       }\r
+\r
+       public static function makeShot($in, $out, $page, $prefix = '', $resolution = 72, $quality = 90, $antialiasing = 4, $method = 'PNM', $width = null, $height = null) {\r
+               $error = false;\r
+               if ($method == 'GS') {\r
+                       self::makeShotGS($in, $out, $page, $prefix, $resolution, $quality, $antialiasing, $width, $height);\r
+               } elseif ($method == 'PNM') {\r
+                       self::makeShotPNM($in, $out, $page, $prefix, $resolution, $quality, $antialiasing, true, $width, $height);\r
+               }\r
+               // Test the result by checking all files\r
+               if (!file_exists($out)) {\r
+                       $error = true;\r
+               }\r
+               // If error, we try to make thumbs with other method\r
+               if ($error) {\r
+                       if ($method == 'GS') {\r
+                               self::makeShotPNM($in, $out, $page, $prefix, $resolution, $quality, $antialiasing, true, $width, $height);\r
+                       } elseif ($method == 'PNM') {\r
+                               self::makeShotGS($in, $out, $page, $prefix, $resolution, $quality, $antialiasing, $width, $height);\r
+                       }\r
+               }\r
+       }\r
+\r
+       protected function makeShotGS($in, $out, $page, $prefix = '', $resolution = 72, $quality = 90, $antialiasing = 4, $width = null, $height = null) {\r
+\r
+               // Fabrication des thumbanails avec ghostscript\r
+               $gs = new cubeCommandLine('gs', null, true);\r
+               $gs->setPath(CONVERTER_PATH);\r
+               $gs->setEnv('GS_FONTPATH', FONT_PATH);\r
+               $gs->setArg('-dBATCH');\r
+               $gs->setArg('-dNOPAUSE');\r
+               $gs->setArg('-dNOPROMPT');\r
+               // Antialias\r
+               $gs->setArg('-dDOINTERPOLATE');\r
+               $gs->setArg('-dTextAlphaBits=' . $antialiasing);\r
+               $gs->setArg('-dGraphicsAlphaBits=' . $antialiasing);\r
+               // Device\r
+               $gs->setArg('-sDEVICE=jpeg');\r
+               // Dispotion & colors\r
+               // $gs->setArg('-dUseCIEColor');\r
+               $gs->setArg('-dAutoRotatePages=/None');\r
+               $gs->setArg('-dUseCropBox');\r
+               // Resolution & Quality\r
+               $gs->setArg('-r' . round($resolution));\r
+               $gs->setArg('-dJPEGQ=' . $quality);\r
+               // Performances\r
+               $gs->setArg('-dNumRenderingThreads=4');\r
+               // Page range\r
+               $gs->setArg('-dFirstPage=' . $page);\r
+               $gs->setArg('-dLastPage=' . $page);\r
+               // Files\r
+               $gs->setArg('-sOutputFile=' . $out);\r
+\r
+               $gs->setArg(null, $in);\r
+               $gs->execute();\r
+       }\r
+\r
+       protected function makeShotPNM($in, $out, $page, $prefix = '', $resolution = 72, $quality = 90, $antialiasing = 4, $texts = true, $width = null, $height = null) {\r
+               $tmp = cubeFiles::tempnam();\r
+\r
+               $antialiasing = $antialiasing ? 'yes' : 'no';\r
+               $freetype = $texts ? 'yes' : 'no';\r
+               // Exporte les fichiers\r
+               $pdftoppm = new cubeCommandLine('pdftoppm', null, true);\r
+               $pdftoppm->setPath(CONVERTER_PATH);\r
+\r
+               $pdftoppm->setArg('f', $page);\r
+               $pdftoppm->setArg('l', $page);\r
+               $pdftoppm->setArg('-cropbox');\r
+               $pdftoppm->setArg('-freetype ' . $freetype);\r
+               $pdftoppm->setArg('-singlefile');\r
+               $pdftoppm->setArg('-aa ' . $antialiasing);\r
+               $pdftoppm->setArg('-aaVector ' . $antialiasing);\r
+               if (null !== $resolution) {\r
+                       $pdftoppm->setArg('r', $resolution);\r
+               }\r
+               if (null !== $width) {\r
+                       $pdftoppm->setArg('-scale-to-x ' . $width);\r
+               }\r
+               if (null !== $height) {\r
+                       $pdftoppm->setArg('-scale-to-y ' . $height);\r
+               }\r
+               $pdftoppm->setArg(null, $in);\r
+               $pdftoppm->setArg(null, $tmp);\r
+               $pdftoppm->execute();\r
+               $tmp .= '.ppm';\r
+\r
+\r
+               if (file_exists($tmp)) {\r
+                       $cjpeg = new cubeCommandLine('cjpeg', null, true);\r
+                       $cjpeg->setArg('-quality ' . ($quality + 6));\r
+                       $cjpeg->setArg('-outfile ' . $out);\r
+                       $cjpeg->setArg(null, $tmp);\r
+                       $cjpeg->execute();\r
+                       unlink($tmp);\r
+               }\r
+       }\r
+\r
+\r
+}
\ No newline at end of file