}\r
\r
public function compilePDF($book, $pages) {\r
- $pdfName = 'document.pdf';\r
+\r
if (isset($book->parametres->pdfName) && $book->parametres->pdfName != '') {\r
$pdfName = $book->parametres->pdfName;\r
}\r
\r
- $finalPDF = WS_BOOKS . '/final/' . $book->book_id . '/data/' . $pdfName;\r
-\r
- if (!$book->parametres->pdf && $book->parametres->mobileVersion != 'pdf') {\r
- // Si l'export PDF n'est pas activé on supprime le fichier si il existe\r
- if (file_exists($finalPDF)) {\r
- unlink($finalPDF);\r
- }\r
- return;\r
+ $cacheDir = WS_BOOKS . '/pdf/' . $book->book_id;\r
+ if (!file_exists($cacheDir)) {\r
+ mkdir($cacheDir);\r
}\r
\r
+ $normalPDF = $cacheDir . '/normal.pdf';\r
+ $compressedPDF = $cacheDir . '/compressed.pdf';\r
+\r
if ($book->parametres->pdfReplace) {\r
$replace = WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfReplace;\r
if (file_exists($replace)) {\r
- if (!file_exists($finalPDF) || filemtime($finalPDF) < filemtime($replace) || filesize($finalPDF) != filesize($replace)) {\r
- $this->copy($replace, $finalPDF);\r
+ if (!file_exists($normalPDF) || filemtime($normalPDF) < filemtime($replace) || filesize($normalPDF) != filesize($replace)) {\r
+ $this->copy($replace, $normalPDF);\r
}\r
- return;\r
}\r
- }\r
+ } else {\r
+ if (file_exists($normalPDF)) {\r
+ $fmtime = filemtime($normalPDF);\r
+ if ($fmtime >= $book->composition_update) {\r
+ $invalid = false;\r
+ foreach ($pages as $i => $infos) {\r
+ $doc = WS_DOCS . '/' . $infos['document_id'] . '/crop.pdf';\r
+ if (filemtime($doc) > $fmtime) {\r
+ $invalid = true;\r
+ }\r
+ }\r
+ }\r
+ } else {\r
+ $invalid = true;\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
- if (file_exists($finalPDF)) {\r
- $fmtime = filemtime($finalPDF);\r
- if ($fmtime >= $book->composition_update) {\r
- $invalid = false;\r
foreach ($pages as $i => $infos) {\r
+ if (!isset($firstDoc)) {\r
+ $firstDoc = $infos['document_id'];\r
+ }\r
+\r
$doc = WS_DOCS . '/' . $infos['document_id'] . '/crop.pdf';\r
- if (filemtime($doc) > $fmtime) {\r
- $invalid = true;\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
- if (!$invalid) {\r
- return;\r
- }\r
- }\r
- }\r
\r
- $pdfList = array();\r
- $pagesList = array();\r
- $nb_pages = array();\r
- $j = 0;\r
- $k = 0;\r
- $original = true;\r
+ if ($original) {\r
+ $this->copy(WS_DOCS . '/' . $firstDoc . '/crop.pdf', $normalPDF);\r
+ } else {\r
+ $args = '';\r
+ foreach ($pdfList as $doc => $index) {\r
+ $lettre = cubeMath::toPDFLetter($index, true);\r
+ $args .= $lettre . '=' . $doc . ' ';\r
+ }\r
\r
- foreach ($pages as $i => $infos) {\r
- if (!isset($firstDoc)) {\r
- $firstDoc = $infos['document_id'];\r
- }\r
+ $args .= ' cat ';\r
\r
- $doc = WS_DOCS . '/' . $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
+ $ranges = array();\r
+ $currentRange = null;\r
\r
- if ($i != $infos['document_page'] || $infos['document_id'] != $firstDoc) {\r
- $original = false;\r
- }\r
- }\r
-\r
- if ($original) {\r
- $this->copy(WS_DOCS . '/' . $firstDoc . '/crop.pdf', $finalPDF);\r
- return;\r
- }\r
+ foreach ($pagesList as $p) {\r
+ $lettre = cubeMath::toPDFLetter($p[0], true);\r
+ $page = $p[1];\r
\r
- $args = '';\r
- foreach ($pdfList as $doc => $index) {\r
- $lettre = cubeMath::toPDFLetter($index, true);\r
- $args .= $lettre . '=' . $doc . ' ';\r
- }\r
+ // Initialise l'intervale\r
+ if (is_null($currentRange)) {\r
+ $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page);\r
+ continue;\r
+ }\r
\r
- $args .= ' cat ';\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
- $ranges = array();\r
- $currentRange = null;\r
+ // Ajoute l'intervale à la liste finale\r
+ $ranges[] = $currentRange;\r
\r
- foreach ($pagesList as $p) {\r
- $lettre = cubeMath::toPDFLetter($p[0], true);\r
- $page = $p[1];\r
+ // Réinitialise l'intervale suivant\r
+ $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page);\r
+ }\r
\r
- // Initialise l'intervale\r
- if (is_null($currentRange)) {\r
- $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page);\r
- continue;\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
+ $this->copy($doc, $normalPDF);\r
+ return;\r
+ }\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
+ 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
- // Ajoute l'intervale à la liste finale\r
- $ranges[] = $currentRange;\r
+ $hash = sha1($args);\r
\r
- // Réinitialise l'intervale suivant\r
- $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page);\r
- }\r
+ $args .= ' output ' . $normalPDF;\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
- $this->copy($doc, $finalPDF);\r
- return;\r
+ $cached = WS_BOOKS . '/pdf/' . $hash . '.pdf';\r
+ if (file_exists($cached)) {\r
+ $this->copy($cached, $normalPDF);\r
+ } else {\r
+ $pdftk = new cubeCommandLine('pdftk');\r
+ $pdftk->setPath(CONVERTER_PATH);\r
+ $pdftk->setManualArg($args);\r
+ $pdftk->execute();\r
+ $this->copy($normalPDF, $cached);\r
+ }\r
+ }\r
}\r
}\r
\r
- foreach ($ranges as $range) {\r
- $args .= ' ' . $range['lettre'] . $range['start'];\r
- if ($range['start'] == $range['end']) {\r
- continue;\r
+ $finalPDF = WS_BOOKS . '/final/' . $book->book_id . '/data/' . $book->parametres->pdfName;\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=96');\r
+ $gs->setArg('-dColorConversionStrategy=/LeaveColorUnchanged');\r
+ $gs->setArg('-dAutoRotatePages=/None');\r
+ $gs->setArg(null, $normalPDF);\r
+ $gs->execute();\r
}\r
- $args .= '-' . $range['end'];\r
- }\r
-\r
- $hash = sha1($args);\r
-\r
- $args .= ' output ' . $finalPDF;\r
-\r
- $cached = WS_BOOKS . '/pdf/' . $hash . '.pdf';\r
- if (file_exists($cached)) {\r
- $this->copy($cached, $finalPDF);\r
+ copy($compressedPDF, $finalPDF);\r
} else {\r
- $pdftk = new cubeCommandLine('pdftk');\r
- $pdftk->setPath(CONVERTER_PATH);\r
- $pdftk->setManualArg($args);\r
- $pdftk->execute();\r
- $this->copy($finalPDF, $cached);\r
+ copy($normalPDF, $finalPDF);\r
}\r
}\r
\r
$this->fields['pdf'] = array('type' => 'boolean', 'default' => true, 'editable' => true, 'label' => __("Activer les fonctions de téléchargement"));\r
$this->fields['pdfName'] = array('type' => 'text', 'default' => 'document.pdf', 'editable' => true, 'label' => __("Nom du fichier PDF"));\r
$this->fields['pdfComplex'] = array('type' => 'boolean', 'default' => false, 'editable' => true, 'label' => __('Téchargement de PDF avancé'), "hint" => __("Permet à l'utilisateur de sélectionner les pages qu'il souhaite télécharger"), 'grade' => 3);\r
+ $this->fields['pdfCompress'] = array('type' => 'boolean', 'default' => false, 'editable' => true, 'label' => __('Compression du fichier PDF'));\r
$this->fields['pdfReplace'] = array('type' => 'freefile', 'default' => '', 'editable' => true,\r
'label' => __('PDF de remplacement'), 'grade' => 3, 'fileFilter' => $pdfFilter);\r
$this->fields['offlineExport'] = array('type' => 'boolean', 'default' => false, 'editable' => true, 'label' => __('Téléchargement des versions offline'), "hint" => __('Valable si le téléchargement avancé est activé'), 'grade' => 3);\r
$this->forms['pdf'] = array('label' => __('Fonction de téléchargement'),\r
- 'fieldsnames' => array('pdf', 'pdfName', 'pdfReplace', 'pdfComplex', 'offlineExport'));\r
+ 'fieldsnames' => array('pdf', 'pdfName', 'pdfReplace','pdfCompress', 'pdfComplex', 'offlineExport'));\r
// .\r
$this->fields['zoomMode'] = array('type' => 'combo', 'default' => '0', 'editable' => true, 'label' => __("Mode de zoom"), 'grade' => 3,\r
'datas' => array(__('Normal') => '0',\r