4

既存の複数の PDF を単一の新しい PDF にインポートする必要があります。コードの一部は、 iText in Action 2nd editionのセクション 6.2.1 のサンプル コードと同様に機能します。

Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(
    document, new FileOutputStream(RESULT));
document.open();
PdfPTable table = new PdfPTable(2);
PdfReader reader = new PdfReader(MovieTemplates.RESULT);
int n = reader.getNumberOfPages();
PdfImportedPage page;
for (int i = 1; i <= n; i++) {
    page = writer.getImportedPage(reader, i);
    table.addCell(Image.getInstance(page));
}
document.add(table);
document.close();

ただし、注釈付きの入力可能な PDF (この場合、これらの PDF には既にデータが入力されています) を処理すると、新しい PDF では入力されたデータがすべて失われることに気付きました。

本の同じセクションで答えを見つけました。

ページのコンテンツをレンダリングするために必要なリソースと、ページのインタラクティブな機能の違いを理解することが重要です。一般に、これらの機能は注釈と呼ばれます。これには、リンク、テキスト注釈、およびフォーム フィールドが含まれます。注釈はコンテンツ ストリームの一部ではありません。これらは、ページのリソース ディクショナリにはリストされていませんが、注釈ディクショナリにはリストされています。これらのインタラクティブな機能は、 を使用する場合はコピーされません。つまり、クラスのメソッドをPdfImportedPage使用してページをコピーすると、すべてのインタラクティブ性が失われます。getImportedPage()PdfWriter

しかし、それらの注釈を保持するための解決策は何ですか?

4

1 に答える 1

5

あなたが参照している本の著者として、本の例がやや古くなっていることを指摘したいと思います。この本ではPdfCopyFields、フォームをマージするために使用するようにアドバイスされていますが、そのクラスは iText の最近のバージョンでは廃止されています。

新しい例をご覧ください。

つまり、クラスを使用してフォームをコピー/マージできるようになりましたが、次のコード スニペットで行われているように、フィールドをマージする必要があることPdfCopyを伝えるためにインポートされます。PdfCopy

public void createPdf(String filename) throws IOException, DocumentException {
    PdfReader[] readers = {
        new PdfReader(getFile1()),
        new PdfReader(getFile2())
    };
    createPdf(filename, readers);
}

public void createPdf(String filename, PdfReader[] readers)
    throws IOException, DocumentException {
    Document document = new Document();
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));
    copy.setMergeFields();
    document.open();
    for (PdfReader reader : readers) {
        copy.addDocument(reader);
    }
    document.close();
    for (PdfReader reader : readers) {
        reader.close();
    }
}

setMergeFields()メソッドは、覚えておく必要があるメソッドです。

于 2014-10-04T17:29:33.057 に答える