![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/app/code/Chronopost/Chronorelais/Lib/PDFMerger/ |
<?php /** * PDFMerger created by Jarrod Nettles December 2009 * [email protected] * * v1.0 * * Class for easily merging PDFs (or specific pages of PDFs) together into one. Output to a file, browser, download, or return as a string. * Unfortunately, this class does not preserve many of the enhancements your original PDF might contain. It treats * your PDF page as an image and then concatenates them all together. * * Note that your PDFs are merged in the order that you provide them using the addPDF function, same as the pages. * If you put pages 12-14 before 1-5 then 12-15 will be placed first in the output. * * * Uses FPDI 1.3.1 from Setasign * Uses FPDF 1.6 by Olivier Plathey with FPDF_TPL extension 1.1.3 by Setasign * * Both of these packages are free and open source software, bundled with this class for ease of use. * They are not modified in any way. PDFMerger has all the limitations of the FPDI package - essentially, it cannot import dynamic content * such as form fields, links or page annotations (anything not a part of the page content stream). * */ namespace Chronopost\Chronorelais\Lib\PDFMerger; use Chronopost\Chronorelais\Lib\Fpdi\PdfParser\CrossReference\CrossReferenceException; use Chronopost\Chronorelais\Lib\Fpdi\PdfParser\Filter\FilterException; use Chronopost\Chronorelais\Lib\Fpdi\PdfParser\PdfParserException; use Chronopost\Chronorelais\Lib\Fpdi\PdfParser\Type\PdfTypeException; use Chronopost\Chronorelais\Lib\Fpdi\PdfReader\PdfReaderException; use \Exception; use Chronopost\Chronorelais\Lib\Fpdi\Fpdi; class PDFMerger { private $_files; private $_fpdi; public function __construct( Fpdi $fpdi ) { $this->_files = []; $this->_fpdi = $fpdi; } /** * Add a PDF for inclusion in the merge with a valid file path. Pages should be formatted: 1,3,6, 12-16. * @param $filepath * @param string $pages * @param null $orientation * @return PDFMerger * @throws Exception */ public function addPDF($filepath, $pages = 'all', $orientation = null) { if (file_exists($filepath)) { if (strtolower($pages) != 'all') { $pages = $this->_rewritepages($pages); } $this->_files[] = array($filepath, $pages, $orientation); } else { throw new Exception("Could not locate PDF on '$filepath'"); } return $this; } /** * Merges your provided PDFs and outputs to specified location. * @param string $outputmode * @param string $outputpath * @param string $orientation * @return PDF * @throws CrossReferenceException * @throws FilterException * @throws PdfParserException * @throws PdfTypeException * @throws PdfReaderException */ public function merge($outputmode = 'browser', $outputpath = 'newfile.pdf', $orientation = 'P') { if (!isset($this->_files) || !is_array($this->_files)) { throw new Exception("No PDFs to merge."); } $fpdi = new Fpdi(); // merger operations foreach ($this->_files as $file) { $filename = $file[0]; $filepages = $file[1]; $fileorientation = (!is_null($file[2])) ? $file[2] : $orientation; $count = $fpdi->setSourceFile($filename); //add the pages if ($filepages == 'all') { for ($i=1; $i<=$count; $i++) { $template = $fpdi->importPage($i); $size = $fpdi->getTemplateSize($template); $fpdi->AddPage($fileorientation, array($size['width'], $size['height'])); $fpdi->useTemplate($template); } } else { foreach ($filepages as $page) { if (!$template = $fpdi->importPage($page)) { throw new Exception("Could not load page '$page' in PDF '$filename'. Check that the page exists."); } $size = $fpdi->getTemplateSize($template); $fpdi->AddPage($fileorientation, array($size['w'], $size['h'])); $fpdi->useTemplate($template); } } } //output operations $mode = $this->_switchmode($outputmode); if ($mode == 'S') { return $fpdi->Output($outputpath, 'S'); } else { if ($fpdi->Output($outputpath, $mode) == '') { return true; } else { throw new Exception("Error outputting PDF to '$outputmode'."); return false; } } } /** * FPDI uses single characters for specifying the output location. Change our more descriptive string into proper format. * @param $mode * @return Character */ private function _switchmode($mode) { switch(strtolower($mode)) { case 'download': return 'D'; break; case 'browser': return 'I'; break; case 'file': return 'F'; break; case 'string': return 'S'; break; default: return 'I'; break; } } /** * Takes our provided pages in the form of 1,3,4,16-50 and creates an array of all pages * @param $pages * @return array|bool * @throws Exception */ private function _rewritepages($pages) { $pages = str_replace(' ', '', $pages); $part = explode(',', $pages); //parse hyphens foreach ($part as $i) { $ind = explode('-', $i); if (count($ind) == 2) { $x = $ind[0]; //start page $y = $ind[1]; //end page if ($x > $y) { throw new Exception("Starting page, '$x' is greater than ending page '$y'."); return false; } //add middle pages while ($x <= $y) { $newpages[] = (int) $x; $x++; } } else { $newpages[] = (int) $ind[0]; } } return $newpages; } /** * Reset files PDF */ public function flush() { $this->_files = []; } }