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
{\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
$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
*/\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
}\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