使用FPDI添加PDF水印时出现Template not found错误如何解决?
解决FPDI添加水印时“Template not Found”异常的问题
你遇到的这个“Template not Found”错误,核心原因是你创建了多个独立的Fpdi实例,却试图跨实例使用模板——每个Fpdi对象都维护着自己的模板池,从$pdf1导入的模板ID在$pdf实例里根本不存在,自然会报错。
另外你的代码还有几个冗余的地方:重复创建Fpdi实例、循环里重复调用setSourceFile(会重置模板池),这些都会引发问题。我帮你把代码重构一下,只需要一个主Fpdi实例就能完成需求:
// 只初始化一个Fpdi实例 $pdf = new \setasign\Fpdi\Fpdi(); // 1. 加载源PDF,获取总页数 $sourceFile = $this->getCurrentFile(); $pageCount = $pdf->setSourceFile($sourceFile); // 2. 加载水印PDF,只需要导入一次水印模板(所有页面复用) $watermarkTpl = $pdf->importPage($pdf->setSourceFile($watermarkPDF)); // 3. 循环处理每一页 for($pageNo = 1; $pageNo <= $pageCount; $pageNo++) { // 导入当前页的模板 $pageTpl = $pdf->importPage($pageNo); // 获取当前页的尺寸 $size = $pdf->getTemplateSize($pageTpl); // 根据页面宽高判断方向,添加对应页面 if ($size['w'] > $size['h']) { $pdf->AddPage('L', array($size['w'], $size['h'])); } else { $pdf->AddPage('P', array($size['w'], $size['h'])); } // 先渲染源页面模板 $pdf->useTemplate($pageTpl, 0, 0, 0); // 再渲染水印模板(叠加在源页面上) $pdf->useTemplate($watermarkTpl, 0, 0, 0); } // 最后别忘了输出或者保存PDF // $pdf->Output('D', 'watermarked.pdf');
关键修复点说明:
- 单实例复用:全程只用一个
$pdf实例,所有模板都在同一个实例的模板池中,避免跨实例调用模板的问题 - 水印模板只导入一次:水印是通用的,不需要每次循环都重新加载导入,提升效率
- 避免重复调用setSourceFile:循环里重复调用会重置当前实例的模板池,导致之前的模板ID失效
- 模板调用顺序:先渲染源页面,再渲染水印,这样水印会叠加在源内容上方(如果需要水印在下方,调换顺序即可)
内容的提问来源于stack exchange,提问作者user3101803




