You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 18:20:52