PDF未知的签名图标

时间:2017-08-02 08:07:40

标签: pdf zend-framework digital-signature

我以编程方式签署PDF。每个新签名都以增量方式添加,我在%EOF之后添加签名词典,我更新了这样的AcroForm(抱歉,我正在工作,所以我无法上传PDF):

... // ORIGINAL FILE

trailer
<<
/Size 11
/Root 1 0 R
/Info 10 0 R
>>

startxref
2714
%%EOF
1 0 obj 
<</Type /Catalog /Outlines 2 0 R /Pages 3 0 R /AcroForm <</Fields [11 0 R ] /SigFlags 3 >> /Names 14 0 R >>
endobj

...

11 0 obj 
<</Type /Annot /SubType /Widget /Rect [0 0 0 0 ] /P 4 0 R /F 4 /FT /Sig /T (Signature) /Ff 0 /V <</Type /Sig /Filter /Adobe.PPKLite /SubFilter /adbe.pkcs7.detached /ByteRange [0 3729 15473 422                   ] /Contents <308209...> 
/M (D:20170801165520+02'00') >> >>
endobj

...

trailer
<</Size 15 /Root 1 0 R /Info 10 0 R /Prev 2714 >>
startxref
15609
%%EOF
1 0 obj 
<</Type /Catalog /Outlines 2 0 R /Pages 3 0 R /AcroForm <</Fields [15 0 R ] /SigFlags 3 >> /Names 14 0 R >>
endobj

...

15 0 obj 
<</Type /Annot /SubType /Widget /Rect [0 0 0 0 ] /P 4 0 R /F 4 /FT /Sig /T (Signature) /Ff 0 /V <</Type /Sig /Filter /Adobe.PPKLite /SubFilter /adbe.pkcs7.detached /ByteRange [0 16632 28376 387                  ] /Contents <3082062...> 
/M (D:20170802094848+02'00') >> >>
endobj
16 0 obj 

...

<</Size 18 /Root 1 0 R /Info 10 0 R /Prev 15609 >>
startxref
28476
%%EOF

也许问题是我有多个具有相同ID的对象,而我的最后一个AcroForm只引用了最后一个签名?我希望能够多次签署一个文件,但我有一个问题。第一次签名没问题并显示此横幅:

enter image description here

然后我尝试用另一个证书再次签署同一个文件,这会给我签名旁边的垃圾桶图标,并说它已被删除,如您所见:

enter image description here

我正在使用Zend_PDF来解析文件并添加签名。

编辑:感谢@mkl,现在可以通过Adobe Reader识别2个签名。我的AcroForms现在看起来像这样:

2714
%%EOF
1 0 obj 
<</Type /Catalog /Outlines 2 0 R /Pages 3 0 R /AcroForm <</Fields [11 0 R ] /SigFlags 3 >> /Names 14 0 R >>
endobj

... 

15610
%%EOF
1 0 obj 
<</Type /Catalog /Outlines 2 0 R /Pages 3 0 R /AcroForm <</Fields [11 0 R 15 0 R ] /SigFlags 3 >> /Names 14 0 R >>
endobj

...

我有这个令人惊讶的错误,因为我没有修改有关ByteRange的任何内容,我亲自验证它们是正确的。是关于我的新修改吗?

enter image description here

1 个答案:

答案 0 :(得分:1)

添加第一个签名时,您将 AcroForm 字典设置为

/AcroForm <</Fields [11 0 R ] /SigFlags 3 >> 

对于第二个,您将其设置为

/AcroForm <</Fields [15 0 R ] /SigFlags 3 >>

即。您从中删除了11 0 R并向其添加了15 0 R。因此,您确实从表单结构中删除了第一个签名字段。

您应该只添加新的签名字段:

/AcroForm <</Fields [11 0 R 15 0 R ] /SigFlags 3 >>

此外,您的签名字段都具有相同的名称

11 0 obj 
<<
    ...
    /T (Signature) 
    ...
>>
endobj
...
15 0 obj 
<<
    ...
    /T (Signature)
    ...
>>
endobj

显然,不同的表单字段必须具有不同的名称。