188 lines
No EOL
5.5 KiB
PHP
188 lines
No EOL
5.5 KiB
PHP
<?php
|
|
namespace App\Services;
|
|
|
|
//use FPDI in myMerge v2
|
|
//use FPDF;
|
|
//use FPDI;
|
|
|
|
class MyPDFMerger
|
|
{
|
|
private $_files; //['form.pdf'] ["1,2,4, 5-19"]
|
|
private $_fpdi;
|
|
|
|
|
|
public function __construct()
|
|
{
|
|
/* if(!class_exists("FPDF")) {
|
|
require_once(__DIR__.'/fpdf/fpdf.php');
|
|
}
|
|
if(!class_exists("FPDI")) {
|
|
require_once(__DIR__.'/fpdi/fpdi.php');
|
|
}*/
|
|
}
|
|
|
|
public function addPDF($filepath, $pages = 'all')
|
|
{
|
|
if (file_exists($filepath)) {
|
|
if (strtolower($pages) != 'all') {
|
|
$pages = $this->_rewritepages($pages);
|
|
}
|
|
|
|
$this->_files[] = array($filepath, $pages);
|
|
} else {
|
|
throw new \exception("Could not locate PDF on '$filepath'");
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
|
|
public function myMerge($outputmode = 'browser', $outputpath = 'newfile.pdf', $theme = false)
|
|
{
|
|
if (!isset($this->_files) || !is_array($this->_files)): throw new \exception("No PDFs to merge."); endif;
|
|
|
|
$fpdi = new \setasign\Fpdi\Fpdi();
|
|
$first = 1;
|
|
|
|
//
|
|
//merger operations
|
|
foreach ($this->_files as $file) {
|
|
$filename = $file[0];
|
|
$filepages = $file[1];
|
|
|
|
|
|
$count = $fpdi->setSourceFile($filename);
|
|
|
|
//add the pages
|
|
if ($filepages == 'all') {
|
|
for ($i = 1; $i <= $count; $i++) {
|
|
$count = $fpdi->setSourceFile($filename);
|
|
$template = $fpdi->importPage($i);
|
|
$size = $fpdi->getTemplateSize($template);
|
|
$orientation = ($size['height'] > $size['width']) ? 'P' : 'L';
|
|
|
|
$fpdi->AddPage($orientation, array($size['width'], $size['height']));
|
|
if($theme){
|
|
$fpdi->setSourceFile('pdf/'.$theme.'-'.$first.'.pdf');
|
|
if($first == 1){
|
|
$first = 2;
|
|
}
|
|
$backId = $fpdi->importPage(1);
|
|
$fpdi->useTemplate($backId);
|
|
|
|
}
|
|
$fpdi->useTemplate($template);
|
|
}
|
|
} else {
|
|
foreach ($filepages as $page) {
|
|
$count = $fpdi->setSourceFile($filename);
|
|
if (!$template = $fpdi->importPage($page)): throw new \exception("Could not load page '$page' in PDF '$filename'. Check that the page exists."); endif;
|
|
$size = $fpdi->getTemplateSize($template);
|
|
$orientation = ($size['h'] > $size['w']) ? 'P' : 'L';
|
|
|
|
$fpdi->AddPage($orientation, array($size['w'], $size['h']));
|
|
if($theme){
|
|
$fpdi->setSourceFile('pdf/'.$theme.'-'.$first.'.pdf');
|
|
if($first == 1){
|
|
$first = 2;
|
|
}
|
|
$backId = $fpdi->importPage(1);
|
|
$fpdi->useTemplate($backId);
|
|
}
|
|
|
|
$fpdi->useTemplate($template);
|
|
}
|
|
}
|
|
//after first file (invoice) on bpaper
|
|
$slug = false;
|
|
}
|
|
|
|
//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
|
|
* @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; endif;
|
|
|
|
//add middle pages
|
|
while ($x <= $y): $newpages[] = (int)$x;
|
|
$x++; endwhile;
|
|
} else {
|
|
$newpages[] = (int)$ind[0];
|
|
}
|
|
}
|
|
|
|
return $newpages;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
$pdf = new PDFMerger;
|
|
|
|
$pdf->addPDF('samplepdfs/one.pdf', '1, 3, 4')
|
|
->addPDF('samplepdfs/two.pdf', '1-2')
|
|
->addPDF('samplepdfs/three.pdf', 'all')
|
|
->merge('file', 'samplepdfs/TEST2.pdf');
|
|
|
|
//REPLACE 'file' WITH 'browser', 'download', 'string', or 'file' for output options
|
|
//You do not need to give a file path for browser, string, or download - just the name.
|
|
*/ |