iText pdf完整性检查

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iText pdf完整性检查相关的知识,希望对你有一定的参考价值。

我有一个pdf文件,其中:

  • Rev. 1包含文档时间戳
  • 在加时间戳之后添加了一些文本而没有创建新版本
  • 在Rev.2文件中签署

这是来自签名面板

如何使用iText 5验证pdf的完整性?我想检测一下,有人在时间戳之后(Rev.1和Rev.2之间,或Rev.2之后)更改文档。

iText 5是否有可能在Adobe Acrobat评估时检测文档更改,如屏幕所示:

  • “自签署以来,文件已被更改或损坏。”
  • '2 Pages(s)Modified'

下面的伪JAVA代码,总是返回完整性检查OK?对于Rev.1 timestampField,则为true

 PdfReader reader = new PdfReader("C:/tstEditSign.pdf");
 AcroFields acro = reader.getAcroFields();
 PdfPKCS7 pkcs7 = acro.verifySignature("timestampField");
 System.out.println("Integrity check OK? " + pkcs7.verify());

感谢您提供任何帮助或提示,如何解决此问题。

答案

请注意,有两种方法可以违反集成PDF签名的完整性:

  • 它标记的PDF中的字节范围实际上已更改。
  • 在其标记的字节范围引入不允许的更改之后的增量更新中的添加。

iText可以识别第一种类型的更改(使用类似您的伪代码的代码)但它不能开箱即用,区分增量更新中允许和不允许的更改。

Backgrounds

structure

具有多个签名的PDF具有如下图所示的结构:原始版本中的签名signature1仅标记此原始版本的字节。签名2然后签署原始版本加上版本2等的更改。(有关详细信息,请阅读herehere。)

但是根据PDF规范,只允许后续版本应用一组有限的更改,这组更改可能取决于原始签名的属性。 (有关详细信息,请阅读here。)

您的代码,特别是pkcs7.verify(),仅检查签名是否仍然正确地标记它适用的字节。但是,它不会检查第一个签名是否允许后续添加引入的更改类型。

实际上我并不知道有任何非Adobe软件执行该检查,甚至Adobe的检查也不完美:只有在以类似于Adobe软件应用它的方式应用它们时,它们才会偏向于识别允许的更改。这有时会导致相互矛盾的陈述,例如:都

  • 文档作者不允许在应用此签名后对本文档所做的一些更改。
  • 自应用此签名以来,未对此文档进行任何更改。

enter link description here

Implementing a check for (dis)allowed changes

虽然iText不提供开箱即用的检查,但它确实为您提供了一个基础框架,您可以自己尝试并实施它。特别是,您可以检索文档的每个完整签名修订版本,并在简单PDF对象的级别上比较它们的结构。

遗憾的是,允许和不允许的更改仅根据文档在查看器中的外观或其具有的行为来描述,而不是根据允许的哪些精确的低级别对象添加。这将使努力变得非常重要。

以上是关于iText pdf完整性检查的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iText 7 使下划线文本可访问

iText7高级教程之html2pdf——2.使用CSS定义样式

iText7高级教程之html2pdf——2.使用CSS定义样式

iText7高级教程之html2pdf——2.使用CSS定义样式

使用 iText 将 SVG 转换为 PDF,SVG 未在 PDF 中完全显示

有用过itext 7生成PDF的大佬吗