From 0aef3f5f8e55d0cc265b37fa27c559cbf2832f72 Mon Sep 17 00:00:00 2001 From: "vincent@cubedesigners.com" Date: Tue, 8 Jan 2013 13:27:47 +0000 Subject: [PATCH] --- inc/ws/Controlleur/class.ws.maintenance.php | 5 +- inc/ws/DAO/class.ws.dao.book.php | 239 +++++++++++--------- inc/ws/Metier/class.ws.book.parametres.php | 3 +- 3 files changed, 133 insertions(+), 114 deletions(-) diff --git a/inc/ws/Controlleur/class.ws.maintenance.php b/inc/ws/Controlleur/class.ws.maintenance.php index c09769bd5..820c89a50 100644 --- a/inc/ws/Controlleur/class.ws.maintenance.php +++ b/inc/ws/Controlleur/class.ws.maintenance.php @@ -745,15 +745,12 @@ class wsMaintenance { $svn->setArg('r', file_get_contents(WS_COMPILE_ASSETS . '/_html5/PROD')); $svn->setArg(null, WS_COMPILE_ASSETS . '/_html5prod'); $svn->execute(); - - fb($svn->commande); - fb($svn->output); } public static function cleanDownload($args) { $root = ROOT . '/cache/download/'; cubeFiles::scanRecursiveDir($root, $files); - $limit = TIME - 7200; + $limit = TIME - 14400; foreach ($files as $f) { if (filemtime($f) < $limit) { unlink($f); diff --git a/inc/ws/DAO/class.ws.dao.book.php b/inc/ws/DAO/class.ws.dao.book.php index 16092c228..4dba61203 100644 --- a/inc/ws/DAO/class.ws.dao.book.php +++ b/inc/ws/DAO/class.ws.dao.book.php @@ -1345,149 +1345,170 @@ class wsDAOBook extends commonDAO { } public function compilePDF($book, $pages) { - $pdfName = 'document.pdf'; + if (isset($book->parametres->pdfName) && $book->parametres->pdfName != '') { $pdfName = $book->parametres->pdfName; } - $finalPDF = WS_BOOKS . '/final/' . $book->book_id . '/data/' . $pdfName; - - if (!$book->parametres->pdf && $book->parametres->mobileVersion != 'pdf') { - // Si l'export PDF n'est pas activé on supprime le fichier si il existe - if (file_exists($finalPDF)) { - unlink($finalPDF); - } - return; + $cacheDir = WS_BOOKS . '/pdf/' . $book->book_id; + if (!file_exists($cacheDir)) { + mkdir($cacheDir); } + $normalPDF = $cacheDir . '/normal.pdf'; + $compressedPDF = $cacheDir . '/compressed.pdf'; + if ($book->parametres->pdfReplace) { $replace = WS_BOOKS . '/working/' . $book->book_id . '/' . $book->parametres->pdfReplace; if (file_exists($replace)) { - if (!file_exists($finalPDF) || filemtime($finalPDF) < filemtime($replace) || filesize($finalPDF) != filesize($replace)) { - $this->copy($replace, $finalPDF); + if (!file_exists($normalPDF) || filemtime($normalPDF) < filemtime($replace) || filesize($normalPDF) != filesize($replace)) { + $this->copy($replace, $normalPDF); } - return; } - } + } else { + if (file_exists($normalPDF)) { + $fmtime = filemtime($normalPDF); + if ($fmtime >= $book->composition_update) { + $invalid = false; + foreach ($pages as $i => $infos) { + $doc = WS_DOCS . '/' . $infos['document_id'] . '/crop.pdf'; + if (filemtime($doc) > $fmtime) { + $invalid = true; + } + } + } + } else { + $invalid = true; + } + + if ($invalid) { + $pdfList = array(); + $pagesList = array(); + $nb_pages = array(); + $j = 0; + $k = 0; + $original = true; - if (file_exists($finalPDF)) { - $fmtime = filemtime($finalPDF); - if ($fmtime >= $book->composition_update) { - $invalid = false; foreach ($pages as $i => $infos) { + if (!isset($firstDoc)) { + $firstDoc = $infos['document_id']; + } + $doc = WS_DOCS . '/' . $infos['document_id'] . '/crop.pdf'; - if (filemtime($doc) > $fmtime) { - $invalid = true; + 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 (!$invalid) { - return; - } - } - } - $pdfList = array(); - $pagesList = array(); - $nb_pages = array(); - $j = 0; - $k = 0; - $original = true; + if ($original) { + $this->copy(WS_DOCS . '/' . $firstDoc . '/crop.pdf', $normalPDF); + } else { + $args = ''; + foreach ($pdfList as $doc => $index) { + $lettre = cubeMath::toPDFLetter($index, true); + $args .= $lettre . '=' . $doc . ' '; + } - foreach ($pages as $i => $infos) { - if (!isset($firstDoc)) { - $firstDoc = $infos['document_id']; - } + $args .= ' cat '; - $doc = WS_DOCS . '/' . $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']); + $ranges = array(); + $currentRange = null; - if ($i != $infos['document_page'] || $infos['document_id'] != $firstDoc) { - $original = false; - } - } - - if ($original) { - $this->copy(WS_DOCS . '/' . $firstDoc . '/crop.pdf', $finalPDF); - return; - } + foreach ($pagesList as $p) { + $lettre = cubeMath::toPDFLetter($p[0], true); + $page = $p[1]; - $args = ''; - foreach ($pdfList as $doc => $index) { - $lettre = cubeMath::toPDFLetter($index, true); - $args .= $lettre . '=' . $doc . ' '; - } + // Initialise l'intervale + if (is_null($currentRange)) { + $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); + continue; + } - $args .= ' cat '; + // 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; + } - $ranges = array(); - $currentRange = null; + // Ajoute l'intervale à la liste finale + $ranges[] = $currentRange; - foreach ($pagesList as $p) { - $lettre = cubeMath::toPDFLetter($p[0], true); - $page = $p[1]; + // Réinitialise l'intervale suivant + $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); + } - // Initialise l'intervale - if (is_null($currentRange)) { - $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); - continue; - } + // 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, $normalPDF); + return; + } + } - // 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; - } + foreach ($ranges as $range) { + $args .= ' ' . $range['lettre'] . $range['start']; + if ($range['start'] == $range['end']) { + continue; + } + $args .= '-' . $range['end']; + } - // Ajoute l'intervale à la liste finale - $ranges[] = $currentRange; + $hash = sha1($args); - // Réinitialise l'intervale suivant - $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); - } + $args .= ' output ' . $normalPDF; - // 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, $finalPDF); - return; + $cached = WS_BOOKS . '/pdf/' . $hash . '.pdf'; + if (file_exists($cached)) { + $this->copy($cached, $normalPDF); + } else { + $pdftk = new cubeCommandLine('pdftk'); + $pdftk->setPath(CONVERTER_PATH); + $pdftk->setManualArg($args); + $pdftk->execute(); + $this->copy($normalPDF, $cached); + } + } } } - foreach ($ranges as $range) { - $args .= ' ' . $range['lettre'] . $range['start']; - if ($range['start'] == $range['end']) { - continue; + $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=96'); + $gs->setArg('-dColorConversionStrategy=/LeaveColorUnchanged'); + $gs->setArg('-dAutoRotatePages=/None'); + $gs->setArg(null, $normalPDF); + $gs->execute(); } - $args .= '-' . $range['end']; - } - - $hash = sha1($args); - - $args .= ' output ' . $finalPDF; - - $cached = WS_BOOKS . '/pdf/' . $hash . '.pdf'; - if (file_exists($cached)) { - $this->copy($cached, $finalPDF); + copy($compressedPDF, $finalPDF); } else { - $pdftk = new cubeCommandLine('pdftk'); - $pdftk->setPath(CONVERTER_PATH); - $pdftk->setManualArg($args); - $pdftk->execute(); - $this->copy($finalPDF, $cached); + copy($normalPDF, $finalPDF); } } diff --git a/inc/ws/Metier/class.ws.book.parametres.php b/inc/ws/Metier/class.ws.book.parametres.php index b2908402c..f1c50082e 100644 --- a/inc/ws/Metier/class.ws.book.parametres.php +++ b/inc/ws/Metier/class.ws.book.parametres.php @@ -152,11 +152,12 @@ class wsBookParametres extends wsParametres { $this->fields['pdf'] = array('type' => 'boolean', 'default' => true, 'editable' => true, 'label' => __("Activer les fonctions de téléchargement")); $this->fields['pdfName'] = array('type' => 'text', 'default' => 'document.pdf', 'editable' => true, 'label' => __("Nom du fichier PDF")); $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); + $this->fields['pdfCompress'] = array('type' => 'boolean', 'default' => false, 'editable' => true, 'label' => __('Compression du fichier PDF')); $this->fields['pdfReplace'] = array('type' => 'freefile', 'default' => '', 'editable' => true, 'label' => __('PDF de remplacement'), 'grade' => 3, 'fileFilter' => $pdfFilter); $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); $this->forms['pdf'] = array('label' => __('Fonction de téléchargement'), - 'fieldsnames' => array('pdf', 'pdfName', 'pdfReplace', 'pdfComplex', 'offlineExport')); + 'fieldsnames' => array('pdf', 'pdfName', 'pdfReplace','pdfCompress', 'pdfComplex', 'offlineExport')); // . $this->fields['zoomMode'] = array('type' => 'combo', 'default' => '0', 'editable' => true, 'label' => __("Mode de zoom"), 'grade' => 3, 'datas' => array(__('Normal') => '0', -- 2.39.5