有什么方法可以识别 PDF 是否被编辑/篡改以及使用 Python 编辑/篡改 PDF 的确切位置?

问题描述

我正在努力识别银行对帐单 PDF 文档中的伪造/篡改。 信息元数据和 XMP 元数据并不总是出现在我拥有的 PDF 中,因此我无法创建任何通用规则来识别篡改的 PDF。我正在使用 Python 库,例如 PyMuPDF、PDFMiner、PyPDF2 等。

我有两个问题:

  1. 是否有任何具体方法可以识别 PDF 是否被篡改(使用 Python 或任何其他开源技术)?
  2. 如果 PDF 被篡改,那么 PDF 的哪一部分被篡改(使用 Python 或任何其他开源技术)?

附上 2 个 PDF 以供参考 -

原文:- “sbi statment_out2.pdf” 链接 - https://drive.google.com/file/d/1DoWAKYcCudRO-Cwjbgf7RjiJUsF3DD3s/view?usp=sharing

使用 Sejda 在线编辑器篡改:- “sbi statment_out2_Sejda_edited.pdf 链接 - https://drive.google.com/file/d/1J4eRy9tO3jN8AqEWNrKXtn40G6vdH5G3/view?usp=sharing

在经过调整的 PDF 中,我已将“信用”列下的“2,412.00”编辑为“12.00”。

如果有任何开源解决方案,请告诉我,最好使用 Python。

谢谢。

解决方法

确保 PDF 不被篡改的规范方法是只接受原始作者带有数字签名的 PDF 并验证它们,正如 Frank 已经通过 Adob​​e 论坛链接指出的那样。

其变化可能是

  • PDF 制作者通过不同的安全渠道共享了 PDF 的哈希值以供您验证,或
  • PDF 的制作者使用只有他们知道的私钥对 PDF 进行加密,然后您使用匹配的(可能是公钥)对其进行解密。

如果正确实施,这种加密方法是相当安全的。


遗憾的是,这些安全方法要求 PDF 的制作者在发布 PDF 时进行相应的合作。

如果制作者不合作而只是发布没有这种加密保护的 PDF,您仍然可以比较应该以类似方式创建的 PDF 的内部细节。如果这些内部细节差异很大,要么是有人业余篡改了 PDF,要么是 PDF 制作者更新或更换了 PDF 制作软件。

就您的示例文件而言,此类细节存在许多差异,例如

  • 原件声称符合 PDF-1.4,经处理的副本为 PDF-1.5。
  • 原始对 PDF 对象使用交叉引用表,复制交叉引用流。
  • 与“SAMBox 2.2.12”相比,原件和副本具有不同的Producer 条目,即“iText 2.0.4(by lowagie.com)”。
  • 原件在声明的文档日期上有一个 ModDate 条目,副本在此之后有一个很长的时间。
  • 原始 PDF 中的 ID 部分彼此不同,副本中的 ID 部分一致。
  • 副本具有用于独立添加内容的典型页面内容流结构,而原始没有。
  • 副本有一个没有文本的文本对象(原始文本对象的其余部分绘制了后来删除的数字),原始文本没有。
  • 原表中的数字仅使用灰度颜色,副本也使用RGB颜色。
  • ...

当然,您可以使用 Python PDF 库来检查此类详细信息并确定分歧。

但要注意,这样你只能抓到不熟的伪造者。了解其业务的伪造者几乎不会在其输出中留下任何此类痕迹...

,

Adobe 表示,除非经过签名,否则无法检测 pdf 是否已被修改。

https://community.adobe.com/t5/acrobat-reader/how-to-detect-a-modified-pdf-file/td-p/3546278

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...