我在PDF文档中填写(以编程方式)表单(AcroPdf),然后在文档中签名.我从doc.pdf开始,使用PDFBox的setFields.java示例创建doc_filled.pdf.然后我签署doc_filled.pdf,使用一些代码创建doc?filled_signed.pdf,基于签名示例并在Acrobat Reader中打开pdf.输入的Field数据可见,签名面板告诉我
"此签名中包含的格式或信息存在错误(签名字节数组无效)"
到目前为止,我知道:
问题甚至发生,如果我没有填写表格,但只打开并保存,即:
PDDocument doc = PDDocument.load(new File("doc.pdf"));
doc.save(new File("doc_filled.pdf"));
doc.close();
Run Code Online (Sandbox Code Playgroud)足以打破后来应用的签名代码.
另一方面,如果我使用相同的doc.pdf,在Adobe中手动输入字段的值,则签名代码会生成有效的签名.
我究竟做错了什么?
更新:
@mkl要求我提供文件,我正在谈论(我目前没有足够的声誉,将所有文件发布为链接,抱歉给您带来不便):
最后一个是通过一次性使用签署和填写文档来创建的
doc.saveIncremental();
Run Code Online (Sandbox Code Playgroud)
正如我已经在评论中写的那样
setNeedToBeUpdate(true);
Run Code Online (Sandbox Code Playgroud)
但似乎缺少了.参考@mkl的第二条评论,我发现了这个问题:使用PDFBOX生成的PDF中无法正确显示保存的文本字段值,这也包括某些输入的文本未显示.申请时,我先试了一下
setBoolean(COSName.getPDFName("NeedAppearances"), true);
Run Code Online (Sandbox Code Playgroud)
到字段和表单的字典,然后显示字段上下文,但签名最终没有添加.我仍然需要进一步研究.
更新: 故事在这里继续:PDFBox 1.8.10:填写并签署文档,再次填充失败