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

Java基于iText7如何将源PDF签名写入目标PDF的PdfButtonFormField域

你使用的是iText7库的话,你已经完成了签名页转FormXObject的核心步骤,接下来只需要把这个对象设置到表单域,再调整显示适配即可,完整实现如下:

完整实现代码

import com.itextpdf.forms.fields.PdfButtonFormField;
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;

public class SignFillDemo {
    // 替换为你自己的签名PDF路径、目标模板路径、输出路径
    private static final String SIGNATURE_PDF = "path/to/your/sign.pdf";
    private static final String TEMPLATE_PDF = "path/to/your/template.pdf";
    private static final String OUTPUT_PDF = "path/to/your/output.pdf";

    public static void main(String[] args) throws Exception {
        // 1. 加载目标模板PDF
        PdfDocument pdfDoc = new PdfDocument(new PdfReader(TEMPLATE_PDF), new PdfWriter(OUTPUT_PDF));
        PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
        // 获取签名对应的图片表单域
        PdfButtonFormField signatureField = (PdfButtonFormField) form.getField("Image2_af_image");

        // 2. 加载签名PDF并转换为FormXObject
        File signPdfFile = new File(String.valueOf(Paths.get(SIGNATURE_PDF)));
        ByteArrayInputStream signByteArray = new ByteArrayInputStream(Files.readAllBytes(signPdfFile.toPath()));
        final PdfDocument signatureDoc = new PdfDocument(new PdfReader(signByteArray));
        PdfFormXObject signXObject = signatureDoc.getFirstPage().copyAsFormXObject(pdfDoc);
        signatureDoc.close();

        // 3. 将签名XObject设置到表单域,同时适配表单域的尺寸避免变形
        signatureField.setImage(signXObject);
        // 可选:设置表单域为只读,避免后续被修改
        signatureField.setReadOnly(true);

        // 4. 可选:如果不需要保留表单域可编辑属性,可以扁平化表单
        // form.flattenFields();

        pdfDoc.close();
    }
}

注意事项

  • 如果你提取的签名PDF有多余空白边距,可以在转换为FormXObject之后,调用signXObject.setBBox()方法裁剪多余空白,让签名在表单域内显示更协调
  • 如果出现签名变形的情况,可以先获取表单域的宽高,再等比例缩放XObject的BBox尺寸后再赋值
  • 要确保你使用的iText7版本是7.1及以上,PdfButtonFormField.setImage()方法是该版本之后才提供的API
  • 如果你使用的是iText5版本,需要先将签名页转换为Image对象,再调用signatureField.setImage()方法,API逻辑略有差异

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:27:02