2017-08-10 297 views
1

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

我们已经在数字签名中设置了填表属性,但是无论何时我们试图用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表单。

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

+0

使用带有4个参数的'PdfStamper'构造函数并在最后一个中使用'true'。选择不破坏现有签名所需的附加模式。 – mkl

回答

2

您创建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); 

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

+0

谢谢!它的工作! – user3212707