Laravel中合并Base64格式PDF及解决合并报错问题
解决Webklex\PDFMerger合并Base64解码PDF内容报错问题
问题根源
报错提示Could not locate PDF on '%PDF-1.3\r\n%????.......,核心原因是addPDF()方法默认接收文件路径作为参数,你直接传入了解码后的PDF二进制内容,组件误将二进制内容当作文件路径去查找,因此抛出找不到文件的异常。另外,多余的mb_convert_encoding调用会破坏PDF二进制文件结构,也是潜在问题。
解决方案:通过临时文件中转处理
将Base64解码后的PDF二进制内容写入临时文件,再用临时文件路径传入addPDF方法,具体代码如下:
use Webklex\PDFMerger\Facades\PDFMergerFacade as PDFMerger; // 解码Base64格式的PDF内容 $pdfContent1 = base64_decode($resp_1); $pdfContent2 = base64_decode($resp_2); // 定义临时文件路径,建议存在storage目录下 $tempFile1 = storage_path('temp/pdf_temp_1.pdf'); $tempFile2 = storage_path('temp/pdf_temp_2.pdf'); // 确保临时目录存在 if (!is_dir(storage_path('temp'))) { mkdir(storage_path('temp'), 0755, true); } // 将二进制内容写入临时文件 file_put_contents($tempFile1, $pdfContent1); file_put_contents($tempFile2, $pdfContent2); // 初始化PDF合并器并添加临时文件 $merger = PDFMerger::init(); $merger->addPDF($tempFile1, 'all'); $merger->addPDF($tempFile2, 'all'); // 合并并保存最终PDF $merger->merge(); $mergedFilePath = public_path('storage/merged.pdf'); $merger->save($mergedFilePath); // 合并完成后清理临时文件(可选) unlink($tempFile1); unlink($tempFile2);
关键修改说明
- 移除
mb_convert_encoding:PDF是二进制文件,不需要进行字符编码转换,转码会损坏文件结构。 - 临时文件中转:利用临时文件将二进制内容转换为组件支持的文件路径参数,符合
addPDF方法的设计预期。 - 临时目录检查:提前创建临时目录,避免因目录不存在导致文件写入失败。
- 临时文件清理:合并完成后删除临时文件,避免占用服务器存储空间。
内容的提问来源于stack exchange,提问作者DeveloperX
相关产品推荐
相关产品推荐

