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

如何用PHP在保留可编辑表单域的PDF中插入图片

PHP 插入签名图片到PDF并保留表单可编辑性的方案

你遇到的核心问题是之前的工具都将PDF内容扁平化(转为图像),导致表单域丢失。要解决这个问题,需要导入原PDF的页面结构而非转为图像,在原页面的基础上叠加签名图片,同时保留原表单的可编辑性。

推荐使用setasign/fpdi-tcpdf(FPDI与TCPDF的整合库),它能直接导入原PDF的页面元素(包括表单域),然后在指定位置绘制图片,不会破坏原PDF的交互性。

实现步骤与代码示例

  1. 首先通过Composer安装依赖:
composer require setasign/fpdi-tcpdf
  1. 替换你原来的Imagick代码,使用以下实现:
require_once 'vendor/autoload.php';

use setasign\Fpdi\Tcpdf\Fpdi;

// 原已填充表单的PDF路径
$existingPdfPath = \config::tempDir . '/existingFilledPDF.pdf';
// 签名图片路径
$signatureImagePath = \config::tempDir . '/signature.png';
// 输出路径
$outputPath = \config::tempDir . '/signedpdfoutput.pdf';

// 初始化FPDI对象
$pdf = new Fpdi();

// 获取原PDF的总页数
$pageCount = $pdf->setSourceFile($existingPdfPath);

// 遍历每一页
for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
    // 导入当前页面
    $templateId = $pdf->importPage($pageNo);
    // 获取原页面的尺寸
    $size = $pdf->getTemplateSize($templateId);
    
    // 创建与原页面尺寸一致的新页面
    $pdf->AddPage($size['orientation'], [$size['width'], $size['height']]);
    // 将导入的页面内容(含表单域)渲染到新页面
    $pdf->useTemplate($templateId);

    // 仅在第2页(注意:FPDI页码从1开始)插入签名
    if ($pageNo === 2) {
        // 调整签名图片尺寸
        $newWidth = 180;
        $newHeight = 30;
        // 插入图片,参数:路径、X坐标、Y坐标、宽度、高度
        $pdf->Image($signatureImagePath, 295, 610, $newWidth, $newHeight);
    }
}

// 输出PDF,'F'表示保存到文件
$pdf->Output($outputPath, 'F');

关键说明

  • 该方案通过importPage和useTemplate导入原PDF的完整页面结构,而非转为图像,因此能保留原表单域的可编辑性。
  • PDF的坐标原点在页面左下角,X向右递增,Y向上递增,你可以根据需要调整295和610的数值来精准定位签名。
  • 如果需要支持加密PDF,可以额外配置FPDI的加密处理选项。

其他可选方案

如果不想使用TCPDF,也可以选择laminas/laminas-pdf(原Zend Pdf),它也支持在现有PDF页面上绘制元素并保留表单域,但API相对繁琐一些。

内容的提问来源于stack exchange,提问作者Michael Collins

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:07:41