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

如何用Java+iText识别PDF占位符并定位添加签名等内容?

利用iText通过PDF占位符定位并插入签名信息的实现方案

完全可以通过在PDF中预设占位符,再用iText搜索占位符坐标来插入签名、姓名及职位信息,下面是几种实用的实现思路:

一、文本占位符方案

在PDF模板中预先插入唯一标识的文本占位符,比如[SIGNATURE]、[USER_NAME]、[USER_POSITION]这类不会和原有内容重复的字符串,然后通过iText的文本提取API定位坐标:

  • 遍历PDF的每一页,提取页面文本并匹配占位符
  • 匹配成功后,获取占位符的边界矩形(bounding box)坐标
  • 在对应坐标位置绘制签名图片、姓名和职位文本

示例代码(基于iText 7):

import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.font.*;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.text.pdf.parser.*;

public class SignaturePlaceholder {
    public static void main(String[] args) throws Exception {
        PdfReader reader = new PdfReader("input_template.pdf");
        PdfDocument pdfDoc = new PdfDocument(reader, new PdfWriter("signed_output.pdf"));
        
        for (int pageNum = 1; pageNum <= pdfDoc.getNumberOfPages(); pageNum++) {
            PdfPage page = pdfDoc.getPage(pageNum);
            LocationTextExtractionStrategy strategy = new LocationTextExtractionStrategy();
            String pageText = PdfTextExtractor.getTextFromPage(page, strategy);
            
            // 定位签名占位符
            if (pageText.contains("[SIGNATURE]")) {
                Rectangle sigRect = strategy.getResultantText().getBoundingBox();
                PdfCanvas canvas = new PdfCanvas(page);
                
                // 插入签名图片
                canvas.addImage(ImageDataFactory.create("signature.png"), 
                                sigRect.getX(), sigRect.getY(), sigRect.getWidth(), false);
                
                // 插入姓名和职位
                PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
                canvas.beginText()
                      .setFontAndSize(font, 12)
                      .moveText(sigRect.getX(), sigRect.getY() - 18)
                      .showText("张三")
                      .moveText(0, -18)
                      .showText("高级开发工程师")
                      .endText();
            }
        }
        
        pdfDoc.close();
        reader.close();
    }
}

二、表单域占位符方案

如果PDF是可编辑的模板,直接添加隐藏表单域作为占位符(设置域名称如signature_placeholder),这种方式定位更精准:

  • 获取PDF的AcroForm表单对象
  • 通过域名称找到对应的表单域,直接读取其坐标矩形
  • 可以选择填充表单域,或者在对应位置绘制内容

示例代码片段:

PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, false);
// 获取签名占位符域
PdfFormField sigField = form.getField("signature_placeholder");
if (sigField != null) {
    Rectangle sigRect = sigField.getWidgets().get(0).getRectangle();
    // 后续绘制签名、姓名逻辑同文本占位符方案
}

三、图形占位符方案

如果不适合用文本或表单域,可以在PDF模板中添加一个透明的矩形(或特定颜色的小图形)作为标识,通过自定义内容监听器识别图形并获取坐标:

  • 实现IEventListener接口,监听页面中的图形路径
  • 匹配预设的图形属性(比如固定宽高、透明色),获取其位置坐标

注意事项

  • 占位符必须唯一,避免和PDF原有内容误匹配
  • 图片型扫描PDF无法直接使用上述方案,需先通过OCR转换为可编辑文本PDF
  • iText 5和iText 7的API差异较大,代码需对应使用的版本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:45:29