gpt4 book ai didi

pdf - 如何在 iText 中获取 AcroField 修订的名称?

转载 作者:行者123 更新时间:2023-12-04 11:19:24 28 4
gpt4 key购买 nike

我目前正在开发一种用于在 pdf 文档上应用和验证数字签名的工具。我了解 pdf 文档中的每个签名都适用于 AcroFields 的某个版本。每次用户更改某些输入(即通过填写 pdf 表单)时,都会创建一个新版本。

我的问题是:如何检索 所有修订 来自 AcroFields 对象?我知道如何获得 单例修订版,如果我有这样的名字:

AcroFields fields = ...;
fields.getRevision("revision1");

但是我如何检索 所有修订 (或至少他们的名字)?到目前为止,我还没有在 iText API 和网络中找到任何东西。

我在 2.1.7 版中使用 iText。

感谢致敬,
汤姆

最佳答案

先来一些背景

通常,PDF 文件由标题、正文、交叉引用信息和尾部组成,请参见下图 2。更新此类 PDF 文件时,您可以选择

  • 要么重新构建整个文档并集成所有更改(这会导致再次像原始文档一样形成 PDF)
  • 或者您可以将正文元素的更改和交叉引用附加到文档,并添加一个新的预告片也引用前一个预告片(这会导致形成如下图 3 所示的 PDF)。

  • 但实际上有一些介于两者之间的形式。例如。一些工具只是切断原始文档的交叉引用和预告片,然后添加它们新的或更改的正文元素、新的完整交叉引用和一个新的预告片,而没有对某些以前的状态进行任何反向引用。

    Initial structure of a PDF file
    Structure of an updated PDF file

    (从 PDF 规范复制的图像 ISO 32000-1:2008)

    在形成如图 3 所示的 PDF 的情况下,我们手头有一份 PDF 不同状态的历史记录,每个状态都从文件的开头开始,一直到并包括其中一个预告片。这些状态通常被称为文档的修订版本,并且文档的每个修订版本显然都反射(reflect)了 PDF 表单信息的某些状态,我认为这就是您所说的 AcroFields 的修订版本。

    与您的假设相反,这些修订本身没有名称。除非您使用 ID 的第二部分(对于不同的修订版应该有所不同),否则 AFAIK 不用作 iText 中任何内容的名称。

    拖车停止和下一次 body 更新开始的确切点存在一些不精确性。一方面,规范中有一些迫在眉睫的选择(不同的可能换行符、忽略的空格、忽略的注释行),另一方面,许多 PDF 制作者无论如何都有点超出规范。这与上面提到的完全更新和增量更新之间的中间变体相结合,有时会使提取修订的过程有些麻烦。

    有一种可以高度可靠地识别修订的特殊情况:签名修订,即其最后一次正文更新包含文档的集成签名的修订。由于文档的签名字节范围必须包含所有文档修订版,但签名本身留下了空白(至少要被 Adob​​e 软件接受并符合 PAdES 和 PDF-2 标准),因此文档的确切结尾在这种情况下,可以从签名信息中推断出修订:

    Multiple integrated signatures

    更多详情 here .

    一些问题的解答

    I understand that each signature in a pdf document is applied to a certain revision of the AcroFields.



    如上所述,每个都应用于文档的某个修订版,然后暗示表单数据的某个状态或“修订版”。

    Each time the user changes some input (i.e. by filling out a pdf form), a new revision is created.



    不必要。如上所述,有许多中间方法用于更新。

    只有在更改了最新版本已签名的文档的信息时,才需要适当的增量更新,否则该签名不会被删除或失效。否则,更新者可以获取在最后一个签名之后添加的所有信息,使用他希望的任何内容创建自己的更新,并将该更新附加到文档的最后一个签名修订版。此更新甚至可能包含多个虚拟更新块,目的是让您相信某些中间版本确实存在。

    因此,只有经过签名的修订才能以某种方式被信任为真实。 iText 仅提供对此类签名修订的访问。

    My question is: how can I retrieve all revisions from an AcroFields object?



    您可以使用
    InputStream revisionStream = fields.extractRevision("name");

    并在单独的 PdfReader 中打开它们实例。然后,您可以通过查询 AcroFields 来访问这些签名修订中的每一个的 PDF 表单信息。各自 PdfReader 的实例为该修订打开。

    (顺便说一句, String 参数不是修订版的名称,而是其签名对该修订版进行签名的签名字段的名称。)

    But how can I retrieve all revisions (or their names, at least)? I haven't found anything in the iText API and the web so far.



    如前所述,这些修订名称实际上是签名字段名称。因此,您可以使用
    List<String> names = fields.getSignatureNames()

    检索可以提取修订的所有名称。

    关于pdf - 如何在 iText 中获取 AcroField 修订的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17169318/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com