You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动