次のファイルstate.pdfとstate_metadata.pdfをご覧ください。
このようなかつてのルックスのメタデータ:あなたはタイトルと日付を持っていることがわかります
:
このような後者のルックスのメタデータかわった。
今、これが行われたかを知るためにChangeMetadataの例を見てみましょう:タイトルを変更する
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
Map info = reader.getInfo();
info.put("Title", "New title");
info.put("CreationDate", new PdfDate().toString());
stamper.setMoreInfo(info);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XmpWriter xmp = new XmpWriter(baos, info);
xmp.close();
stamper.setXmpMetadata(baos.toByteArray());
stamper.close();
reader.close();
}
は簡単です:作成日を変更
info.put("Title", "New title");
を使用すると、特定のを使用する必要がありますこれは私がPdfDate
オブジェクトを使用した理由です:
info.put("CreationDate", new PdfDate().toString());
旧バージョンのiTextでは、作成日を変更することができない可能性がありますので、最近のiTextバージョンを使用していることを確認してください。
変更日は自動的に変更されます。現在の日付が使用され、これを上書きすることはできません。
次の行のみが情報辞書にメタデータを変更します。
Map info = reader.getInfo();
info.put("Title", "New title");
info.put("CreationDate", new PdfDate().toString());
stamper.setMoreInfo(info);
は、Adobe Readerの古いバージョンを使用している場合は、変更が表示されますが、より多くの最近のPDFビューアが格納されているメタデータを優先XMPメタデータストリームに保存します。あなたは情報辞書にタイトルを変更したことを言うとき
ByteArrayOutputStream baos = new ByteArrayOutputStream();
XmpWriter xmp = new XmpWriter(baos, info);
xmp.close();
stamper.setXmpMetadata(baos.toByteArray());
、あなたは、あなたがXMPを変更してみなければならない変更が表示されていないこと:これはあなたにも新しいXMPストリームを作成する必要があることを意味しますメタデータもお互いに矛盾する2つの異なるメタデータセットを持つPDFは、場合によっては無効なPDFとみなされます(例:PDF/A準拠を満たす必要がある場合)。
作成日は作成日です。 iTextは、その日付を変更することは偽造行為であり、許可しないことを前提としています。変更日は変更日です。 iTextは、現在の日付が偽造行為であり、それを許可しない他の日付を使用すると仮定しています。 –
ok、それはある意味があります。 この場合の元の文書と同じくらいの値は、実際には単なるテンプレートです。 タイトルを変更できないのはなぜですか? (私は科目を追加することができました) –
タイトルを変更することは問題ありません。私も最近のコードをチェックして、 "CreationDate"が変更できないことを知らなかったので、iTextの歴史のどこかで変更されている可能性があります。変更日付のみ変更することはできません。現在の日付が使用されます。 –