使用 MPDF 将两个 PDF 文件合并为一个文件
Merge two PDF files into single one using MPDF
我正在使用 MPDF 库生成 pdf 文件。我在我的根目录中创建了两个 PDF 文件,如下所示:
$invoice_nos = ['0'=>'ISE-00000014Y18','1'=>'ISE-00000005Y18'];
foreach ($invoice_nos as $key => $invoice_no) {
$html = 'Invoice No - '.$invoice_no;
$pdf_file_name = $invoice_no.'.pdf';
$pdf_file_path = ROOT . '/app/webroot/Service_Invoices/'. DS .$pdf_file_name ;
ob_start();
$mpdf = new \mPDF('utf-8', 'A4' ,'','',5,5,36,10,5,4);
$mpdf->WriteHTML($html,2);
ob_clean();
$mpdf->Output($pdf_file_name,'f');
}
现在我想将这两个文件合并成一个不同页面的文件。我怎样才能做到这一点?我搜索了很多它的例子,但没有任何效果。
mPDF 不是合并 PDF 文件的最佳工具。 GhostScript:
你会过得更好
gs -dBATCH -dSAFER -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=combined.pdf invoice1.pdf invoice2.pdf
或者,将两张发票直接生成到一个文件中:
$invoice_nos = ['0' => 'ISE-00000014Y18', '1' => 'ISE-00000005Y18'];
$mpdf = new \mPDF('utf-8', 'A4', '', '', 5, 5, 36, 10, 5, 4);
foreach ($invoice_nos as $key => $invoice_no) {
$html = 'Invoice No - ' . $invoice_no;
$mpdf->WriteHTML($html, 2);
$mpdf->WriteHTML('<pagebreak>');
}
$pdf_file_name = $invoice_no . 'invoices.pdf';
$mpdf->Output($pdf_file_name, 'f');
你好所以我实际上使用这段代码来拼合具有可编辑表单的 PDF,但我相信我们可以更改它以将 pdf 合并在一起。
此解决方案使用 php 的 Imagick(),它应该是您的托管环境的一部分。
这是代码,我已尽力对其进行评论。您将调用 mergePdf() 并放置目标文件夹(您的文件所在的位置以及您将保存新文件的位置)和要合并的文件数组(只是名称),然后是一个新文件名。一旦完成,它会将新文件保存在目标文件夹中。
/**
* mergePdf()
*
* @param mixed $destinationPath
* @param array $files
* @param mixed $newFileName
* @return
*/
public function mergePdf($destinationPath, $files, $newFileName){
//Create array to hold images
$array_images = array();
//Loop through to be merged
foreach($files as $file){
//Firstly we check to see if the file is a PDF
if(mime_content_type($destinationPath.$file)=='application/pdf'){
// Strip document extension
$file_name = pathinfo($file, PATHINFO_FILENAME);
// Convert this document
// Each page to single image
$im = new imagick();
//Keep good resolution
$im->setResolution(175, 175);
$im->readImage($destinationPath.$file);
$im->setImageFormat('png');
$im->writeImages($destinationPath.$file_name.'.png',false);
//loop through pages and add them to array
for($i = 0; $i < $im->getNumberImages(); $i++){
//insert images into array
array_push($array_images, $destinationPath.$file_name.'-'.$i.'.png');
}
//Clear im object
$im->clear();
$im->destroy();
}else{
return false;
}
}
//Now that the array of images is created we will create the PDF
if(!empty($array_images)){
//Create new PDF document
$pdf = new Imagick($array_images);
$pdf->setImageFormat('pdf');
if($pdf->writeImages($destinationPath.$newFileName, true)){
$pdf->clear();
$pdf->destroy();
//delete images
foreach($array_images as $image){
unlink($image);
}
return true;
}else{
return false;
}
}else{
return false;
}
}
public function getMergePdf(){
$destinationPath = "/your/destination/to/the/file/goes/here/";
//put the files in the order you want them to be merged
$files = array('file1.pdf','file2.pdf','file3.pdf');
$this->mergePdf($destinationPath, $files, "NewPdf.pdf");
}
我正在使用 MPDF 库生成 pdf 文件。我在我的根目录中创建了两个 PDF 文件,如下所示:
$invoice_nos = ['0'=>'ISE-00000014Y18','1'=>'ISE-00000005Y18'];
foreach ($invoice_nos as $key => $invoice_no) {
$html = 'Invoice No - '.$invoice_no;
$pdf_file_name = $invoice_no.'.pdf';
$pdf_file_path = ROOT . '/app/webroot/Service_Invoices/'. DS .$pdf_file_name ;
ob_start();
$mpdf = new \mPDF('utf-8', 'A4' ,'','',5,5,36,10,5,4);
$mpdf->WriteHTML($html,2);
ob_clean();
$mpdf->Output($pdf_file_name,'f');
}
现在我想将这两个文件合并成一个不同页面的文件。我怎样才能做到这一点?我搜索了很多它的例子,但没有任何效果。
mPDF 不是合并 PDF 文件的最佳工具。 GhostScript:
你会过得更好gs -dBATCH -dSAFER -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=combined.pdf invoice1.pdf invoice2.pdf
或者,将两张发票直接生成到一个文件中:
$invoice_nos = ['0' => 'ISE-00000014Y18', '1' => 'ISE-00000005Y18'];
$mpdf = new \mPDF('utf-8', 'A4', '', '', 5, 5, 36, 10, 5, 4);
foreach ($invoice_nos as $key => $invoice_no) {
$html = 'Invoice No - ' . $invoice_no;
$mpdf->WriteHTML($html, 2);
$mpdf->WriteHTML('<pagebreak>');
}
$pdf_file_name = $invoice_no . 'invoices.pdf';
$mpdf->Output($pdf_file_name, 'f');
你好所以我实际上使用这段代码来拼合具有可编辑表单的 PDF,但我相信我们可以更改它以将 pdf 合并在一起。
此解决方案使用 php 的 Imagick(),它应该是您的托管环境的一部分。
这是代码,我已尽力对其进行评论。您将调用 mergePdf() 并放置目标文件夹(您的文件所在的位置以及您将保存新文件的位置)和要合并的文件数组(只是名称),然后是一个新文件名。一旦完成,它会将新文件保存在目标文件夹中。
/**
* mergePdf()
*
* @param mixed $destinationPath
* @param array $files
* @param mixed $newFileName
* @return
*/
public function mergePdf($destinationPath, $files, $newFileName){
//Create array to hold images
$array_images = array();
//Loop through to be merged
foreach($files as $file){
//Firstly we check to see if the file is a PDF
if(mime_content_type($destinationPath.$file)=='application/pdf'){
// Strip document extension
$file_name = pathinfo($file, PATHINFO_FILENAME);
// Convert this document
// Each page to single image
$im = new imagick();
//Keep good resolution
$im->setResolution(175, 175);
$im->readImage($destinationPath.$file);
$im->setImageFormat('png');
$im->writeImages($destinationPath.$file_name.'.png',false);
//loop through pages and add them to array
for($i = 0; $i < $im->getNumberImages(); $i++){
//insert images into array
array_push($array_images, $destinationPath.$file_name.'-'.$i.'.png');
}
//Clear im object
$im->clear();
$im->destroy();
}else{
return false;
}
}
//Now that the array of images is created we will create the PDF
if(!empty($array_images)){
//Create new PDF document
$pdf = new Imagick($array_images);
$pdf->setImageFormat('pdf');
if($pdf->writeImages($destinationPath.$newFileName, true)){
$pdf->clear();
$pdf->destroy();
//delete images
foreach($array_images as $image){
unlink($image);
}
return true;
}else{
return false;
}
}else{
return false;
}
}
public function getMergePdf(){
$destinationPath = "/your/destination/to/the/file/goes/here/";
//put the files in the order you want them to be merged
$files = array('file1.pdf','file2.pdf','file3.pdf');
$this->mergePdf($destinationPath, $files, "NewPdf.pdf");
}