【问题标题】:PDF document is modified by another revision?PDF 文档被另一个版本修改了?
【发布时间】:2013-11-23 02:36:56
【问题描述】:

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

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

  1. 那是原始文件:this

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

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

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

【问题讨论】:

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


    【解决方案1】:

    简而言之:

    您的代码对现有 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 中)。这是不必要的,因此 Adob​​e 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 
    

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

    【讨论】:

    • 据我了解,这是 pdfbox 错误吗?我像在 pdfbox 示例中一样签署文件。您如何看待解决这个问题?
    • 我像在 pdfbox 示例中一样签署文档 - 那么它要么是 PDFBox 核心错误,要么是 PDFBox 示例错误。如上所述,PDFBox 对于哪些对象应该是直接的,哪些不是,非常固执,我确实认为这是这里的基本问题。您可能希望将此作为问题报告给 PDFBox 开发。
    • 我在 pdfbox jira 中打开错误:issues.apache.org/jira/browse/PDFBOX-1778 谢谢你的回答 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 2010-09-24
    • 2018-06-23
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多