5

iTextを使用してxhtmlをpdfに変換します。その後、新しい/変更されたファイルのみを保存するために、生成されたpdfのmd5チェックサムを作成しています。

作成されたすべてのファイルには、ハッシュのように見えるPdfID0とPdfID1が含まれています。

それらの「ハッシュ」は何のためのものですか?どうすればそれらを削除できますか?

iTextパッケージの次のコードを使用してmetainfoを変更します。

        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

ヒントをありがとう

4

2 に答える 2

7

のメタデータダンピングとしてラベル付けされているPdfID0のは、それぞれのPDFファイルの最後にある次のPDFコードの一部です(例)。PdfID1pdftktrailer

trailer
   << /Size 32
      /Root 24 R
      /Info 19 R
      /ID [ 
            <28c71a8d7790a4d3e85ce879a90dec0>
            <4c5865d36c7a381e6166d5e362d0aafc>
          ]
   >> startxref
81799
%%EOF

トレーラー辞書のエントリは、エントリが存在/IDする場合にのみ必要です。Encryptそれ以外の場合は、オプションのキーです。

PDF仕様では次のように説明されています。

「ファイルのファイル識別子(14.4 「ファイル識別子」を参照)を構成する2つのバイト文字列の配列。Encryptエントリがある場合、この配列と2つのバイト文字列は直接オブジェクトであり、暗号化されないものとします。」

そしてさらに:

「最初のバイト文字列は、ファイルが最初に作成されたときのファイルの内容に基づく永続的な識別子であり、ファイルが段階的に更新されても変更されません。2番目のバイト文字列は、ファイルの内容に基づく変更識別子です。ファイルが最初に書き込まれるとき、両方の識別子が同じ値に設定されます。ファイル参照が解決されたときに両方の識別子が一致する場合、正しい変更されていないファイルが見つかった可能性が非常に高くなります。最初の識別子のみが一致し、正しいファイルの異なるバージョンが見つかりました。」

そして、それは必ずしもハッシュではありません。ISO PDF仕様が示唆していることは次のとおりです(「規定」ではありません)。

「ファイル識別子の一意性を確保するには、MD5などのメッセージダイジェストアルゴリズム(インターネットRFC 1321、MD5メッセージダイジェストアルゴリズム。参考文献を参照)を使用して、次の情報を使用して計算する必要があります。

  • 現在の時刻
  • ファイルの場所の文字列表現、通常はパス名
  • ファイルのサイズ(バイト単位)
  • ファイルのドキュメント情報ディクショナリのすべてのエントリの値(14.3.3「ドキュメント情報ディクショナリ」を参照)

生成されたPDFファイルには、新しい実行ごとに変更される可能性のあるスポットがさらにいくつかあります。ドキュメント情報ディクショナリのこれらのキー(/Infoトレーラーで参照されるエントリ)

  • /CreationDate
  • /ModDate

PDFを作成または変更するたびに更新される場合があります。

したがって、 MD5ハッシュを作成する前に、エントリ/CreationDate/ModDate同様に少なくとも「正規化」していることを確認しない限り、生成されたPDFに対して独自のMD5チェックサムを使用して新しい/変更されたファイルをチェックすることはできません。/ID


更新:ユーザーmklがこの回答へのコメントで正しく指摘しているように、辞書のキー/CreationDate/ModDateキー(および情報)には通常、PDFに埋め込まれたXMLメタデータに含まれる同等の情報が含まれています。次のようなユーティリティを使用して、完全なXMLメタデータを表示できます。/Info/IDpdfinfo

pdfinfo -meta your.pdf
于 2012-11-02T13:01:18.070 に答える
1

識別子について...PDF仕様には次のように書かれています。

ファイル識別子は、PDFファイルのトレーラーディクショナリのオプションのIDエントリによって定義されます(7.5.5「ファイルトレーラー」を参照)。IDエントリはオプションですが、使用する必要があります。このエントリの値は、2バイトの文字列の配列でなければなりません。最初のバイト文字列は、ファイルが最初に作成されたときのファイルの内容に基づく永続的な識別子であり、ファイルが段階的に更新されても変更されません。2番目のバイト文字列は、ファイルが最後に更新されたときのファイルの内容に基づいて変化する識別子になります。ファイルが最初に書き込まれるとき、両方の識別子は同じ値に設定されなければなりません。ファイル参照が解決されたときに両方の識別子が一致する場合は、正しく変更されていないファイルが見つかった可能性が非常に高くなります。最初の識別子のみが一致する場合は、正しいファイルの別のバージョンが見つかりました。

これ、識別子はオプションですが、推奨されます。

ITextは、識別子を自動的に挿入および更新します。もちろん、iText(結局のところオープンソースです)を変更して、それを行わないようにすることもできます。

于 2012-11-02T13:05:53.230 に答える