\r
class wsUtil\r
{\r
- public static function excelToArray($excelFile, $assoc = false)\r
- {\r
- $worksheets = array();\r
-\r
- if ($assoc) {\r
- $cacheBase = WS_CACHE . '/xlsx2assocarray/';\r
- } else {\r
- $cacheBase = WS_CACHE . '/xlsx2array/';\r
- }\r
- if (!file_exists($cacheBase)) {\r
- mkdir($cacheBase, 0777, true);\r
- }\r
-\r
- if (CubeIT_Util_Url::isDistant($excelFile)) {\r
- $tmp = CubeIT_Files::tempnam();\r
- copy($excelFile, $tmp);\r
-\r
- $hash = hash_file('sha256', $tmp);\r
- $dest = $cacheBase . $hash . '.xlsx';\r
-\r
- if (!file_exists($dest)) {\r
- copy($tmp, $dest);\r
- }\r
- $excelFile = $dest;\r
- }\r
- if (!file_exists($excelFile)) {\r
- return array();\r
- }\r
-\r
- $cacheFile = $cacheBase . sha1($excelFile . '/' . filemtime($excelFile));\r
-\r
- if (file_exists($cacheFile) && !$assoc) {\r
- $worksheets = json_decode(file_get_contents($cacheFile), true);\r
- } else {\r
- set_time_limit(0);\r
- include_once ROOT . '/inc/ZendFramework/PHPExcel/PHPExcel.php';\r
- $objReader = PHPExcel_IOFactory::createReader('Excel2007');\r
- $objPHPExcel = $objReader->load($excelFile);\r
-\r
- foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {\r
- if ($worksheet->getSheetState() != PHPExcel_Worksheet::SHEETSTATE_VISIBLE) {\r
- continue;\r
- }\r
- $title = $worksheet->getTitle();\r
- if (strlen($title) == 2 && cubeCountry::getCountry($title)) {\r
- $title = cubeCountry::getCountry($title);\r
- }\r
-\r
- if ($assoc) {\r
- $worksheets[$title] = self::_assocSheet($worksheet->toArray(null, true, true));\r
- } else {\r
- $worksheets[$title] = $worksheet->toArray(null, true, true);\r
- }\r
- }\r
- file_put_contents($cacheFile, json_encode($worksheets));\r
- }\r
-\r
- return $worksheets;\r
- }\r
-\r
- protected static function _assocSheet($s)\r
- {\r
- $res = [];\r
- $colslabels = [];\r
- foreach ($s[0] as $j => $collabel) {\r
- if (trim($collabel) == '') {\r
- continue;\r
- }\r
- $colslabels[$j] = $collabel;\r
- }\r
- for ($i = 1; $i < count($s); $i++) {\r
- $r = [];\r
- foreach ($colslabels as $j => $collabel) {\r
- $r[$collabel] = $s[$i][$j];\r
- }\r
- $res[] = $r;\r
- }\r
-\r
- return $res;\r
- }\r
-\r
-\r
- public static function atlanticReferences($references, $dir, $log = null, $copy = 'copy')\r
- {\r
- if (!file_exists($dir)) {\r
- mkdir($dir, 0777, true);\r
- }\r
- foreach ($references as $i => $sheet) {\r
- foreach ($sheet as $j => $line) {\r
- foreach ($line as $k => $v) {\r
- if (preg_match('|^http:\/\/atlantic-international-book-com\.com\/files\/(.*)$|', $v, $matches)) {\r
- $local = $dir . '/' . $matches[1];\r
- $ldir = dirname($local);\r
- if (!file_exists($ldir)) {\r
- mkdir($ldir, 0777, true);\r
- }\r
- $url = str_replace(' ', '%20', $v);\r
- $cache = WS_CACHE . '/atlantic/' . md5($url);\r
- if (!file_exists($cache) || filemtime($url) > filemtime($cache)) {\r
- copy($url, $cache);\r
- $copylog = ' (copy) ';\r
- } else {\r
- $copylog = ' ';\r
- }\r
- call_user_func($copy, $cache, $dir . '/' . $matches[1]);\r
- $references[$i][$j][$k] = 'local/' . $matches[1];\r
- if (null !== $log) {\r
- call_user_func($log, 'Done' . $copylog . $matches[1]);\r
- }\r
- }\r
- }\r
- }\r
- }\r
-\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 (file_exists($doc) && 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
+ public static function excelToArray($excelFile, $assoc = false)\r
+ {\r
+ $worksheets = array();\r
+\r
+ if ($assoc) {\r
+ $cacheBase = WS_CACHE . '/xlsx2assocarray/';\r
+ } else {\r
+ $cacheBase = WS_CACHE . '/xlsx2array/';\r
+ }\r
+ if (!file_exists($cacheBase)) {\r
+ mkdir($cacheBase, 0777, true);\r
+ }\r
+\r
+ if (CubeIT_Util_Url::isDistant($excelFile)) {\r
+ $tmp = CubeIT_Files::tempnam();\r
+ copy($excelFile, $tmp);\r
+\r
+ $hash = hash_file('sha256', $tmp);\r
+ $dest = $cacheBase . $hash . '.xlsx';\r
+\r
+ if (!file_exists($dest)) {\r
+ copy($tmp, $dest);\r
+ }\r
+ $excelFile = $dest;\r
+ }\r
+ if (!file_exists($excelFile)) {\r
+ return array();\r
+ }\r
+\r
+ $cacheFile = $cacheBase . sha1($excelFile . '/' . filemtime($excelFile));\r
+\r
+ if (file_exists($cacheFile) && !$assoc) {\r
+ $worksheets = json_decode(file_get_contents($cacheFile), true);\r
+ } else {\r
+ set_time_limit(0);\r
+ include_once ROOT . '/inc/ZendFramework/PHPExcel/PHPExcel.php';\r
+ $objReader = PHPExcel_IOFactory::createReader('Excel2007');\r
+ $objPHPExcel = $objReader->load($excelFile);\r
+\r
+ foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {\r
+ if ($worksheet->getSheetState() != PHPExcel_Worksheet::SHEETSTATE_VISIBLE) {\r
+ continue;\r
+ }\r
+ $title = $worksheet->getTitle();\r
+ if (strlen($title) == 2 && cubeCountry::getCountry($title)) {\r
+ $title = cubeCountry::getCountry($title);\r
+ }\r
+\r
+ if ($assoc) {\r
+ $worksheets[$title] = self::_assocSheet($worksheet->toArray(null, true, true));\r
+ } else {\r
+ $worksheets[$title] = $worksheet->toArray(null, true, true);\r
+ }\r
+ }\r
+ file_put_contents($cacheFile, json_encode($worksheets));\r
+ }\r
+\r
+ return $worksheets;\r
+ }\r
+\r
+ public static function excelToArrayKeyVal($excelFile)\r
+ {\r
+ $worksheets = self::excelToArray($excelFile);\r
+ $res = [];\r
+ foreach ($worksheets as $worksheet) {\r
+ foreach ($worksheet as $line) {\r
+ $res[trim($line[0])] = trim($line[1]);\r
+ }\r
+ break;\r
+ }\r
+ return $res;\r
+ }\r
+\r
+ protected static function _assocSheet($s)\r
+ {\r
+ $res = [];\r
+ $colslabels = [];\r
+ foreach ($s[0] as $j => $collabel) {\r
+ if (trim($collabel) == '') {\r
+ continue;\r
+ }\r
+ $colslabels[$j] = $collabel;\r
+ }\r
+ for ($i = 1; $i < count($s); $i++) {\r
+ $r = [];\r
+ foreach ($colslabels as $j => $collabel) {\r
+ $r[$collabel] = $s[$i][$j];\r
+ }\r
+ $res[] = $r;\r
+ }\r
+\r
+ return $res;\r
+ }\r
+\r
+\r
+ public static function atlanticReferences($references, $dir, $log = null, $copy = 'copy')\r
+ {\r
+ if (!file_exists($dir)) {\r
+ mkdir($dir, 0777, true);\r
+ }\r
+ foreach ($references as $i => $sheet) {\r
+ foreach ($sheet as $j => $line) {\r
+ foreach ($line as $k => $v) {\r
+ if (preg_match('|^http:\/\/atlantic-international-book-com\.com\/files\/(.*)$|', $v, $matches)) {\r
+ $local = $dir . '/' . $matches[1];\r
+ $ldir = dirname($local);\r
+ if (!file_exists($ldir)) {\r
+ mkdir($ldir, 0777, true);\r
+ }\r
+ $url = str_replace(' ', '%20', $v);\r
+ $cache = WS_CACHE . '/atlantic/' . md5($url);\r
+ if (!file_exists($cache) || filemtime($url) > filemtime($cache)) {\r
+ copy($url, $cache);\r
+ $copylog = ' (copy) ';\r
+ } else {\r
+ $copylog = ' ';\r
+ }\r
+ call_user_func($copy, $cache, $dir . '/' . $matches[1]);\r
+ $references[$i][$j][$k] = 'local/' . $matches[1];\r
+ if (null !== $log) {\r
+ call_user_func($log, 'Done' . $copylog . $matches[1]);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+\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 (file_exists($doc) && 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