小编Dan*_*ldt的帖子

PDFBox 1.8.10:填写并签名PDF会生成无效签名

我在PDF文档中填写(以编程方式)表单(AcroPdf),然后在文档中签名.我从doc.pdf开始,使用PDFBox的setFields.java示例创建doc_filled.pdf.然后我签署doc_filled.pdf,使用一些代码创建doc?filled_signed.pdf,基于签名示例并在Acrobat Reader中打开pdf.输入的Field数据可见,签名面板告诉我

"此签名中包含的格式或信息存在错误(签名字节数组无效)"

到目前为止,我知道:

  • 单独应用的签名代码(即直接创建一些doc_signed.pdf)会创建一个有效的签名
  • "隐形签名",可见签名和可见签名存在的问题被添加到现有签名字段中.
  • 问题甚至发生,如果我没有填写表格,但只打开并保存,即:

    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要求我提供文件,我正在谈论(我目前没有足够的声誉,将所有文件发布为链接,抱歉给您带来不便):

  • 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(); 
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:填写并签署文档,再次填充失败

java pdf sign pdf-form pdfbox

6
推荐指数
1
解决办法
1939
查看次数

标签 统计

java ×1

pdf ×1

pdf-form ×1

pdfbox ×1

sign ×1