Объединить два файла PDF в один, используя MPDF - PullRequest
0 голосов
/ 02 мая 2018

Я использую библиотеку 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');
}

Теперь я хочу объединить эти два файла в один файл с разными страницами. Как я могу это сделать? Я искал много примеров, но ничего не работает.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Привет! Итак, я фактически использовал этот код для выравнивания PDF-файла, который имел редактируемые формы, но я считаю, что мы можем изменить его, чтобы объединить PDF-файлы вместе.

Это решение использует php's 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");
}
0 голосов
/ 03 мая 2018

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');
...