如何使用dompdf与setasign/FPDF在下载前合并PDF文件
实现方案:将外部PDF合并到Dompdf生成的PDF末尾
核心思路
先通过Dompdf渲染report.blade生成基础PDF文件,再检查是否存在需要合并的目标PDF(即Measurement Picture中的PDF),若存在则用PDF合并工具将两个PDF合并,最终输出合并后的文件。
具体步骤
1. 安装必要依赖
首先安装Dompdf和PDF合并工具setasign/fpdi(它能很好兼容Dompdf生成的文件,处理PDF合并逻辑):
composer require dompdf/dompdf setasign/fpdi
2. 生成基础PDF(从report.blade)
沿用你现有传数据的逻辑,渲染视图并生成基础PDF,可临时保存到服务器:
use Dompdf\Dompdf; // 初始化Dompdf实例 $dompdf = new Dompdf(); // 加载blade视图并传入你的数据 $html = view('report', $yourData)->render(); $dompdf->loadHtml($html); // 设置PDF纸张参数(按需调整) $dompdf->setPaper('A4', 'portrait'); // 渲染PDF内容 $dompdf->render(); // 将基础PDF保存为临时文件 $basePdfPath = storage_path('temp/base_report.pdf'); file_put_contents($basePdfPath, $dompdf->output());
3. 检查并合并目标PDF
判断Measurement Picture中的PDF是否存在,若存在则执行合并操作:
use setasign\Fpdi\Fpdi; // 替换为你实际的Measurement Picture中PDF的路径 $targetPdfPath = 'path/to/measurement_picture.pdf'; if (file_exists($targetPdfPath)) { // 初始化Fpdi实例 $pdf = new Fpdi(); // 导入基础PDF的所有页面 $basePageCount = $pdf->setSourceFile($basePdfPath); for ($i = 1; $i <= $basePageCount; $i++) { $templateId = $pdf->importPage($i); $size = $pdf->getTemplateSize($templateId); $pdf->AddPage($size['orientation'], [$size['width'], $size['height']]); $pdf->useTemplate($templateId); } // 导入目标PDF的所有页面到基础PDF末尾 $targetPageCount = $pdf->setSourceFile($targetPdfPath); for ($i = 1; $i <= $targetPageCount; $i++) { $templateId = $pdf->importPage($i); $size = $pdf->getTemplateSize($templateId); $pdf->AddPage($size['orientation'], [$size['width'], $size['height']]); $pdf->useTemplate($templateId); } // 输出合并后的PDF(示例:直接下载给用户) $mergedPdfContent = $pdf->output(); return response($mergedPdfContent) ->header('Content-Type', 'application/pdf') ->header('Content-Disposition', 'attachment; filename="merged_report.pdf"'); // 若需保存到服务器,可替换为: // file_put_contents(storage_path('final/merged_report.pdf'), $mergedPdfContent); } else { // 无待合并PDF时,直接输出基础PDF return $dompdf->stream('report.pdf'); }
4. 清理临时文件(可选)
处理完成后删除临时生成的基础PDF文件,避免服务器存储空间浪费:
if (file_exists($basePdfPath)) { unlink($basePdfPath); }
注意事项
- 确保目标PDF文件路径正确,且服务器有该文件的读取权限
- 若目标PDF存在加密,需先解密再合并(Fpdi支持处理部分加密PDF,可参考官方文档调整)
- 尽量保持基础PDF与目标PDF的纸张尺寸一致,避免出现排版错乱问题
内容的提问来源于stack exchange,提问作者GigaTera
相关产品推荐
相关产品推荐

