我使用 PDFbox 来签署 PDF。它工作得很好。我可以在一个文档中添加多个签名,一切正常。
现在,有人给我签名(她用另一个软件签名),这个签名也有效。但是当我向他的文档添加另一个修订版(通过 pdfbox)时,现在 Adobe 阅读器告诉我 PDF 已被修改。
我使用 PDFbox 来签署 PDF。它工作得很好。我可以在一个文档中添加多个签名,一切正常。
现在,有人给我签名(她用另一个软件签名),这个签名也有效。但是当我向他的文档添加另一个修订版(通过 pdfbox)时,现在 Adobe 阅读器告诉我 PDF 已被修改。
您的代码对现有 PDF 对象应用了不必要的更改。
有些变化只是结构性的,并没有改变实际的内容。Acrobat Reader 可能会或可能不会忽略这些结构变化。但是在这个过程中,你引入了舍入误差,它们最终构成了变化。
结构上的变化可能是由 PDFBox 的怪癖引起的,它强制其偏好哪些类型的对象应该直接或间接地放在它接触的现有对象上。
当涉及安全功能时,实际上几乎不相关的舍入误差绝对是不可行的。
当您使用 PDFBox 对文档进行两次签名时,初始签名过程已经将 PDFBox 的首选项强制到文档中,因此,第二个签名过程不会通过再次将相同的首选项强制到其结果中来破坏任何内容。
来自original-signed - old.pdf的原件:
3 0 obj
<<
/DefaultGray 11 0 R
/Type/Catalog
/DefaultRGB 12 0 R
/AcroForm
<<
/Fields[15 0 R]
/DR<</Font<</Helv 16 0 R/ZaDb 17 0 R>>>>
/DA(/Helv 0 Tf 0 g )
/SigFlags 3
>>
/Pages 5 0 R>>
endobj
11 0 obj
[
/CalGray
<<
/WhitePoint [0.9505 1 1.0891 ]
/Gamma 0.2468
>>
]
endobj
12 0 obj
[
/CalRGB
<<
/WhitePoint [0.9505 1 1.0891 ]
/Gamma [0.2468 0.2468 0.2468 ]
/Matrix [0.4361 0.2225 0.0139 0.3851 0.7169 0.0971 0.1431 0.0606 0.7141 ]
>>
]
endobj
您重新签名的 original-signed-signed -old new.pdf
3 0 obj
<<
/DefaultGray [/CalGray 18 0 R]
/Type /Catalog
/DefaultRGB [/CalRGB 19 0 R]
/AcroForm
<<
/Fields [15 0 R 20 0 R]
/DA (/Helv 0 Tf 0 g )
/SigFlags 3
>>
/Pages 5 0 R
>>
endobj
18 0 obj
<<
/WhitePoint [0.9505000114 1 1.0891000032]
/Gamma 0.2468000054
>>
endobj
19 0 obj
<<
/WhitePoint [0.9505000114 1 1.0891000032]
/Gamma [0.2468000054 0.2468000054 0.2468000054]
/Matrix [0.4361000061 0.2224999964 0.0138999997 0.3851000071 0.716899991 0.0970999971 0.1430999935 0.0606000014 0.7141000032]
>>
endobj
因此,本质上,您的代码将直接字典的间接数组(对象 11 和 12)更改为间接字典(新对象 18 和 19)的直接数组(在新对象 3 中)。这是不必要的,因此 Adobe Reader 无需接受它。但如果替换相同,它可能会接受这一点(我不知道,必须检查)。
但它们确实不相同!您的代码在这些颜色定义中引入了舍入错误。因此,它改变了内容。
此外,您的代码还引入了结构更改
4 0 obj
<<
/Parent 5 0 R
/Contents 9 0 R
/Type/Page
/Resources<</ProcSet 2 0 R/Font<</F0 6 0 R/F1 7 0 R>>>>
/MediaBox[0 0 612 792]
/Annots[15 0 R]
>>
endobj
2 0 obj
[ /PDF /Text ]
endobj
你改成
4 0 obj
<<
/Parent 5 0 R
/Contents 9 0 R
/Type /Page
/Resources<</ProcSet [/PDF /Text] /Font 23 0 R >>
/MediaBox [0 0 612 792]
/Annots [15 0 R 20 0 R]
>>
endobj
23 0 obj
<<
/F0 6 0 R
/F1 7 0 R
>>
endobj
在这里,您将名称的间接数组更改为直接名称,将直接字典更改为间接名称。