\r
private $_basicInfos = null;\r
private $_advancedInfos = null;\r
+ private $_links = array();\r
\r
- public function copyOriginal($tmp_file)\r
+ const NORMAL = 0;\r
+ const FLATTEN = 1;\r
+ const POLY2BITMAP = 2;\r
+ const BITMAP = 3;\r
+ const BARBARE = 4;\r
+\r
+ public function init()\r
{\r
$this->out = ROOT . '/docs/' . $this->document_id . '/';\r
$this->log = $this->out . 'log.txt';\r
mkdir($this->out, 0755, true);\r
}\r
$this->log_pointer = fopen($this->log, 'a');\r
+ }\r
+\r
+ public function copyOriginal($tmp_file)\r
+ {\r
move_uploaded_file($tmp_file, $this->in);\r
}\r
\r
{\r
if (is_null($this->_basicInfos)) {\r
$pdfinfo = new cubeCommandLine('pdfinfo', null, false);\r
+ $pdfinfo->setPath(CONVERTER_PATH);\r
$pdfinfo->setArg('-box');\r
$pdfinfo->setArg('f', 1);\r
$pdfinfo->setArg('l', 10000);\r
{\r
if (is_null($this->_advancedInfos)) {\r
$pdftk = new cubeCommandLine('pdftk', null, true);\r
+ $pdftk->setPath(CONVERTER_PATH);\r
$pdftk->setArg(null, $this->in);\r
$pdftk->setArg(null, 'dump_data');\r
$pdftk->execute();\r
$this->getTexts($page);\r
$this->makeMiniShot($page);\r
$this->makeRealShot($page);\r
- $out = $this->makeSWFFiles($page);\r
- $this->extractLinks($page,$out,$multiply);\r
+ $this->makeSWFFiles($page);\r
}\r
\r
public function processAllPages()\r
public function getTexts($page = null)\r
{\r
$pdftotext = new cubeCommandLine('pdftotext', null, true);\r
+ $pdftotext->setPath(CONVERTER_PATH);\r
$pdftotext->setArg('q');\r
if (is_null($page)) {\r
$pdftotext->setArg('f', 1);\r
// resolution 72 make 1pt=1px\r
$height = $this->generalInfos['size'][1];\r
$ratio = $height / $h;\r
- $this->makeShot($prefix, round(72 / $ratio, 2), $quality, $antialiasing, $method);\r
+ $this->makeShot($page, $prefix, round(72 / $ratio, 2), $quality, $antialiasing, $method);\r
}\r
\r
public function makeShot($page = null, $prefix = '', $resolution = 72, $quality = 90, $antialiasing = 4, $method = 'GS')\r
}\r
}\r
\r
- protected function makeShotGS($page = null, $prefix = null, $resolution = 72, $quality = 90, $antialiasing = 4)\r
+ protected function makeShotGS($page = null, $prefix = '', $resolution = 72, $quality = 90, $antialiasing = 4)\r
{\r
// Fabrication des thumbanails avec ghostscript\r
$gs = new cubeCommandLine('gs', null, true);\r
- // $gs->setEnv('GS_FONTPATH', '/home/typo/fonts');\r
+ $gs->setPath(CONVERTER_PATH);\r
+ $gs->setEnv('GS_FONTPATH', FONT_PATH);\r
$gs->setArg('-dBATCH');\r
$gs->setArg('-dNOPAUSE');\r
$gs->setArg('-dNOPROMPT');\r
$resolution = round($resolution);\r
// Exporte les fichiers\r
$pdftoppm = new cubeCommandLine('pdftoppm', null, true);\r
+ $pdftoppm->setPath(CONVERTER_PATH);\r
if (is_null($page)) {\r
$pdftoppm->setArg('f', 1);\r
$pdftoppm->setArg('l', 10000);\r
break;\r
}\r
$pnmtojpeg = new cubeCommandLine('pnmtojpeg', $jpegfile, false);\r
+ $pnmtojpeg->setPath(CONVERTER_PATH);\r
$pnmtojpeg->setArg('-quality=' . $quality);\r
$pnmtojpeg->setArg('-density=' . $resolution . 'x' . $resolution . 'dpi');\r
$pnmtojpeg->setManualArg($ppmfile);\r
}\r
}\r
\r
- public function makeSWFFiles($page = null, $resolution = 150, $quality = 90, $storeAllChars = true, $maxObjects = 1800, $method = 'normal')\r
+ public function makeSWFFiles($page = null, $resolution = 150, $quality = 90, $storeAllChars = true, $maxObjects = 1800, $method = 0, &$muliply = 1)\r
{\r
if ($maxObjects <= 1) {\r
- $method = 'poly2bitmap';\r
+ $method = self::POLY2BITMAP;\r
}\r
\r
- $out = $this->pdf2swf($page, $resolution, $quality, $storeAllChars, $method);\r
- // Analyse de la sortie pour détecter des typos manquantes\r
- $overflow = false;\r
- $overflowObjects = false;\r
- $written = false;\r
- $missing_fonts = array();\r
- $fp = fopen($out, 'rb');\r
- while ($line = fgets($fp)) {\r
- if (preg_match('|Try putting a TTF version of that font \(named \"([A-Z-_0-9.]*)\"\)|Uui', trim($line), $matches)) {\r
- $missing_fonts[] = $matches[1];\r
- } elseif (stristr($line, 'ID Table overflow')) {\r
- $overflow = true;\r
- } elseif (stristr($line, 'NOTICE SWF written')) {\r
- $written = true;\r
- } elseif (stristr($line, 'NOTICE Writing SWF file')) {\r
+ $out = $this->pdf2swf($page, $resolution, $quality, $storeAllChars, $method, $multiply);\r
+ if ($method < self::BARBARE) {\r
+ // Analyse de la sortie pour détecter des typos manquantes\r
+ $overflow = false;\r
+ $overflowObjects = false;\r
+ $written = false;\r
+ $missing_fonts = array();\r
+ if (file_exists($out['outputfile'])) {\r
+ $fp = fopen($out['outputfile'], 'rb');\r
+ while ($line = fgets($fp)) {\r
+ if (preg_match('|Try putting a TTF version of that font \(named \"([A-Z-_0-9.]*)\"\)|Uui', trim($line), $matches)) {\r
+ $missing_fonts[] = $matches[1];\r
+ } elseif (stristr($line, 'ID Table overflow')) {\r
+ $overflow = true;\r
+ } elseif (stristr($line, 'NOTICE SWF written')) {\r
+ $written = true;\r
+ } elseif (stristr($line, 'NOTICE Writing SWF file')) {\r
+ $written = true;\r
+ }\r
+ }\r
+ }\r
+ if (!is_null($page) && file_exists($this->out . 'p' . $page . '.swf')) {\r
$written = true;\r
}\r
- }\r
- // On teste si le fichier est écrit et qu'il a été généré par le premier niveau\r
- if ($method == 'flatten' && $written) {\r
- $swfstrings = new cubeCommandLine($this->swftools . '/swfdump', null, true);\r
- $swfstrings->setArg('t');\r
- $swfstrings->setArg(null, $this->out . '/temp.swf');\r
- $swfstrings->execute();\r
-\r
- str_replace('[01a]', '', $swfstrings->output, $nbObjects);\r
- if ($nbObjects > $maxObjects) {\r
- $overflowObjects = true;\r
+ if ($written && $method < self::BITMAP && !isset($this->_links[$page])) {\r
+ file_put_contents(ROOT . '/test.txt', print_r($out, true));\r
+ $this->_links[$page] = $this->extractLinks($page, $out['outputfile'], $out['multiply']);\r
+ }\r
+ // On teste si le fichier est écrit et qu'il a été généré par le premier niveau\r
+ if ($method < self::POLY2BITMAP && $written) {\r
+ $overflowObjects = $this->checkObjectsNumber($this->out . 'p' . $page . '.swf', $maxObjects);\r
+ }\r
+\r
+ if (!$written || $overflow || $overflowObjects) {\r
+ return $this->makeSWFFiles($page, $resolution, $quality, $storeAllChars, $maxObjects, $method + 1, $multiply);\r
}\r
}\r
- // On traite les erreurs\r
- if (!$written && !$overflow) {\r
- // Si le fichier n'a pas été généré et que il était en plus n'était pas en overflow,\r
- // on tente directement la méthode de barbare\r
- $out = $this->pdf2swf($page, $resolution, $quality, false, 'barbare');\r
- } elseif ($overflow || $overflowObjects) {\r
- // Si le nombre d'objets max ou définis par l'utilisateur est trop important\r
- // On écrase les graphismes.\r
- $out = $this->pdf2swf($page, $resolution, $quality, $storeAllChars, 'poly2bitmap');\r
- }\r
+\r
return $out;\r
}\r
\r
- protected function pdf2swf($page = null, $resolution = 150, $quality = 90, $storeAllChars = true, $method = 'normal')\r
+ protected function checkObjectsNumber($file, $maxObjects)\r
+ {\r
+ $swfdump = new cubeCommandLine('swfdump', null, true);\r
+ $swfdump->setPath(CONVERTER_PATH);\r
+ $swfdump->setArg('t');\r
+ $swfdump->setArg(null, $file);\r
+ $swfdump->execute();\r
+ $this->addToLog($swfdump);\r
+\r
+ str_replace('[01a]', '', $swfdump->output, $nbObjects);\r
+ if ($nbObjects > $maxObjects) {\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+ protected function pdf2swf($page = null, $resolution = 150, $quality = 90, $storeAllChars = true, $method = 0)\r
{\r
/*\r
-h , --help Print short help message and exit\r
disablelinks Disable links.\r
*/\r
\r
- if ($method != 'barbare') {\r
+ if (!is_null($page) && file_exists($this->out . 'p' . $page . '.swf')) {\r
+ unlink($this->out . 'p' . $page . '.swf');\r
+ }\r
+\r
+ if ($method < self::BARBARE) {\r
$resolution2multiply = array(72 => 2, 100 => 2, 150 => 3, 200 => 3, 300 => 3, 450 => 4, 600 => 5);\r
\r
$pdf2swf = new cubeCommandLine('pdf2swf', null, true);\r
+ $pdf2swf->setPath(CONVERTER_PATH);\r
if (!is_null($page)) {\r
$pdf2swf->setArg('p', $page);\r
}\r
- if ($method == 'normal') {\r
+ if ($method == self::NORMAL) {\r
// Default\r
- $multiply=1;\r
- } elseif ($method == 'flatten') {\r
+ $multiply = 1;\r
+ } elseif ($method == self::FLATTEN) {\r
$pdf2swf->setArg('flatten');\r
- $multiply=1;\r
- } elseif ($method == 'poly2bitmap') {\r
+ $multiply = 1;\r
+ } elseif ($method == self::POLY2BITMAP) {\r
// Raster graphics, keep texts\r
$pdf2swf->setArg('poly2bitmap');\r
$multiply = $resolution2multiply[$resolution];\r
$pdf2swf->setArg('multiply', $multiply);\r
- } elseif ($method == 'bitmap') {\r
+ } elseif ($method == self::BITMAP) {\r
// Raster all\r
$pdf2swf->setArg('bitmap');\r
$multiply = $resolution2multiply[$resolution];\r
$pdf2swf->execute();\r
\r
$this->addToLog($pdf2swf, true);\r
- return $pdf2swf->outputfile;\r
+ return array('outputfile' => $pdf2swf->outputfile, 'multiply' => $multiply, 'object' => $pdf2swf);\r
} else {\r
- return $this->pdf2swfBarbare($page, $resolution, $quality);\r
+ return array('outputfile' => $this->pdf2swfBarbare($page, $resolution, $quality), 'multiply' => 1);\r
}\r
}\r
\r
protected function makeAS3($swffile)\r
{\r
$swfcombine = new cubeCommandLine('swfcombine');\r
- $swfcombine->setEnv('PATH', self::$path);\r
+ $swfcombine->setPath(CONVERTER_PATH);\r
$swfcombine->setArg('merge');\r
$swfcombine->setArg('stack1');\r
$swfcombine->setArg('z');\r
protected function pdf2swfBarbare($page = null, $resolution = 150, $quality = 85)\r
{\r
// Fabrique les images\r
- $this->makeShot($page, 'barbare', $resolution, $quality, 'PNM');\r
+ $this->makeShot($page, 'barbare', $resolution, $quality, 4, 'PNM');\r
// A partir des images, on crée les swf\r
if (is_null($page)) {\r
$startpage = 1;\r
\r
for($i = $startpage;$i <= $endpage;$i++) {\r
$jpeg2swf = new cubeCommandLine('jpeg2swf');\r
+ $jpeg2swf->setPath(CONVERTER_PATH);\r
$jpeg2swf->setArg('q', $quality);\r
$jpeg2swf->setArg('o', $this->out . 'p' . $i . '.swf');\r
$jpeg2swf->setArg('f');\r
\r
public function addToLog($cl, $output = true)\r
{\r
- $c = '--- Exécuté en ' . $cl->execTime . " s\n" . $cl->commande . "\n\n";\r
- if ($output) {\r
- $c .= $cl->output . "\n\n";\r
+ if ($cl instanceof cubeCommandLine) {\r
+ $c = '--- Exécuté en ' . $cl->execTime . " s\n" . $cl->commande . "\n\n";\r
+ if ($output) {\r
+ $c .= $cl->output . "\n\n";\r
+ }\r
+ } elseif (is_string($cl)) {\r
+ $c = $cl;\r
}\r
fwrite($this->log_pointer, $c);\r
}\r
\r
- public function extractLinks($page, $logfile, $multiply = 1)\r
+ public function extractLinks($page, $outputfile, $multiply = 1)\r
{\r
/*\r
DEBUG drawlink\r
TRACE drawlink s=http://www.ladocumentationfrancaise.fr/\r
*/\r
\r
- $fp = fopen($logfile, 'rb');\r
+ $fp = fopen($outputfile, 'rb');\r
$log = 'BEGIN extracting link' . "\n";\r
$link = null;\r
while ($line = fgets($fp)) {\r
$line = trim($line);\r
if (preg_match('|TRACE drawlink(( [-0-9\./]+)+)|', $line, $matches)) {\r
$log .= 'FOUND a link' . "\n";\r
- $link = new fwsLink($multiply);\r
+ $link = new wsLink($multiply);\r
$log .= 'SETTING POINTS ' . $matches[1] . "\n";\r
$points = explode(' ', trim($matches[1]));\r
foreach($points as $point) {\r
}\r
}\r
$log .= 'END OF EXTRACTING' . "\n";\r
+ $this->addToLog($log);\r
fclose($fp);\r
\r
return $log;\r
\r
public function __destruct()\r
{\r
- if (isset($this->log_pointer)) {\r
+ if (isset($this->log_pointer) && is_resource($this->log_pointer)) {\r
fclose($this->log_pointer);\r
}\r
}\r