2016-05-09 57 views
3

作成日を&に変更しようとしています。変更日はSuperimposing content from one PDF into another PDFで、sandbox.stamper.SuperImpose.javaです。iTextの設定sandbox.stamper.SuperImpose.javaの作成日と変更日

原則は明確な(と思う)です:

使用getInfo() &その後、HashMap<String, String>またはPdfDictionaryが利用可能であるかどうかに応じて、

info.put(PdfName.CREATIONDATE, new PdfDate(calendar)); 

または

info.put("CreationDate", "D:20160508090344+02'00'"); 

を行います。

しかしどこですか?私はちょうどコードを挿入するための適切な場所を見つけることができないようです...私もオリジナルのタイトル属性を上書きするのに問題があります。

+0

作成日は作成日です。 iTextは、その日付を変更することは偽造行為であり、許可しないことを前提としています。変更日は変更日です。 iTextは、現在の日付が偽造行為であり、それを許可しない他の日付を使用すると仮定しています。 –

+0

ok、それはある意味があります。 この場合の元の文書と同じくらいの値は、実際には単なるテンプレートです。 タイトルを変更できないのはなぜですか? (私は科目を追加することができました) –

+0

タイトルを変更することは問題ありません。私も最近のコードをチェックして、 "CreationDate"が変更できないことを知らなかったので、iTextの歴史のどこかで変更されている可能性があります。変更日付のみ変更することはできません。現在の日付が使用されます。 –

答えて

1

次のファイルstate.pdfstate_metadata.pdfをご覧ください。

このようなかつてのルックスのメタデータ:あなたはタイトルと日付を持っていることがわかります

enter image description here

enter image description here

このような後者のルックスのメタデータかわった。

今、これが行われたかを知るために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準拠を満たす必要がある場合)。

+0

大丈夫、ありがとうございました。その間、私はstamper.createXmpMetadata()をコメントアウトしてXMPメタデータの作成を無効にしました。 &Creation Dateと他のメタデータのほとんどを変更することができましたが、Modification Dateはまだいくつかの抵抗を抱いていました:)それでは、上記で提案したXMPメタデータを試してみましょう。再度、感謝します。 –

+0

変更日時は、システムの現在の日付と時刻に自動的に設定されます。 –

+0

Hmmm、たぶん 'PdfStamper.unethical = true;'のようなものかそれに類するものです。とにかく、私は古いInfoと新しいXMPの両方を書き込むように修正しました。すべては大変です。そして、私が本当に「非倫理的」であると感じたら、私はちょうどマシン時間を設定することができます:)多くの、多くのありがとうございます。 –

関連する問題