如果我访问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种不同的哈希结果。我可以知道为什么吗?
如果你读了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] 删除。
我来说两句