1

PDF テンプレートを開き、AcroFields にReceiptオブジェクトからのデータを入力し、ブラウザに出力する次のコードがあります。領収書の 1 つのインスタンスで完全に機能しますが、pdf スタンパー インスタンスを連結した単一の PDF ファイルを生成できるように、領収書のリストを使用してプロセスを繰り返す必要があります。

これは今私のコードです:

response.setContentType("application/pdf");

PdfReader pdfTemplate = new PdfReader ("/receipt-template.pdf");
PdfStamper stamper = new PdfStamper(pdfTemplate, response.getOutputStream());
stamper.setFormFlattening(true);
AcroFields form = stamper.getAcroFields();

// fill the fields as
form.setField("number", recipt.getNumber().toString());

// ...
stamper.close();
pdfTemplate.close();

私は次のようなことをしたいと思います:

pdf = new pdf
foreach receipt in receiptsList
    partial = fillReceiptTemplate (receipt)
    pdf.append (partial)
output pdf

出来ますか?PdfCopy使用する必要があるフォーラムをいくつか読んだことがありますがPdfSmartCopy、方法がわかりません。他の場所では、pdfドキュメント全体を連結することはできないため、代わりにページを追加する必要があると言われています..

4

1 に答える 1

2

ドキュメントがあなたの質問について述べていることを要約しましょう:

  1. 最終的なドキュメントがインタラクティブである必要がある場合、問題が発生します。ISO-32000-1 を読むと、PDF 文書に含めることができるフォームは 1 つだけであることがわかります。1 つのフィールドは複数のウィジェット アノテーションに対応できますが、値は1 つしか持てません。例: フィールドnameを持つフォームがあり、同じフォームを ( を使用して) 2 回以上連結すると、フィールドnamePdfCopyFieldsに対応するウィジェット アノテーションを含むすべてのページに同じ名前が表示されます。名前フィールドにBrunoが表示されるページと、名前フィールドにJoaquinが表示される別のページを持つことはできません。これについては、第 6 章のセクション 6.4.3 で説明されています。私の本の例では、ConcatenateForms1は同じフィールドに対して複数のウィジェットを生成し、 ConcatenateForms2はフォームを連結する前にフィールドの名前を変更します。
  2. あなたの場合、その問題はありません。私の本の第6章stamper.setFormFlattening(true);のセクション6.4.2に示されているように、結果を連結できる行を使用してフォームを平坦します.PdfCopyPdfSmartCopy

「最終結果は形式を維持する必要がある」と「最終結果は平坦化できる」の違いは、異なるフォーラムでさまざまな情報が得られる理由を説明している可能性があります。

このDataSheets例では、個々のファイルがディスクに保存されていないことに注意してください。代わりに、インスタンスの構築に使用される を使用しByteArrayOutputStreamて、バイトがメモリに保持されます。toByteArray()PdfReader

于 2013-08-06T06:57:35.217 に答える