]> _ Git - cubeextranet.git/commitdiff
fix #2144 @0.5
authorvincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Fri, 20 Jul 2018 14:22:24 +0000 (14:22 +0000)
committervincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Fri, 20 Jul 2018 14:22:24 +0000 (14:22 +0000)
inc/ws/DAO/class.ws.dao.book.php
inc/ws/Util/class.ws.util.php
inc/ws/Util/html5/master/class.ws.html5.compiler.php

index ab0bb732108072f7718c615e29702013dc8eb513..bebf52d16ce6e2e4fc5727745f220ad6a19c05c5 100644 (file)
@@ -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);
                }
        }
 
index 6bcfb94a5bf15692c8e34a7703302cd20eafa1cc..0e7a694e4e5be8a95152ab56982b42df196cb278 100644 (file)
@@ -118,4 +118,201 @@ class wsUtil
 \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
index ed57b637d0cddea6b1d0a78c036c0223dc33c8fb..b901bc57ea66d0c379bdc3ecaa040e0b12f83a90 100644 (file)
@@ -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 '';
        }