PDF文件是否经过另一次修改?

时间:2013-11-11 10:19:42

标签: pdf pdf-generation digital-signature pdfbox acrobat

我使用PDFbox来签署PDF。它工作得很好。我可以在一个文档中添加几个签名,一切运行良好。

现在,有人给我签了一份文件(她用另一个软件签名),这个签名也有效。但是当我在他的文档中添加另一个修订版(通过pdfbox)时,Adobe读者告诉我PDF已被修改。

  1. 这是原始文件:this

  2. 这是由其他软件完成的签名文件:link

  3. 当我在签名的pdf中添加另一个修订版时,我收到了这个有问题的文档:link

  4. 如果我向我的软件签名的PDF添加另一个修订版,则没有问题link

1 个答案:

答案 0 :(得分:5)

简而言之:

您的代码会对现有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)更改为间接词典的直接数组(在新对象3中)(您的新对象18和19)。这是不必要的,因此,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 

在这里,您将名称的间接数组更改为直接名称,将直接字典更改为间接名称。