如何使用MPDF将两个已生成的PDF文件合并为单个PDF文件?
用mPDF合并多个生成的PDF文件
嘿,好消息!mPDF本身就支持合并PDF文件,不用额外依赖其他工具。针对你的场景,我给你两种可行的方案:
方案1:先生成单个PDF,再合并成一个文件
如果你已经生成了两个独立的PDF文件(就像你现在的代码那样),可以用下面的代码把它们合并:
// 先定义要合并的PDF文件路径列表 $pdf_files = [ ROOT . '/app/webroot/Service_Invoices/' . DS . 'ISE-00000014Y18.pdf', ROOT . '/app/webroot/Service_Invoices/' . DS . 'ISE-00000005Y18.pdf' ]; // 初始化一个新的mPDF实例作为合并后的容器 $mergedMpdf = new \mPDF('utf-8', 'A4', '', '', 5, 5, 36, 10, 5, 4); foreach ($pdf_files as $file) { // 加载源PDF文件 $pageCount = $mergedMpdf->SetSourceFile($file); // 导入该PDF的所有页面并添加到合并后的PDF中 for ($i = 1; $i <= $pageCount; $i++) { $templateId = $mergedMpdf->ImportPage($i); $mergedMpdf->UseTemplate($templateId); // 如果不是当前PDF的最后一页,添加新页面避免内容重叠 if ($i < $pageCount) { $mergedMpdf->AddPage(); } } // 每个源PDF之间添加分页(可选,根据需求调整) if ($file !== end($pdf_files)) { $mergedMpdf->AddPage(); } } // 输出合并后的PDF('F'表示保存到文件,'I'表示直接在浏览器打开) $mergedFileName = 'merged_invoices.pdf'; $mergedFilePath = ROOT . '/app/webroot/Service_Invoices/' . DS . $mergedFileName; $mergedMpdf->Output($mergedFilePath, 'F');
方案2:直接生成时合并(更高效,无需生成单个文件)
如果你不需要保留单个的PDF文件,可以直接在循环中把所有内容添加到同一个mPDF实例里,一步生成合并后的文件,这样更节省IO操作:
$invoice_nos = ['0'=>'ISE-00000014Y18','1'=>'ISE-00000005Y18']; // 初始化一个mPDF实例 $mpdf = new \mPDF('utf-8', 'A4' ,'','',5,5,36,10,5,4); foreach ($invoice_nos as $key => $invoice_no) { $html = 'Invoice No - '.$invoice_no; // 写入当前发票的HTML内容 $mpdf->WriteHTML($html, 2); // 如果不是最后一个发票,添加新页面分隔 if ($key !== array_key_last($invoice_nos)) { $mpdf->AddPage(); } } // 输出合并后的PDF $mergedFileName = 'merged_invoices.pdf'; $mergedFilePath = ROOT . '/app/webroot/Service_Invoices/' . DS . $mergedFileName; $mpdf->Output($mergedFilePath, 'F');
关键方法说明
SetSourceFile($file):加载要合并的源PDF文件,返回该PDF的总页数。ImportPage($pageNumber):导入指定页码的页面,返回模板ID。UseTemplate($templateId):把导入的页面模板添加到当前mPDF实例中。AddPage():添加新的空白页面,用于分隔不同的内容或PDF文件。
根据你的需求选择合适的方案就好啦!
内容的提问来源于stack exchange,提问作者Ajay Krishna Dutta
相关产品推荐
相关产品推荐

