Laravel 8中如何合并两份PDF文件为单个可下载文件?
TCPDF场景下双PDF合并实现方案
TCPDF本身未内置PDF合并能力,你可以搭配同生态的FPDI扩展完成需求,无需更换现有生成逻辑,具体实现步骤如下:
前置依赖安装
通过composer安装FPDI的TCPDF适配版本:
composer require setasign/fpdi
核心实现逻辑
- 第一步:将你已有的TCPDF动态生成逻辑输出为PDF字符串,无需落盘存储:
// 这里是你原有生成TCPDF的业务逻辑,生成$tcpdf实例后执行以下代码获取内容 $generatedPdf = $tcpdf->Output('', 'S');
- 第二步:接收并校验用户上传的PDF文件,过滤非法后缀、超限大小的文件,获取上传文件的内容/临时路径。
- 第三步:初始化FPDI实例,依次导入两份PDF的所有页面后输出下载:
use setasign\Fpdi\Tcpdf\Fpdi; use setasign\Fpdi\PdfParser\StreamReader; // 初始化合并用实例 $mergedPdf = new Fpdi(); // 导入动态生成的PDF $pageCount = $mergedPdf->setSourceFile(StreamReader::createByString($generatedPdf)); for ($i = 1; $i <= $pageCount; $i++) { $template = $mergedPdf->importPage($i); $mergedPdf->AddPage(); $mergedPdf->useTemplate($template); } // 导入用户上传的PDF,这里示例用文件路径,也可以用StreamReader读字符串 $uploadPageCount = $mergedPdf->setSourceFile($yourUploadedPdfTempPath); for ($i = 1; $i <= $uploadPageCount; $i++) { $template = $mergedPdf->importPage($i); $mergedPdf->AddPage(); $mergedPdf->useTemplate($template); } // 直接输出合并后的PDF供用户下载 $mergedPdf->Output('merged_form.pdf', 'D');
注意事项
- FPDI免费版仅支持兼容PDF 1.4及以下版本的文件,若用户上传高版本或加密的PDF,可提前做格式转码预处理,或使用FPDI商业版支持高版本解析。
- 所有用户上传的PDF必须做安全校验,避免恶意文件注入风险。
- 原有TCPDF生成的自定义排版、水印、页边距等格式不会在合并过程中丢失。
内容的提问来源于stack exchange,提问作者Shubham Nikam
相关产品推荐
相关产品推荐

