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);
}
}
\r
return $references;\r
}\r
+\r
+ /**\r
+ * @param $book wsBook\r
+ */\r
+ public static function compilePDF($book, $pages = null)\r
+ {\r
+ global $core;\r
+\r
+ if (null === $pages) {\r
+ $dao = new wsDAOBook($core->con);\r
+ $pages = $dao->getPagesOfBook($book->book_id);\r
+ }\r
+\r
+ if (substr($book->parametres->pdfName, 0, 4) == 'http') {\r
+ return false;\r
+ }\r
+\r
+ $cacheDir = WS_BOOKS . '/pdf/' . $book->book_id;\r
+ if (!file_exists($cacheDir)) {\r
+ mkdir($cacheDir, 0777, true);\r
+ }\r
+\r
+ $normalPDF = $cacheDir . '/normal.pdf';\r
+ $originalPDF = $cacheDir . '/original.pdf';\r
+ $compressedPDF = $cacheDir . '/compressed.pdf';\r
+\r
+ $files = [$normalPDF, $originalPDF, $compressedPDF];\r
+\r
+ foreach ($files as $file) {\r
+ if (file_exists($file) && filesize($file) == 0) {\r
+ unlink($file);\r
+ }\r
+ }\r
+\r
+ if (file_exists($originalPDF)) {\r
+ $fmtime = filemtime($originalPDF);\r
+ if ($fmtime >= $book->composition_update) {\r
+ $invalid = false;\r
+ foreach ($pages as $i => $infos) {\r
+ $doc = wsDocument::getDir($infos['document_id']) . 'crop.pdf';\r
+ if (filemtime($doc) > $fmtime) {\r
+ $invalid = true;\r
+ }\r
+ }\r
+ } else {\r
+ $invalid = true;\r
+ }\r
+ } else {\r
+ $invalid = true;\r
+ }\r
+\r
+\r
+ if ($invalid) {\r
+ $pdfList = array();\r
+ $pagesList = array();\r
+ $nb_pages = array();\r
+ $j = 0;\r
+ $k = 0;\r
+ $original = true;\r
+\r
+ foreach ($pages as $i => $infos) {\r
+ if (!isset($firstDoc)) {\r
+ $firstDoc = $infos['document_id'];\r
+ }\r
+\r
+ $doc = wsDocument::getDir($infos['document_id']) . 'crop.pdf';\r
+ if (!isset($pdfList[$doc])) {\r
+ $pdfList[$doc] = $j;\r
+ $nb_pages[$doc] = $infos['nb_pages'];\r
+ $k = $j;\r
+ $j++;\r
+ } else {\r
+ $k = $pdfList[$doc];\r
+ }\r
+ $pagesList[$i] = array($k, $infos['document_page']);\r
+\r
+ if ($i != $infos['document_page'] || $infos['document_id'] != $firstDoc) {\r
+ $original = false;\r
+ }\r
+ }\r
+\r
+ if ($original) {\r
+ self::copy(wsDocument::getDir($firstDoc) . 'crop.pdf', $originalPDF);\r
+ } else {\r
+ $args = '';\r
+ foreach ($pdfList as $doc => $index) {\r
+ $lettre = cubeMath::toPDFLetter($index, true);\r
+ $args .= $lettre . '=' . $doc . ' ';\r
+ }\r
+\r
+ $args .= ' cat ';\r
+\r
+ $ranges = array();\r
+ $currentRange = null;\r
+\r
+ foreach ($pagesList as $p) {\r
+ $lettre = cubeMath::toPDFLetter($p[0], true);\r
+ $page = $p[1];\r
+\r
+ // Initialise l'intervale\r
+ if (is_null($currentRange)) {\r
+ $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page);\r
+ continue;\r
+ }\r
+\r
+ // Poursuit le remplissage si la lettre est identique et si la page suivante est bien la page suivante dans le document\r
+ if ($currentRange['lettre'] == $lettre && $currentRange['end'] + 1 == $page) {\r
+ $currentRange['end'] = $page;\r
+ continue;\r
+ }\r
+\r
+ // Ajoute l'intervale à la liste finale\r
+ $ranges[] = $currentRange;\r
+\r
+ // Réinitialise l'intervale suivant\r
+ $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page);\r
+ }\r
+\r
+ // Ajoute la dernière\r
+ if (!is_null($currentRange)) {\r
+ $ranges[] = $currentRange;\r
+ }\r
+ // Si le pdf final est constitué du document complet d'un document\r
+ if (count($ranges) == 1 && $ranges[0]['start'] == 1) {\r
+ $alldocs = array_keys($pdfList);\r
+ $doc = array_pop($alldocs);\r
+ if ($nb_pages[$doc] == $ranges[0]['end']) {\r
+ self::copy($doc, $originalPDF);\r
+ return;\r
+ }\r
+ }\r
+\r
+ foreach ($ranges as $range) {\r
+ $args .= ' ' . $range['lettre'] . $range['start'];\r
+ if ($range['start'] == $range['end']) {\r
+ continue;\r
+ }\r
+ $args .= '-' . $range['end'];\r
+ }\r
+\r
+ $hash = sha1($args);\r
+\r
+ $args .= ' output ' . $originalPDF;\r
+\r
+ $cached = WS_BOOKS . '/pdf/' . $hash . '.pdf';\r
+\r
+ if (file_exists($cached) && filesize($cached) > 0) {\r
+ self::copy($cached, $originalPDF);\r
+ } else {\r
+ $pdftk = new cubeCommandLine('pdftk');\r
+ $pdftk->setPath(CONVERTER_PATH);\r
+ $pdftk->setManualArg($args);\r
+ $pdftk->execute();\r
+ self::copy($normalPDF, $cached);\r
+ }\r
+ }\r
+ }\r
+\r
+\r
+ if ($book->parametres->pdfReplace) {\r
+ $replace = WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfReplace;\r
+ if (file_exists($replace) && filesize($replace) > 0) {\r
+ if (!file_exists($normalPDF) || filemtime($normalPDF) < filemtime($replace) || filesize($normalPDF) != filesize($replace)) {\r
+ self::copy($replace, $normalPDF);\r
+ }\r
+ }\r
+ } else {\r
+ self::copy($originalPDF, $normalPDF);\r
+ }\r
+\r
+ if ($book->parametres->pdfCompress) {\r
+ if (!file_exists($compressedPDF) || filemtime($compressedPDF) < filemtime($normalPDF)) {\r
+ $gs = new cubeCommandLine('gs', null, true);\r
+ $gs->setPath(CONVERTER_PATH);\r
+ $gs->setEnv('GS_FONTPATH', '/home/ws/fonts');\r
+ $gs->setArg('-dBATCH');\r
+ $gs->setArg('-dNOPAUSE');\r
+ $gs->setArg('-dNOPROMPT');\r
+ $gs->setArg('-sOutputFile=' . $compressedPDF);\r
+ $gs->setArg('-sDEVICE=pdfwrite');\r
+ $gs->setArg('-dPDFSETTINGS=/ebook');\r
+ $gs->setArg('-dColorImageResolution=72');\r
+ $gs->setArg('-dAutoRotatePages=/None');\r
+ $gs->setArg('-dColorConversionStrategy=/LeaveColorUnchanged');\r
+ $gs->setArg(null, $normalPDF);\r
+ $gs->execute();\r
+ }\r
+ return $compressedPDF;\r
+ }\r
+ return $normalPDF;\r
+ }\r
+\r
+ public static function copy($source, $dest)\r
+ {\r
+ copy($source, $dest);\r
+ touch($dest, filemtime($source));\r
+ }\r
}
\ No newline at end of file
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()
{
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 '';
}