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

gre*_*rep 2 pdf acrobat pdf-generation digital-signature pdfbox

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

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

  1. 那是原始文件:这个

  2. 这是由另一个软件完成的签名文件:链接

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

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

mkl*_*mkl 6

简而言之:

您的代码对现有PDF对象应用了不必要的更改.

一些变化仅仅是结构性的,而不是改变实际内容.Acrobat Reader可能会也可能不会忽略这些结构更改.但是在这个过程中你引入了舍入误差,它们最终构成了一个变化.

结构变化可能是由PDFBox的怪癖引起的,迫使其偏好哪种对象应直接或间接地接触到它接触的现有对象.

并且当涉及安全特征时,实际上几乎不相关的舍入错误肯定是不可行的.

当您使用PDFBox对文档签名两次时,初始签名过程已经强制PDFBox的首选项进入文档,因此,第二个签名过程不再通过再次强制将相同的首选项强制转换为其结果来销毁任何内容.

细节:

来自原始签名的原文- 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
Run Code Online (Sandbox Code Playgroud)

您重新签名的原始签名签名-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 
Run Code Online (Sandbox Code Playgroud)

因此,实质上,您的代码将直接字典的间接数组(对象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
Run Code Online (Sandbox Code Playgroud)

你改成了什么

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 
Run Code Online (Sandbox Code Playgroud)

在这里,您可以将间接数组名称更改为直接名称,将直接字典更改为间接名称.

  • *我在pdfbox示例*中签署文档 - 然后它是PDFBox核心错误或PDFBox示例错误.如上所述,PDFBox对于哪些对象应该是直接的而哪些不是直接而非常顽固,我确实认为这是这里的基本问题.您可能希望将此报告为PDFBox开发的问题. (2认同)