From 31ed16db5a3a82850a97fa5efe6c9e2467379829 Mon Sep 17 00:00:00 2001 From: "vincent@cubedesigners.com" Date: Thu, 17 Nov 2016 15:12:57 +0000 Subject: [PATCH] done #741 @3 --- inc/ws/Controlleur/class.ws.services.php | 20 ++++ inc/ws/DAO/class.ws.dao.book.php | 32 +++++- inc/ws/Metier/class.ws.book.parametres.php | 5 +- inc/ws/Util/_common.php | 1 + inc/ws/Util/class.ws.pdf.convert.php | 122 +++++++++++++++++++++ 5 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 inc/ws/Util/class.ws.pdf.convert.php diff --git a/inc/ws/Controlleur/class.ws.services.php b/inc/ws/Controlleur/class.ws.services.php index f8b3a3a4c..e164017fd 100644 --- a/inc/ws/Controlleur/class.ws.services.php +++ b/inc/ws/Controlleur/class.ws.services.php @@ -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)) { diff --git a/inc/ws/DAO/class.ws.dao.book.php b/inc/ws/DAO/class.ws.dao.book.php index d275cbd04..723bbb882 100644 --- a/inc/ws/DAO/class.ws.dao.book.php +++ b/inc/ws/DAO/class.ws.dao.book.php @@ -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) { diff --git a/inc/ws/Metier/class.ws.book.parametres.php b/inc/ws/Metier/class.ws.book.parametres.php index 7fadfc4d9..fde55e1ed 100644 --- a/inc/ws/Metier/class.ws.book.parametres.php +++ b/inc/ws/Metier/class.ws.book.parametres.php @@ -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')); // . // diff --git a/inc/ws/Util/_common.php b/inc/ws/Util/_common.php index 847f42242..52079bc31 100644 --- a/inc/ws/Util/_common.php +++ b/inc/ws/Util/_common.php @@ -18,4 +18,5 @@ $__autoload['wsPDFFont'] = dirname(__FILE__) . '/fontextractor/class.ws.pdf.font $__autoload['wsSVN'] = dirname(__FILE__) . '/class.ws.svn.php'; $__autoload['wsLinks'] = dirname(__FILE__) . '/class.ws.links.php'; $__autoload['wsExporter'] = dirname(__FILE__) . '/class.ws.exporter.php'; +$__autoload['wsPDFConvert'] = dirname(__FILE__) . '/class.ws.pdf.convert.php'; ?> \ 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 index 000000000..49e9f5bbb --- /dev/null +++ b/inc/ws/Util/class.ws.pdf.convert.php @@ -0,0 +1,122 @@ +setPath(CONVERTER_PATH); + $gs->setEnv('GS_FONTPATH', FONT_PATH); + $gs->setArg('-dBATCH'); + $gs->setArg('-dNOPAUSE'); + $gs->setArg('-dNOPROMPT'); + // Antialias + $gs->setArg('-dDOINTERPOLATE'); + $gs->setArg('-dTextAlphaBits=' . $antialiasing); + $gs->setArg('-dGraphicsAlphaBits=' . $antialiasing); + // Device + $gs->setArg('-sDEVICE=jpeg'); + // Dispotion & colors + // $gs->setArg('-dUseCIEColor'); + $gs->setArg('-dAutoRotatePages=/None'); + $gs->setArg('-dUseCropBox'); + // Resolution & Quality + $gs->setArg('-r' . round($resolution)); + $gs->setArg('-dJPEGQ=' . $quality); + // Performances + $gs->setArg('-dNumRenderingThreads=4'); + // Page range + $gs->setArg('-dFirstPage=' . $page); + $gs->setArg('-dLastPage=' . $page); + // Files + $gs->setArg('-sOutputFile=' . $out); + + $gs->setArg(null, $in); + $gs->execute(); + } + + protected function makeShotPNM($in, $out, $page, $prefix = '', $resolution = 72, $quality = 90, $antialiasing = 4, $texts = true, $width = null, $height = null) { + $tmp = cubeFiles::tempnam(); + + $antialiasing = $antialiasing ? 'yes' : 'no'; + $freetype = $texts ? 'yes' : 'no'; + // Exporte les fichiers + $pdftoppm = new cubeCommandLine('pdftoppm', null, true); + $pdftoppm->setPath(CONVERTER_PATH); + + $pdftoppm->setArg('f', $page); + $pdftoppm->setArg('l', $page); + $pdftoppm->setArg('-cropbox'); + $pdftoppm->setArg('-freetype ' . $freetype); + $pdftoppm->setArg('-singlefile'); + $pdftoppm->setArg('-aa ' . $antialiasing); + $pdftoppm->setArg('-aaVector ' . $antialiasing); + if (null !== $resolution) { + $pdftoppm->setArg('r', $resolution); + } + if (null !== $width) { + $pdftoppm->setArg('-scale-to-x ' . $width); + } + if (null !== $height) { + $pdftoppm->setArg('-scale-to-y ' . $height); + } + $pdftoppm->setArg(null, $in); + $pdftoppm->setArg(null, $tmp); + $pdftoppm->execute(); + $tmp .= '.ppm'; + + + if (file_exists($tmp)) { + $cjpeg = new cubeCommandLine('cjpeg', null, true); + $cjpeg->setArg('-quality ' . ($quality + 6)); + $cjpeg->setArg('-outfile ' . $out); + $cjpeg->setArg(null, $tmp); + $cjpeg->execute(); + unlink($tmp); + } + } + + +} \ No newline at end of file -- 2.39.5