【问题标题】:Digital Signature become invalid after filling pdf form填写pdf表格后数字签名无效
【发布时间】:2018-01-18 08:31:45
【问题描述】:

我创建了一个 pdf 文档并指定了几个 acro-fields。这些农田过去 由 java itext 库填充。在添加所有必需的 acro-fields 后,此文档经过数字签名。

我们已经在数字签名中设置了表单填充属性,但是每当我们试图通过 itext 库填充这个文档时,这个文档的数字签名就会失效。

这是我用来填写此文档的代码 -

String FILE = "/Users/mahensha/Desktop/NOC/test1.pdf";
        PdfReader reader = new PdfReader("/Users/mahensha/Desktop/NOC/test.pdf");
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE));
        AcroFields form = stamper.getAcroFields();
        System.out.println("form:   " + form);
        form.setField("SellerName", "Mr.Mahendra Kumar Sharma");
        form.setField("AddressLine1", "My address");
        stamper.setFormFlattening(true);
        stamper.close();
        reader.close();

我正在使用 lowagie itext 库来填写 pdf 表单。

有什么办法可以解决这个问题。 谢谢。

【问题讨论】:

  • 使用PdfStamper构造函数,有4个参数,最后一个使用true。这将选择不破坏现有签名所需的附加模式。

标签: java pdf itext digital-signature acrofields


【解决方案1】:

您像这样创建PdfStamper

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE));

这要求 iText 获取原始 PDF,丢弃不需要的部分,按照它认为合适的方式排列剩余部分,应用您想要的添加,然后保存所有这些。

这样的程序显然会破坏任何现有的签名。

您可以指示 iText 将更改应用为增量更新,即复制现有 pdf 并将更改附加到新修订版中。生成的文件通常比上面创建的文件大,但预先存在的签名不会在数学上被破坏。

您可以使用 PdfStamper 的 4 参数构造函数请求此附加模式,例如像这样:

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE), '\0', true);

此外,您请求表单展平:

stamper.setFormFlattening(true);

这会自动使预先存在的签名无效。因此,不要这样做。

【讨论】:

    猜你喜欢
    • 2015-12-29
    • 2016-04-05
    • 2012-07-28
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多