1

私の知る限り、PDF はオブジェクトへの参照をサポートしています。たとえば、ドキュメントで同じ画像を 100 回使用すると、各場所で同じ画像を使用するように最適化でき、PDF サイズを大幅に節約できます。

PDF は全ページのデータで同じことをサポートしますか? はいの場合、どうすればiTextライブラリでそれを行うことができますか?

私の問題は、約 500 ページの巨大なドキュメントがあり、2 ~ 3 ページごとに、他の PDF ドキュメントから読み取った同じテンプレート ページを挿入する必要があることです。コードは次のようになります。

    protected static void addAppendix(PdfWriter writer, Document document, InputStream appendixStream)
            throws IOException {
        PdfContentByte cb = writer.getDirectContent();
        PdfReader reader = new PdfReader(appendixStream);
        for (int idx = 1; idx <= reader.getNumberOfPages(); ++idx) {
            document.newPage();
            PdfImportedPage imported = writer.getImportedPage(reader, idx);
            cb.addTemplate(imported, 0, 0);
        }
        writer.freeReader();
    }

ただし、特に付録に大きな画像などが含まれている場合は、PDF サイズが大幅に増加します。ドキュメントのサイズを最適化する方法はありますか?

4

2 に答える 2

3

Fabrizio の答えは正しいです。リーダーを解放しないと、既に追加されているページが重複して追加されることはありません。

余分なコメント/回答を追加したい: 既存の PDF に余分なページを追加することについて話している場合、これを行うために使用PdfWriterしたくありません。インターネット上にはそうするように指示する例がたくさんありますが、それらは iText の元の開発者 (つまり私) によって承認されていません。

既存の PDF にページを追加する場合は、PdfCopyまたはを使用する必要がありますPdfSmartCopy。を使用する利点はPdfCopy、リンクや注釈などのインタラクティブなコンテンツを保持できることです。そのサブクラスを使用する利点PdfSmartCopyは、冗長なオブジェクトが削除されることです。たとえば、同じドキュメント内に同じページ ストリームが 100 回重複して存在するPdfSmartCopy場合、 は 99 個のインスタンスを削除し、残りの 1 つだけのストリーム オブジェクトを参照します。

于 2013-11-08T09:58:34.980 に答える
3

PdfReader を破棄せずに再利用してください。

手順:
1 - output.pdf を指すドキュメントと PdfWriter を作成します
2 - appendix.pdf を指す PdfReader を開きます
3 - ページにコンテンツを追加します
4 - PdfReader から読み取る付録ページを追加します
5 - 必要に応じてステップ 3 と 4 を繰り返します
6 - PdfRerader を閉じます
7 - PdfWriter とドキュメントを閉じます

于 2013-11-08T07:34:44.290 に答える