我(以编程方式)在 PDF 文档中填写表格(AcroPdf),然后在文档上签名。我从 doc.pdf 开始,使用 PDFBox 的 setFields.java 示例创建 doc_filled.pdf。然后我签署 doc_filled.pdf,创建 doc?filled_signed.pdf,使用一些代码,基于签名示例并在 Acrobat Reader 中打开 pdf。输入的字段数据可见,签名面板告诉我
“此签名中包含的格式或信息存在错误(签名字节数组无效)”
到目前为止,我知道:
- 单独应用的签名代码(即直接创建一些 doc_signed.pdf)创建一个有效的签名
- 添加到现有签名字段的“不可见签名”、可见签名和可见签名存在问题。
如果我不填写表格,而只是打开并保存它,甚至会出现问题,即:
PDDocument doc = PDDocument.load(new File("doc.pdf")); doc.save(new File("doc_filled.pdf")); doc.close();
足以破坏后来应用的签名代码。
另一方面,如果我采用相同的 doc.pdf,在 Adobe 中手动输入字段值,签名代码会生成有效签名。
我究竟做错了什么?
更新:
@mkl 要求我提供文件,我正在谈论(我目前没有足够的声誉,无法将所有文件作为链接发布,抱歉给您带来不便):
- odc.pdf:https ://www.dropbox.com/s/ev8x9q48w5l0hof/doc.pdf?dl=0
- doc_filled.pdf:https ://www.dropbox.com/s/fxn4gyneizs1zzb/doc_filled.pdf?dl=0
- doc_filled_signed.pdf:https ://www.dropbox.com/s/xm846sj8f9kiga9/doc_filled_signed.pdf?dl=0
- doc_filled_and_signed.pdf:https ://www.dropbox.com/s/5jftje6ke87jedr/doc_filled_and_signed.pdf?dl=0
最后一个是通过一次性签署和填写文档来创建的,使用
doc.saveIncremental();
正如我已经在评论中写的,一些
setNeedToBeUpdate(true);
不过,似乎不见了。参考 @mkl 的第二条评论,我发现了这个 SO 问题:Saved Text Field value is not displayed proper in PDF generated using PDFBOX,这也涵盖了一些未显示的输入文本。我第一次尝试,申请
setBoolean(COSName.getPDFName("NeedAppearances"), true);
到字段和表单的字典,然后显示字段上下文,但最后没有添加签名。我仍然需要进一步研究。
更新: 故事在这里继续:PDFBox 1.8.10:填写并签署文档,再次填写失败