java - 填写pdf表格后数字签名失效

标签 java pdf itext digital-signature acrofields

我创建了一个 pdf 文档并指定了一些 acro-fields。这些杂技场曾经 由java itext库填充。添加所有必需的 acro 字段后,此文档已进行数字签名。

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

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

字符串 FILE = "/Users/mahensha/Desktop/NOC/test1.pdf";
        PdfReader 阅读器 = new PdfReader("/Users/mahensha/Desktop/NOC/test.pdf");
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE));
        AcroFields form = stamper.getAcroFields();
        System.out.println("表单:"+ 表单);
        form.setField("SellerName", "Mr.Mahendra Kumar Sharma");
        form.setField("AddressLine1", "我的地址");
        stamper.setFormFlattening(true);
        压模.close();
        reader.close();

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

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

最佳答案

您可以像这样创建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);

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

关于java - 填写pdf表格后数字签名失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45607823/

相关文章:

hyperlink - HTML 链接到 PDF 中的特定页面

c# - 快速创建 Pdf 的库

java - 如何在没有数字签名的情况下添加时间戳

java - 可以用 Go 编写 Intellij 插件吗?

java - Gson 为特定类或字段序列化 null

javascript - Firefox 19 从 JavaScript 打印 PDF

java - 填充动态 XFA pdf 表单 itext

java - 使用 iText 在每个页面中进行数字签名

java - 使用 GoogleDriveApi for android 和 Groovy 时出现奇怪的 ClassCastException 错误

java - ListView 滚动时不会保留 Edittext 的内容