From: vincent@cubedesigners.com Date: Mon, 13 Dec 2010 14:52:17 +0000 (+0000) Subject: (no commit message) X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=ef760ab109a81dada7f424b875bee75a1c7ce699;p=cubeextranet.git --- diff --git a/inc/ws/DAO/class.ws.dao.book.php b/inc/ws/DAO/class.ws.dao.book.php index 49b6f5a94..64a2096f1 100644 --- a/inc/ws/DAO/class.ws.dao.book.php +++ b/inc/ws/DAO/class.ws.dao.book.php @@ -161,10 +161,10 @@ class wsDAOBook extends extranetDAO { public function getPagesOfBook($book_id) { $pages = array(); - $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 = $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'); while ($r->fetch()) { $n = explode(',', $r->num); - $pages[$r->book_page] = array('document_id' => $r->document_id, 'document_page' => $r->document_page, 'defaultNum' => $n[$r->document_page-1]); + $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); } return $pages; } @@ -400,8 +400,7 @@ class wsDAOBook extends extranetDAO { { $booleans = array('video_loop', 'video_auto_start', 'video_controls', 'video_sound_on'); $pages = $this->getPagesOfBook($book_id); - $res = array - (); + $res = array(); foreach($pages as $page => $p) { $csv = WS_DOCS . '/' . $p['document_id'] . '/p' . $p['document_page'] . '.csv'; $fp = fopen($csv, 'rb'); @@ -489,45 +488,6 @@ class wsDAOBook extends extranetDAO { $pages = $this->getPagesOfBook($book_id); } - public function compilePDF($book_id) - { - // Assemblage du pdf final - $document = $root . '/data/document.pdf'; - - $documents = array_unique($documents); - if (count($documents) == 1 && !$optimizepdf) { - copy($droot . '/' . $documents[0] . '/original.pdf', $document); - } else { - $liste = array(); - foreach($documents as $doc) { - $liste[] = $droot . '/' . $doc . '/original.pdf'; - } - $l = implode(' ', $liste); - $gs = new cubeCommandLine('gs', null, true); - $gs->setEnv('PATH', self::$path); - $gs->setEnv('GS_FONTPATH', '/home/typo/fonts'); - $gs->setArg('-dBATCH'); - $gs->setArg('-dNOPAUSE'); - $gs->setArg('-dNOPROMPT'); - $gs->setArg('-sOutputFile=' . $document); - $gs->setArg('-sDEVICE=pdfwrite'); - if ($optimizepdf) { - $gs->setArg('-dPDFSETTINGS=/ebook'); - $gs->setArg('-dColorConversionStrategy=/LeaveColorUnchanged'); - $gs->setArg('-dAutoRotatePages=/None'); - } else { - $gs->setArg('-dPDFSETTINGS=/default'); - } - $gs->setArg('f'); - $gs->setManualArg($l); - $gs->execute(); - // Si l'opération a échoué, on se contente de copier le premier fichier - if (!file_exists($document) || filesize($document) < 100 * 1024) { - copy($droot . '/' . $documents[0] . '/doc.pdf', $document); - } - } - } - public function compile($book_id, $version = 3, $complete = false) { if ($version == 3) { @@ -545,6 +505,8 @@ class wsDAOBook extends extranetDAO { */ public function compile3($book_id, $complete) { + set_time_limit(0); + $filesToCopy = array(); $finalDir = WS_BOOKS . '/final/' . $book_id . '/'; $workingDir = WS_BOOKS . '/working/' . $book_id . '/'; @@ -659,17 +621,99 @@ class wsDAOBook extends extranetDAO { } } - if ($book->parametres->pdf) { - // Si l'export PDF est activé, on compile le PDF - $this->compilePDF($book_id); - }else{ - // Sinon, on l'efface si il est présent - } - + $this->compilePDF($book, $pages); $this->touchCompile($book_id); return $res; } + + public function compilePDF($book, $pages) + { + $finalPDF = WS_BOOKS . '/final/' . $book->book_id . '/data/document.pdf'; + + if (!$book->parametres->pdf) { + // Si l'export PDF n'est pas activé on supprime le fichier si il existe + if (file_exists($finalPDF)) { + unlink($finalPDF); + } + return; + } + + $pdfList = array(); + $pagesList = array(); + $nb_pages = array(); + $j = 0; + $k = 0; + foreach($pages as $i => $infos) { + $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']); + } + + $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]; + + if (is_null($currentRange)) { + $currentRange = array('lettre' => $lettre, 'start' => $page, 'end' => $page); + continue; + } + + if ($currentRange['lettre'] == $lettre && $currentRange['end'] + 1 == $page) { + $currentRange['end'] = $page; + continue; + } + + $ranges[] = $currentRange; + $currentRange = null; + } + + 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']) { + copy($doc, $finalPDF); + return; + } + } + + foreach($ranges as $range) { + $args .= ' ' . $range['lettre'] . $range['start']; + if ($range['start'] == $range['end']) { + continue; + } + $args .= '-' . $range['end']; + } + + $args .= ' output ' . $finalPDF; + + $pdftk = new cubeCommandLine('pdftk'); + $pdftk->setPath(CONVERTER_PATH); + $pdftk->setManualArg($args); + $pdftk->execute(); + } } ?> \ No newline at end of file