我以编程方式签署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只引用了最后一个签名?我希望能够多次签署一个文件,但我有一个问题。第一次签名没问题并显示此横幅:
然后我尝试用另一个证书再次签署同一个文件,这会给我签名旁边的垃圾桶图标,并说它已被删除,如您所见:
我正在使用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的任何内容,我亲自验证它们是正确的。是关于我的新修改吗?
答案 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
显然,不同的表单字段必须具有不同的名称。