【问题标题】:Signature field remain unsigned after the signing签名后签名字段保持未签名
【发布时间】:2021-12-06 01:23:10
【问题描述】:

我正在使用 iText7 库进行签名。我尝试签署文档上可用的签名字段之一,但签名后,它仍然显示该字段未签名。以下是我用于签名的代码 sn-p。

String fieldName = "signature1";
PdfAcroForm pdfAcroForm = PdfAcroForm.getAcroForm(pdfDocument, false);
PdfArray pdfArray = pdfAcroForm.getField(fieldName).getWidgets().get(0).getRectangle();
Rectangle rect = pdfArray.toRectangle();
PdfSignatureAppearance appearance = pdfSigner.getSignatureAppearance().setReason("Test")
    .setLocation("Test").setReuseAppearance(false);
appearance.setPageRect(rect).setPageNumber(1);
IExternalSignature pks =
     new PrivateKeySignature(pk, DigestAlgorithms.SHA256, provider.getName());
pdfSigner.signDetached(new BouncyCastleDigest(), pks, chain, null, null, null, 0, CryptoStandard.CMS);

original pdf &signed pdf

更新

对于以下 pdf,尽管按照响应中提到的方式签名了字段,但我没有在文档上获得签名可见性;但是,为上述早期共享的 pdf 工作。

pdfSigner.setFieldName(fieldName);

original pdf &signed pdf

【问题讨论】:

    标签: digital-signature itext7


    【解决方案1】:

    原始问题

    您忘记告诉PdfSigner 对现有表单字段之一进行签名,因此它会创建一个新字段并对其进行签名。

    要告诉 iText 使用特定字段,请使用 PdfSigner.setFieldName

    pdfSigner.setFieldName(fieldName);
    

    根据它的JavaDocs这个方法

    设置表示要签名的字段的名称。该字段可以已在文档中显示,但不应签名。如果文档中没有显示该字段,则会创建该字段。

    (我猜“presented”应该是“present”...)

    一旦你这样做了,就没有必要了

    appearance.setPageRect(rect).setPageNumber(1);
    

    不再使用现有表单域的矩形和页码。

    FORM FDA 1571 的问题

    在更新中,您共享了一个文件,尽管进行了上述更正,但没有显示其签名外观,即 FDA 1571 表格。

    原因很简单:该文档中的签名字段在签名前后都是不可见的!

    before signing after signing

    因此,您看不到签名外观是完全正确的。

    如果你想要一个可见的签名外观,你必须确保签名字段是可见的。

    在许多情况下,签名外观是不可见的,尤其是:

    • 签名小部件未从任何页面引用。
    • 签名小部件的 Rect 条目在页面外(在页面的裁剪框之外)。
    • 签名小部件的 Rect 条目的宽度或高度为 0。
    • 签名小部件属于已关闭的可选内容组(也称为图层)。
    • 已设置签名小部件标志之一 InvisibleHiddenNoView

    如果您的表格是 FDA 1571,则设置了 Hidden 标志。

    您可以像这样取消设置该标志:

    PdfAcroForm.getAcroForm(pdfSigner.getDocument(), false)
        .getField(fieldName)
        .setVisibility(PdfFormField.VISIBLE);
    

    (来自SignWithAdaptions 测试testFda1571

    如果您想知道为什么在手动签署文档后签名是可见的:表单上的签名按钮会执行一些 JavaScript,除此之外还会清除 Hidden 标志。 em>

    【讨论】:

    • 谢谢,您可以查看问题的更新部分吗?
    • “您能否查看问题的更新部分” - 是的。该 PDF 中的签名字段被标记为隐藏,因此您在签名时创建的签名可视化不可见。请参阅我的编辑“FORM FDA 1571 的问题”。
    猜你喜欢
    • 1970-01-01
    • 2021-02-12
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2010-10-03
    相关资源
    最近更新 更多