]> _ Git - cubeextranet.git/commitdiff
(no commit message)
authorvincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Mon, 13 Dec 2010 14:52:17 +0000 (14:52 +0000)
committervincent@cubedesigners.com <vincent@cubedesigners.com@f5622870-0f3c-0410-866d-9cb505b7a8ef>
Mon, 13 Dec 2010 14:52:17 +0000 (14:52 +0000)
inc/ws/DAO/class.ws.dao.book.php

index 49b6f5a94f600def919bb412ed2c06d00632f17b..64a2096f10c04b8ac76b288e867e7e37d7dd50b5 100644 (file)
@@ -161,10 +161,10 @@ class wsDAOBook extends extranetDAO {
        public function getPagesOfBook($book_id)\r
        {\r
                $pages = array();\r
-               $r = $this->con->select('SELECT b.*,d.numberSections AS num FROM book_pages b LEFT JOIN documents d ON d.document_id=b.document_id WHERE b.book_id=\'' . $this->con->escape($book_id) . '\' ORDER BY book_page');\r
+               $r = $this->con->select('SELECT b.*,d.numberSections AS num,d.pages AS doc_pages FROM book_pages b LEFT JOIN documents d ON d.document_id=b.document_id WHERE b.book_id=\'' . $this->con->escape($book_id) . '\' ORDER BY book_page');\r
                while ($r->fetch()) {\r
                        $n = explode(',', $r->num);\r
-                       $pages[$r->book_page] = array('document_id' => $r->document_id, 'document_page' => $r->document_page, 'defaultNum' => $n[$r->document_page-1]);\r
+                       $pages[$r->book_page] = array('document_id' => $r->document_id, 'document_page' => $r->document_page, 'defaultNum' => $n[$r->document_page-1], 'nb_pages' => $r->doc_pages);\r
                }\r
                return $pages;\r
        }\r
@@ -400,8 +400,7 @@ class wsDAOBook extends extranetDAO {
        {\r
                $booleans = array('video_loop', 'video_auto_start', 'video_controls', 'video_sound_on');\r
                $pages = $this->getPagesOfBook($book_id);\r
-               $res = array\r
-               ();\r
+               $res = array();\r
                foreach($pages as $page => $p) {\r
                        $csv = WS_DOCS . '/' . $p['document_id'] . '/p' . $p['document_page'] . '.csv';\r
                        $fp = fopen($csv, 'rb');\r
@@ -489,45 +488,6 @@ class wsDAOBook extends extranetDAO {
                $pages = $this->getPagesOfBook($book_id);\r
        }\r
 \r
-       public function compilePDF($book_id)\r
-       {\r
-               // Assemblage du pdf final\r
-               $document = $root . '/data/document.pdf';\r
-\r
-               $documents = array_unique($documents);\r
-               if (count($documents) == 1 && !$optimizepdf) {\r
-                       copy($droot . '/' . $documents[0] . '/original.pdf', $document);\r
-               } else {\r
-                       $liste = array();\r
-                       foreach($documents as $doc) {\r
-                               $liste[] = $droot . '/' . $doc . '/original.pdf';\r
-                       }\r
-                       $l = implode(' ', $liste);\r
-                       $gs = new cubeCommandLine('gs', null, true);\r
-                       $gs->setEnv('PATH', self::$path);\r
-                       $gs->setEnv('GS_FONTPATH', '/home/typo/fonts');\r
-                       $gs->setArg('-dBATCH');\r
-                       $gs->setArg('-dNOPAUSE');\r
-                       $gs->setArg('-dNOPROMPT');\r
-                       $gs->setArg('-sOutputFile=' . $document);\r
-                       $gs->setArg('-sDEVICE=pdfwrite');\r
-                       if ($optimizepdf) {\r
-                               $gs->setArg('-dPDFSETTINGS=/ebook');\r
-                               $gs->setArg('-dColorConversionStrategy=/LeaveColorUnchanged');\r
-                               $gs->setArg('-dAutoRotatePages=/None');\r
-                       } else {\r
-                               $gs->setArg('-dPDFSETTINGS=/default');\r
-                       }\r
-                       $gs->setArg('f');\r
-                       $gs->setManualArg($l);\r
-                       $gs->execute();\r
-                       // Si l'opération a échoué, on se contente de copier le premier fichier\r
-                       if (!file_exists($document) || filesize($document) < 100 * 1024) {\r
-                               copy($droot . '/' . $documents[0] . '/doc.pdf', $document);\r
-                       }\r
-               }\r
-       }\r
-\r
        public function compile($book_id, $version = 3, $complete = false)\r
        {\r
                if ($version == 3) {\r
@@ -545,6 +505,8 @@ class wsDAOBook extends extranetDAO {
         */\r
        public function compile3($book_id, $complete)\r
        {\r
+               set_time_limit(0);\r
+\r
                $filesToCopy = array();\r
                $finalDir = WS_BOOKS . '/final/' . $book_id . '/';\r
                $workingDir = WS_BOOKS . '/working/' . $book_id . '/';\r
@@ -659,17 +621,99 @@ class wsDAOBook extends extranetDAO {
                        }\r
                }\r
 \r
-               if ($book->parametres->pdf) {\r
-                       // Si l'export PDF est activé, on compile le PDF\r
-                       $this->compilePDF($book_id);\r
-               }else{\r
-                       // Sinon, on l'efface si il est présent\r
-               }\r
-\r
+               $this->compilePDF($book, $pages);\r
                $this->touchCompile($book_id);\r
 \r
                return $res;\r
        }\r
+\r
+       public function compilePDF($book, $pages)\r
+       {\r
+               $finalPDF = WS_BOOKS . '/final/' . $book->book_id . '/data/document.pdf';\r
+\r
+               if (!$book->parametres->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
+               }\r
+\r
+               $pdfList = array();\r
+               $pagesList = array();\r
+               $nb_pages = array();\r
+               $j = 0;\r
+               $k = 0;\r
+               foreach($pages as $i => $infos) {\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
+               }\r
+\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
+                       if (is_null($currentRange)) {\r
+                               $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page);\r
+                               continue;\r
+                       }\r
+\r
+                       if ($currentRange['lettre'] == $lettre && $currentRange['end'] + 1 == $page) {\r
+                               $currentRange['end'] = $page;\r
+                               continue;\r
+                       }\r
+\r
+                       $ranges[] = $currentRange;\r
+                       $currentRange = null;\r
+               }\r
+\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
+                               copy($doc, $finalPDF);\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
+               $args .= ' output ' . $finalPDF;\r
+\r
+               $pdftk = new cubeCommandLine('pdftk');\r
+               $pdftk->setPath(CONVERTER_PATH);\r
+               $pdftk->setManualArg($args);\r
+               $pdftk->execute();\r
+       }\r
 }\r
 \r
 ?>
\ No newline at end of file