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

使用iText C#签署多签名字段时同会话二次签名出错的问题

问题分析与解决方案

问题原因

当前创建签名字段的方式未将签名控件(Widget注解)绑定到具体PDF页面,导致PDF阅读器在同一会话中处理第二个签名时,无法正确识别未关联页面的签名字段结构。关闭重开PDF时,阅读器会重新解析文档并自动补全控件与页面的关联,因此能正常完成多签名操作。

修正后的代码

public static void Main(string[] args)
{
    string DEST = "path";
    PdfWriter writer = new PdfWriter(DEST);
    PdfDocument pdfDoc = new PdfDocument(writer);
    Document document = new Document(pdfDoc);

    PdfAcroForm form = PdfAcroForm.GetAcroForm(pdfDoc, true);
    // 获取第一页(可根据需求修改为目标页码)
    PdfPage page = pdfDoc.GetFirstPage();

    AddSignatureField(form, page, "signature1", 36, 700, 200, 50);
    AddSignatureField(form, page, "signature2", 36, 600, 200, 50);
    AddSignatureField(form, page, "signature3", 36, 500, 200, 50);

    document.Close();
}

public static void AddSignatureField(PdfAcroForm form, PdfPage page, string fieldName, float x, float y, float width, float height)
{
    Rectangle rect = new Rectangle(x, y, width, height);
    // 创建签名专用Widget注解并关联到指定页面
    PdfSignatureWidget signatureWidget = new PdfSignatureWidget(page, rect);
    // 通过AcroForm创建标准签名域
    PdfSignatureFormField signatureField = PdfAcroForm.CreateSignatureField(form.GetPdfDocument());
    signatureField.SetFieldName(fieldName);
    // 将Widget注解绑定到签名域
    signatureField.AddKid(signatureWidget);
    form.AddField(signatureField);
    // 将Widget注解添加到页面的注解集合,确保结构完整
    page.AddAnnotation(signatureWidget);
}

关键修改说明

  • 改用PdfSignatureWidget替代通用的PdfWidgetAnnotation,它是iText专为签名控件设计的注解类型,适配签名域的逻辑要求
  • 明确将签名Widget注解添加到指定页面的注解集合中,确保控件与页面的关联关系被持久化到PDF结构里
  • 通过PdfAcroForm.CreateSignatureField创建签名域,并调用AddKid绑定Widget注解,保证签名字段的结构完整性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:10:07