更改PDF然后删除更改时,还原文件和原始文件的哈希值不同

布莱恩

如果我访问PDF以使用代码File src_2 = new File(embed_source)在自定义属性中添加某些内容;文件dest_2 =新文件(embed_destination_2);

                    try {
                        FileUtils.copyFile(src_2, dest_2);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }          
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
            PdfReader reader = new PdfReader(src);
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
            Map<String, String> info = reader.getInfo();
            System.out.println(info.get("Lala"));

            stamper.setMoreInfo((HashMap<String, String>) info);
            stamper.close();
            reader.close();
        }

我没有更改有关src文件的任何内容,我所做的只是获取有关src文件的一些信息。但是,在运行程序之前和之后,我从src文件中获得了2种不同的哈希结果。我可以知道为什么吗?

布鲁诺·洛瓦吉(Bruno Lowagie)

如果你读了ISO-32000-1,你应该知道,没有两个PDF文件是相等的设计两个PDF之间最典型的区别之一是ID:

从ISO-32000-1:

ID:组成文件标识符的两个字节字符串的数组。

在标题为“文件标识符”的第14.4节中:

该条目的值应为两个字节字符串的数组。第一个字节字符串应是基于文件最初创建时的内容的永久标识符,并且在文件进行增量更新时不得更改。第二个字节字符串应是基于文件上次更新时内容的变化标识符。首次写入文件时,两个标识符应设置为相同的值。如果在解析文件引用时两个标识符都匹配,则很可能已找到正确且未更改的文件。如果仅第一个标识符匹配,则找到了正确文件的其他版本。

如果从头开始创建PDF,则ID由两个相同的标识符组成。当您更新PDF以添加某些内容时,将保留第一个ID,然后更改第二个ID。如果您更新PDF删除了某些内容,则会再次更改第二个ID,但是根据定义,它不应与第一个ID相同,因为您位于工作流程的不同部分。

注意:创建标识符相同的PDF的工具并不多。这是因为通常在从最终版本保存到磁盘之前对从头创建的PDF进行操作。只需使用Adobe Acrobat创建PDF即可重现此内容:您会注意到标识符对由两个不同的值组成。这使得问这个问题毫无用处:我们是否可以创造一种情况,使第二个标识符与第一个标识符相同?

此外:PDF的固有特征是对象的组织方式是随机的。您使用哈希的用例违反了PDF标准。

如何解决这个问题呢?

您是问[如何]使用自定义属性从PDF添加/删除/检索信息的同一个人

在对这个问题的回答中,我解释了如何将元数据添加到现有的PDF中:

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));

这将创建一个新的PDF文件,在其中对对象进行重新排序。

但是,您可以将此行更改为:

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest), '\0', true);

现在,您正在创建PDF文件增量更新

什么是增量更新?

假设您的原始PDF文件如下所示:

%PDF-1.4
% plenty of PDF objects and PDF syntax
%%EOF

当您使用iText操作此类文件时,您将得到一个更改后的PDF文件

%PDF-1.4
% plenty of altered PDF objects and altered PDF syntax
%%EOF

在此过程中,可以对对象进行重编号,重组等。如果您在第一次执行中添加了某些内容,而在第二次执行中删除了某些内容,则可以预期在打开文档时,PDF看起来与人眼相同PDF查看器,但您不应期望PDF语法相同。该假设将显示出完全缺乏PDF格式的洞察力。

但是,当PdfStamper追加模式下执行增量更新时,会得到增量更新的PDF

%PDF-1.4
% plenty of PDF objects and PDF syntax
%%EOF
% updates for PDF objects and PDF syntax
%%EOF

在这种情况下,原始PDF的原始字节不会更改。文件大小变大,因为您现在将拥有一些冗余信息(不再使用某些对象,对于某些对象,您将拥有旧版本和新版本),但是使用增量更新的优势在于:您可以随时返回到原始文件。

搜索的倒数第二个出现%%EOF并删除所有后续字节就足够了,您将获得一个截断的PDF文件

%PDF-1.4
% plenty of PDF objects and PDF syntax
%%EOF

现在,您可以对该截断的PDF文件进行哈希处理,并将其与原始PDF文件的哈希进行比较这些哈希将是相同的。

警告:谨防其后的空白字符%%EOF它们可以在字节级别引起最小差异,从而导致哈希值不同。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

备份和还原文件权限

来自分类Dev

Git还原文件在本地分支中删除

来自分类Dev

使用rsync从tar还原文件

来自分类Dev

无法使用extundelete还原文件

来自分类Dev

从还原文件创建新数据库并更改主数据库文件位置

来自分类Dev

Windows 10-“将跳过的还原文件:[file]还原到原始位置”

来自分类Dev

rdiff-backup-备份文件夹小于原始/还原文件时的错误

来自分类Dev

如何撤消垃圾桶中的还原文件或获取还原文件的列表?

来自分类Dev

错误备份/还原后,Linux ext4还原文件和目录访问权限

来自分类Dev

我删除了/ etc / php5。如何还原文件夹?

来自分类Dev

我删除了/ etc / php5。如何还原文件夹?

来自分类Dev

如何在本地存储中保存和还原文件对象

来自分类Dev

从base64编码还原文件名和扩展名

来自分类Dev

通过SQL Server 2012备份和还原文件FileTable

来自分类Dev

如何防止Windows 7创建系统还原文件和卷影副本?

来自分类Dev

使用IntelliJ IDEA从git存储库还原文件

来自分类Dev

git:部分还原文件的先前版本

来自分类Dev

使用压缩执行rsync后还原文件

来自分类Dev

Windows复制后还原文件权限

来自分类Dev

如何还原文件复制/传输状态窗口?

来自分类Dev

Windows 上的 Git LFS:无法还原文件

来自分类Dev

Git 保持相同提交但还原文件

来自分类Dev

如何创建分区(ext4)的映像,然后再挂载它以浏览/还原文件?

来自分类Dev

从备份还原文件属性但不还原完整文件

来自分类Dev

使用deja-dup还原文件失败,并显示“无法还原/ home / user /%N”

来自分类Dev

从根目录rm -r还原文件路径中的文件的最佳工具是什么?

来自分类Dev

使用SVN时是否可以还原文件中的特定行?

来自分类Dev

在启用了版本的Amazon S3存储桶上还原文件

来自分类Dev

LibGit2Sharp CheckoutPaths()可以在不指定分支的情况下还原文件

Related 相关文章

  1. 1

    备份和还原文件权限

  2. 2

    Git还原文件在本地分支中删除

  3. 3

    使用rsync从tar还原文件

  4. 4

    无法使用extundelete还原文件

  5. 5

    从还原文件创建新数据库并更改主数据库文件位置

  6. 6

    Windows 10-“将跳过的还原文件:[file]还原到原始位置”

  7. 7

    rdiff-backup-备份文件夹小于原始/还原文件时的错误

  8. 8

    如何撤消垃圾桶中的还原文件或获取还原文件的列表?

  9. 9

    错误备份/还原后,Linux ext4还原文件和目录访问权限

  10. 10

    我删除了/ etc / php5。如何还原文件夹?

  11. 11

    我删除了/ etc / php5。如何还原文件夹?

  12. 12

    如何在本地存储中保存和还原文件对象

  13. 13

    从base64编码还原文件名和扩展名

  14. 14

    通过SQL Server 2012备份和还原文件FileTable

  15. 15

    如何防止Windows 7创建系统还原文件和卷影副本?

  16. 16

    使用IntelliJ IDEA从git存储库还原文件

  17. 17

    git:部分还原文件的先前版本

  18. 18

    使用压缩执行rsync后还原文件

  19. 19

    Windows复制后还原文件权限

  20. 20

    如何还原文件复制/传输状态窗口?

  21. 21

    Windows 上的 Git LFS:无法还原文件

  22. 22

    Git 保持相同提交但还原文件

  23. 23

    如何创建分区(ext4)的映像,然后再挂载它以浏览/还原文件?

  24. 24

    从备份还原文件属性但不还原完整文件

  25. 25

    使用deja-dup还原文件失败,并显示“无法还原/ home / user /%N”

  26. 26

    从根目录rm -r还原文件路径中的文件的最佳工具是什么?

  27. 27

    使用SVN时是否可以还原文件中的特定行?

  28. 28

    在启用了版本的Amazon S3存储桶上还原文件

  29. 29

    LibGit2Sharp CheckoutPaths()可以在不指定分支的情况下还原文件

热门标签

归档