即时通讯使用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();
Run Code Online (Sandbox Code Playgroud)
和使用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
Run Code Online (Sandbox Code Playgroud)
谢谢你的任何提示
你所看到的标示为PdfID0
和PdfID1
通过pdftk
的元数据倾销以下PDF的一部分,trailer
在各自的PDF文件(例如)结束代码:
trailer
<< /Size 32
/Root 24 R
/Info 19 R
/ID [
<28c71a8d7790a4d3e85ce879a90dec0>
<4c5865d36c7a381e6166d5e362d0aafc>
]
>> startxref
81799
%%EOF
Run Code Online (Sandbox Code Playgroud)
的/ID
在拖车字典条目是必需仅当一个Encrypt
条目存在; 否则它是一个可选键.
它由PDF规范描述为:
"一个由两个字节串组成的数组,构成文件的文件标识符(见14.4,"文件标识符").如果有一个加密条目,这个数组和两个字节串应该是直接对象,并且应该是未加密的."
而且:
"第一个字节字符串应该是基于文件最初创建时的内容的永久标识符,并且在文件逐步更新时不应更改.第二个字节字符串应该是基于文件内容的更改标识符.上次更新的时间.首次写入文件时,两个标识符应设置为相同的值.如果两个标识符在解析文件引用时匹配,则很可能找到了正确且未更改的文件.只有第一个标识符匹配,才找到正确文件的不同版本."
它是不是 necesarrily 哈希.这是ISO PDF规范建议的内容(不是"规定"):
"为了帮助确保文件标识符的唯一性,应使用以下信息,通过消息摘要算法(如Internet RFC 1321,MD5消息摘要算法 ;参见参考书目)中的方法计算它们:
- 现在的时间
- 文件位置的字符串表示形式,通常是路径名
- 文件的大小(以字节为单位)
- 文件信息字典中所有条目的值(见14.3.3,"文档信息字典")
生成的PDF文件中还有一些位置可能会随着每次新运行而改变.文档信息字典中的这些键(/Info
预告片中引用的条目)
/CreationDate
/ModDate
每次创建或修改PDF时都可能会更新.
因此,使用自己的MD5校验和在生产PDF检查新/更改的文件将无法正常工作,除非你确保你至少是"正常化"的/CreationDate
和/ModDate
,以及在/ID
你面前项创建MD5哈希值.
更新:正如用户mkl在对此答案的评论中正确指出的那样,字典的键/CreationDate
和/ModDate
键/Info
(以及/ID
信息)通常具有包含在PDF中嵌入的XML元数据中的等效信息.您可以在pdfinfo
实用程序的帮助下显示完整的XML元数据,如下所示:
pdfinfo -meta your.pdf
Run Code Online (Sandbox Code Playgroud)
关于标识符... pdf 规范说:
\n\n文件标识符应由 PDF 文件\xe2\x80\x99s 预告片字典中的可选 ID 条目定义(请参阅 7.5.5,\xe2\x80\x9cFile Trailer\xe2\x80\x9d)。ID 条目是可选的,但应该使用。该条目的值应是两个字节字符串的数组。第一个字节字符串应是基于文件最初创建时的内容的永久标识符,并且在文件增量更新时不应更改。第二个字节字符串应是基于上次更新时文件\xe2\x80\x99s 内容的变化标识符。当第一次写入文件时,两个标识符应设置为相同的值。如果解析文件引用时两个标识符都匹配,则很可能已找到正确且未更改的文件。如果只有第一个标识符匹配,则已找到正确文件的不同版本。
\n\n标识符是可选的,但建议使用。
\n\nIText 自动插入和更新标识符。您当然可以更改 iText(毕竟它是开源的)以不这样做。
\n