删除PDF格式的PDFID

met*_*tar 4 java pdf itext

即时通讯使用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)

谢谢你的任何提示

Kur*_*fle 6

你所看到的标示为PdfID0PdfID1通过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)


mkl*_*mkl 1

关于标识符... 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\n

IText 自动插入和更新标识符。您当然可以更改 iText(毕竟它是开源的)以不这样做。

\n