我使用iText将xhtml转换为pdf。之后,我正在构建生成的pdf的md5校验和,以仅存储新的/更改的文件。
每个创建的文件都包含一个看起来像哈希的PdfID0和PdfID1。
那些“哈希”是什么?以及如何删除它们?
我使用iText包中的以下代码来更改metainfos:
com.lowagie.text.pdf.PdfReader reader = new PdfReader(pdfPath);
com.lowagie.text.pdf.PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(tempFile));
HashMap<String, String> hMap = reader.getInfo();
hMap.put("Title", "MyTitle");
hMap.put("Subject", "Subject");
hMap.put("Keywords", "Key, words, here");
hMap.put("Creator", "me");
hMap.put("Author", "me");
hMap.put("Producer", "me");
hMap.put("CreationDate", null);
hMap.put("ModDate", null);
hMap.put("DocChecksum", null);
stamper.setMoreInfo(hMap);
stamper.close();
使用pdftk:
提取的文件元数据InfoKey: Creator
InfoValue: me
InfoKey: Title
InfoValue: MyTitle
InfoKey: Author
InfoValue: me
InfoKey: Producer
InfoValue: me
InfoKey: Keywords
InfoValue: Key, words, here
InfoKey: Subject
InfoValue: Subject
PdfID0: 28c71a8d7790a4d3e85ce879a90dec0
PdfID1: 4c5865d36c7a381e6166d5e362d0aafc
NumberOfPages: 1
感谢任何提示
答案 0 :(得分:6)
您通过PdfID0
的元数据转储标记为PdfID1
和pdftk
的内容是相应末尾的以下PDF trailer
代码的一部分PDF文件(示例):
trailer
<< /Size 32
/Root 24 R
/Info 19 R
/ID [
<28c71a8d7790a4d3e85ce879a90dec0>
<4c5865d36c7a381e6166d5e362d0aafc>
]
>> startxref
81799
%%EOF
仅当存在/ID
条目时,才需要预告片字典中的Encrypt
条目;否则它是一个可选的键。
PDF规范描述为:
&#34;两个字节串的数组,构成文件的文件标识符(参见14.4,&#34;文件标识符&#34; )。如果有一个加密条目,这个数组和两个字节串应该是直接对象,并且应该是未加密的。&#34;
此外:
&#34;第一个字节字符串应该是基于文件最初创建时的内容的永久标识符,并且在文件逐步更新时不应更改。第二个字节字符串应该是基于上次更新时文件内容的更改标识符。首次写入文件时,两个标识符应设置为相同的值。如果解析文件引用时两个标识符都匹配,则很可能找到了正确且未更改的文件。如果只有第一个标识符匹配,则找到正确文件的不同版本。&#34;
NOT 必然 哈希 。以下是ISO PDF规范建议(不是&#34;规定&#34;):
&#34;为了帮助确保文件标识符的唯一性,它们应该通过消息摘要算法(如MD5)进行计算(在Internet RFC 1321中描述, MD5消息摘要算法 ;参见参考书目),使用以下信息:
- 当前时间
- 文件位置的字符串表示形式,通常是路径名
- 文件大小(以字节为单位)
- 文件文档信息词典中所有条目的值(见14.3.3,“文档信息词典”)
生成的PDF文件中还有一些位置可能会随着每次新运行而改变。文档信息字典中的这些键(预告片中引用的/Info
条目)
/CreationDate
/ModDate
。
因此,对生成的PDF使用您自己的MD5校验和来检查新的/更改的文件是行不通的,除非您确保至少“正常化”&#39;在创建MD5哈希之前,/CreationDate
和/ModDate
以及/ID
条目。
更新:在此答案的评论中正确注明用户 mkl ,/CreationDate
和/ModDate
键{{1} } dictionary(以及/Info
info)通常具有包含在PDF中嵌入的XML元数据中的等效信息。您可以在/ID
实用程序的帮助下显示完整的XML元数据,如下所示:
pdfinfo
答案 1 :(得分:1)
关于标识符...... pdf规范说:
文件标识符应由PDF文件的预告片字典中的可选ID条目定义(参见7.5.5,“文件预告片”)。 ID条目是可选的,但应该使用。该条目的值应为两个字节字符串的数组。第一个字节字符串应该是基于文件最初创建时的内容的永久标识符,并且在文件逐步更新时不应更改。第二个字节字符串应该是基于上次更新时文件内容的更改标识符。首次写入文件时,两个标识符应设置为相同的值。如果解析文件引用时两个标识符都匹配,则很可能找到了正确且未更改的文件。如果只有第一个标识符匹配,则找到正确文件的不同版本。
这个,标识符是可选的,但建议使用。
IText会自动插入和更新标识符。你当然可以改变iText(毕竟它是开源的)不要这样做。