Java 填写pdf表单后,数字签名无效

Java 填写pdf表单后,数字签名无效,java,pdf,itext,digital-signature,acrofields,Java,Pdf,Itext,Digital Signature,Acrofields,我创建了一个pdf文档并指定了几个acro字段。这些acro字段用于 由java itext库填充。此文档在添加所有必需的acro字段后进行数字签名 我们已经在数字签名中设置了表单填充属性,但每当我们试图通过itext库填充此文档时,此文档的数字签名将无效 以下是我用来填写此文档的代码- 我正在使用lowagie itext库填写pdf表单 有没有办法解决这个问题。 谢谢。您创建的PdfStamper如下: PdfStamper stamper = new PdfStamper(reader

我创建了一个pdf文档并指定了几个acro字段。这些acro字段用于 由java itext库填充。此文档在添加所有必需的acro字段后进行数字签名

我们已经在数字签名中设置了表单填充属性,但每当我们试图通过itext库填充此文档时,此文档的数字签名将无效

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

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

有没有办法解决这个问题。
谢谢。

您创建的
PdfStamper
如下:

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE), '\0', true);
这要求iText获取原始PDF,扔掉不需要的部分,按照它认为合适的方式安排剩余部分,应用所需的添加内容,并保存所有这些内容

这种程序显然破坏了任何现有的签名

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

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

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE));
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(FILE), '\0', true);
此外,您还请求表单展平:

stamper.setFormFlattening(true);

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

使用带有4个参数的
PdfStamper
构造函数,并在最后一个参数中使用
true
。选择附加模式,该模式是不中断现有签名所必需的。