From: vincent@cubedesigners.com Date: Fri, 20 Jul 2018 14:22:24 +0000 (+0000) Subject: fix #2144 @0.5 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=9972597633bf4c8c28f6e101e2f9bb2952103aa0;p=cubeextranet.git fix #2144 @0.5 --- diff --git a/inc/ws/DAO/class.ws.dao.book.php b/inc/ws/DAO/class.ws.dao.book.php index ab0bb7321..bebf52d16 100644 --- a/inc/ws/DAO/class.ws.dao.book.php +++ b/inc/ws/DAO/class.ws.dao.book.php @@ -1777,180 +1777,11 @@ class wsDAOBook extends commonDAO public function compilePDF($book, $pages) { - if (substr($book->parametres->pdfName, 0, 4) == 'http') { - return; - } - if (isset($book->parametres->pdfName) && $book->parametres->pdfName != '') { - $pdfName = $book->parametres->pdfName; - } - - $cacheDir = WS_BOOKS . '/pdf/' . $book->book_id; - if (!file_exists($cacheDir)) { - mkdir($cacheDir, 0777, true); - } - - $normalPDF = $cacheDir . '/normal.pdf'; - $originalPDF = $cacheDir . '/original.pdf'; - $compressedPDF = $cacheDir . '/compressed.pdf'; - - if (file_exists($originalPDF)) { - $fmtime = filemtime($originalPDF); - if ($fmtime >= $book->composition_update) { - $invalid = false; - foreach ($pages as $i => $infos) { - $doc = wsDocument::getDir($infos['document_id']) . 'crop.pdf'; - if (filemtime($doc) > $fmtime) { - $invalid = true; - } - } - } else { - $invalid = true; - } - } else { - $invalid = true; - } - - - if ($invalid) { - $pdfList = array(); - $pagesList = array(); - $nb_pages = array(); - $j = 0; - $k = 0; - $original = true; - - foreach ($pages as $i => $infos) { - if (!isset($firstDoc)) { - $firstDoc = $infos['document_id']; - } - - $doc = wsDocument::getDir($infos['document_id']) . 'crop.pdf'; - if (!isset($pdfList[$doc])) { - $pdfList[$doc] = $j; - $nb_pages[$doc] = $infos['nb_pages']; - $k = $j; - $j++; - } else { - $k = $pdfList[$doc]; - } - $pagesList[$i] = array($k, $infos['document_page']); - - if ($i != $infos['document_page'] || $infos['document_id'] != $firstDoc) { - $original = false; - } - } - - if ($original) { + $res = wsUtil::compilePDF($book, $pages); - $this->copy(wsDocument::getDir($firstDoc) . 'crop.pdf', $originalPDF); - } else { - $args = ''; - foreach ($pdfList as $doc => $index) { - $lettre = cubeMath::toPDFLetter($index, true); - $args .= $lettre . '=' . $doc . ' '; - } - - $args .= ' cat '; - - $ranges = array(); - $currentRange = null; - - foreach ($pagesList as $p) { - $lettre = cubeMath::toPDFLetter($p[0], true); - $page = $p[1]; - - // Initialise l'intervale - if (is_null($currentRange)) { - $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); - continue; - } - - // Poursuit le remplissage si la lettre est identique et si la page suivante est bien la page suivante dans le document - if ($currentRange['lettre'] == $lettre && $currentRange['end'] + 1 == $page) { - $currentRange['end'] = $page; - continue; - } - - // Ajoute l'intervale à la liste finale - $ranges[] = $currentRange; - - // Réinitialise l'intervale suivant - $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); - } - - // Ajoute la dernière - if (!is_null($currentRange)) { - $ranges[] = $currentRange; - } - // Si le pdf final est constitué du document complet d'un document - if (count($ranges) == 1 && $ranges[0]['start'] == 1) { - $alldocs = array_keys($pdfList); - $doc = array_pop($alldocs); - if ($nb_pages[$doc] == $ranges[0]['end']) { - $this->copy($doc, $originalPDF); - return; - } - } - - foreach ($ranges as $range) { - $args .= ' ' . $range['lettre'] . $range['start']; - if ($range['start'] == $range['end']) { - continue; - } - $args .= '-' . $range['end']; - } - - $hash = sha1($args); - - $args .= ' output ' . $originalPDF; - - $cached = WS_BOOKS . '/pdf/' . $hash . '.pdf'; - - if (file_exists($cached)) { - $this->copy($cached, $originalPDF); - } else { - $pdftk = new cubeCommandLine('pdftk'); - $pdftk->setPath(CONVERTER_PATH); - $pdftk->setManualArg($args); - $pdftk->execute(); - $this->copy($normalPDF, $cached); - } - } - } - - - if ($book->parametres->pdfReplace) { - $replace = WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfReplace; - if (file_exists($replace)) { - if (!file_exists($normalPDF) || filemtime($normalPDF) < filemtime($replace) || filesize($normalPDF) != filesize($replace)) { - $this->copy($replace, $normalPDF); - } - } - } else { - $this->copy($originalPDF, $normalPDF); - } $finalPDF = WS_BOOKS . '/final/' . $book->book_id . '/data/' . $book->parametres->pdfName; - - if ($book->parametres->pdfCompress) { - if (!file_exists($compressedPDF) || filemtime($compressedPDF) < filemtime($normalPDF)) { - $gs = new cubeCommandLine('gs', null, true); - $gs->setPath(CONVERTER_PATH); - $gs->setEnv('GS_FONTPATH', '/home/ws/fonts'); - $gs->setArg('-dBATCH'); - $gs->setArg('-dNOPAUSE'); - $gs->setArg('-dNOPROMPT'); - $gs->setArg('-sOutputFile=' . $compressedPDF); - $gs->setArg('-sDEVICE=pdfwrite'); - $gs->setArg('-dPDFSETTINGS=/ebook'); - $gs->setArg('-dColorImageResolution=72'); - $gs->setArg('-dAutoRotatePages=/None'); - $gs->setArg('-dColorConversionStrategy=/LeaveColorUnchanged'); - $gs->setArg(null, $normalPDF); - $gs->execute(); - } - copy($compressedPDF, $finalPDF); - } else { - copy($normalPDF, $finalPDF); + if ($res) { + $this->copy($res, $finalPDF); } } diff --git a/inc/ws/Util/class.ws.util.php b/inc/ws/Util/class.ws.util.php index 6bcfb94a5..0e7a694e4 100644 --- a/inc/ws/Util/class.ws.util.php +++ b/inc/ws/Util/class.ws.util.php @@ -118,4 +118,201 @@ class wsUtil return $references; } + + /** + * @param $book wsBook + */ + public static function compilePDF($book, $pages = null) + { + global $core; + + if (null === $pages) { + $dao = new wsDAOBook($core->con); + $pages = $dao->getPagesOfBook($book->book_id); + } + + if (substr($book->parametres->pdfName, 0, 4) == 'http') { + return false; + } + + $cacheDir = WS_BOOKS . '/pdf/' . $book->book_id; + if (!file_exists($cacheDir)) { + mkdir($cacheDir, 0777, true); + } + + $normalPDF = $cacheDir . '/normal.pdf'; + $originalPDF = $cacheDir . '/original.pdf'; + $compressedPDF = $cacheDir . '/compressed.pdf'; + + $files = [$normalPDF, $originalPDF, $compressedPDF]; + + foreach ($files as $file) { + if (file_exists($file) && filesize($file) == 0) { + unlink($file); + } + } + + if (file_exists($originalPDF)) { + $fmtime = filemtime($originalPDF); + if ($fmtime >= $book->composition_update) { + $invalid = false; + foreach ($pages as $i => $infos) { + $doc = wsDocument::getDir($infos['document_id']) . 'crop.pdf'; + if (filemtime($doc) > $fmtime) { + $invalid = true; + } + } + } else { + $invalid = true; + } + } else { + $invalid = true; + } + + + if ($invalid) { + $pdfList = array(); + $pagesList = array(); + $nb_pages = array(); + $j = 0; + $k = 0; + $original = true; + + foreach ($pages as $i => $infos) { + if (!isset($firstDoc)) { + $firstDoc = $infos['document_id']; + } + + $doc = wsDocument::getDir($infos['document_id']) . 'crop.pdf'; + if (!isset($pdfList[$doc])) { + $pdfList[$doc] = $j; + $nb_pages[$doc] = $infos['nb_pages']; + $k = $j; + $j++; + } else { + $k = $pdfList[$doc]; + } + $pagesList[$i] = array($k, $infos['document_page']); + + if ($i != $infos['document_page'] || $infos['document_id'] != $firstDoc) { + $original = false; + } + } + + if ($original) { + self::copy(wsDocument::getDir($firstDoc) . 'crop.pdf', $originalPDF); + } else { + $args = ''; + foreach ($pdfList as $doc => $index) { + $lettre = cubeMath::toPDFLetter($index, true); + $args .= $lettre . '=' . $doc . ' '; + } + + $args .= ' cat '; + + $ranges = array(); + $currentRange = null; + + foreach ($pagesList as $p) { + $lettre = cubeMath::toPDFLetter($p[0], true); + $page = $p[1]; + + // Initialise l'intervale + if (is_null($currentRange)) { + $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); + continue; + } + + // Poursuit le remplissage si la lettre est identique et si la page suivante est bien la page suivante dans le document + if ($currentRange['lettre'] == $lettre && $currentRange['end'] + 1 == $page) { + $currentRange['end'] = $page; + continue; + } + + // Ajoute l'intervale à la liste finale + $ranges[] = $currentRange; + + // Réinitialise l'intervale suivant + $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); + } + + // Ajoute la dernière + if (!is_null($currentRange)) { + $ranges[] = $currentRange; + } + // Si le pdf final est constitué du document complet d'un document + if (count($ranges) == 1 && $ranges[0]['start'] == 1) { + $alldocs = array_keys($pdfList); + $doc = array_pop($alldocs); + if ($nb_pages[$doc] == $ranges[0]['end']) { + self::copy($doc, $originalPDF); + return; + } + } + + foreach ($ranges as $range) { + $args .= ' ' . $range['lettre'] . $range['start']; + if ($range['start'] == $range['end']) { + continue; + } + $args .= '-' . $range['end']; + } + + $hash = sha1($args); + + $args .= ' output ' . $originalPDF; + + $cached = WS_BOOKS . '/pdf/' . $hash . '.pdf'; + + if (file_exists($cached) && filesize($cached) > 0) { + self::copy($cached, $originalPDF); + } else { + $pdftk = new cubeCommandLine('pdftk'); + $pdftk->setPath(CONVERTER_PATH); + $pdftk->setManualArg($args); + $pdftk->execute(); + self::copy($normalPDF, $cached); + } + } + } + + + if ($book->parametres->pdfReplace) { + $replace = WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfReplace; + if (file_exists($replace) && filesize($replace) > 0) { + if (!file_exists($normalPDF) || filemtime($normalPDF) < filemtime($replace) || filesize($normalPDF) != filesize($replace)) { + self::copy($replace, $normalPDF); + } + } + } else { + self::copy($originalPDF, $normalPDF); + } + + if ($book->parametres->pdfCompress) { + if (!file_exists($compressedPDF) || filemtime($compressedPDF) < filemtime($normalPDF)) { + $gs = new cubeCommandLine('gs', null, true); + $gs->setPath(CONVERTER_PATH); + $gs->setEnv('GS_FONTPATH', '/home/ws/fonts'); + $gs->setArg('-dBATCH'); + $gs->setArg('-dNOPAUSE'); + $gs->setArg('-dNOPROMPT'); + $gs->setArg('-sOutputFile=' . $compressedPDF); + $gs->setArg('-sDEVICE=pdfwrite'); + $gs->setArg('-dPDFSETTINGS=/ebook'); + $gs->setArg('-dColorImageResolution=72'); + $gs->setArg('-dAutoRotatePages=/None'); + $gs->setArg('-dColorConversionStrategy=/LeaveColorUnchanged'); + $gs->setArg(null, $normalPDF); + $gs->execute(); + } + return $compressedPDF; + } + return $normalPDF; + } + + public static function copy($source, $dest) + { + copy($source, $dest); + touch($dest, filemtime($source)); + } } \ No newline at end of file diff --git a/inc/ws/Util/html5/master/class.ws.html5.compiler.php b/inc/ws/Util/html5/master/class.ws.html5.compiler.php index ed57b637d..b901bc57e 100644 --- a/inc/ws/Util/html5/master/class.ws.html5.compiler.php +++ b/inc/ws/Util/html5/master/class.ws.html5.compiler.php @@ -633,14 +633,14 @@ class wsHTML5Compiler if ($page == 1) { $seo->writePage($html, $this->vdir, 'index.html'); } - } + } protected function writeIndex() { foreach ($this->pages as $page => $infos) { $this->_writeIndex($page); } - } + } protected function writeWidget() { @@ -723,12 +723,14 @@ class wsHTML5Compiler protected function writePrint() { - if (!$this->book->parametres->print && !$this->book->parametres->pdf) { return; } - $this->vdir->copy(WS_BOOKS . '/final/' . $this->book->book_id . '/data/' . $this->book->parametres->pdfName, 'data/' . $this->book->parametres->pdfName); + $res = wsUtil::compilePDF($this->book, $this->pages); + if ($res !== false) { + $this->vdir->copy($res, 'data/' . $this->book->parametres->pdfName); + } return ''; }