1

各pdfページのタイトルが現在のページ番号に基づいてカスタマイズされるpdfを作成しています。たとえば、1 ページ目のタイトルは「最初のページ」、2 ページ目のタイトルは「2 ページ目」など...

ここで行うことは、タイトルを PdfPTable に追加することです。次に、他の多くのものも PdfPTable に追加します。したがって、この PdfPTable には複数ページのデータが含まれます。最後に、この大きな PdfPTable オブジェクトをドキュメントに追加します。ここで、PdfPageEventHelper の onStartPage() メソッドを使用して現在のページ番号を取得し、各ページのタイトルをカスタマイズできるようにします。

問題は、その大きな PdfPTable オブジェクトをドキュメントに追加するまで onStartPage() がトリガーされないことです。つまり、PdfPTable オブジェクトがドキュメントに追加される前に、リソース バンドルにさまざまなキー値をロードさせることができません。これを実現するための提案はありますか?

------以下のようなコードがあります------------------------- ------------

  Phrase title = new Phrase();
  title.add(new Chunk(bundle.getString(pdfNewPageEventHandler.getKey()), headerFont));
  PdfPCell cell = new PdfPCell(new Paragraph(
            new Phrase(title)));
  .........
  PdfPTable table = new PdfPTable(tableSize);
  table.addCell(cell);
  .........
  document.add(table);




private class PdfNewPageEventHandler extends PdfPageEventHelper {

    private int currentPageNum = 0;
    private String key;

    @Override
    public void onStartPage(PdfWriter writer, Document document) {

        currentPageNum = currentPageNum + 1;

        if (currentPageNum == 1) {
            key = "firstPage";
        } 
        else if (currentPageNum == 2) {
            key = "secondPage";
        }

    }

    public String getKey() {
        return key;
    }

}
4

1 に答える 1

1

複数の答えがあります。あなたの特定の状況にどれが当てはまるかわかりません:

  1. onStartPage()メソッドにコンテンツを追加しないでください。文書化されているように、すべてのコンテンツをonEndPage()メソッドに追加する必要があります。

  2. 1 つの大きなテーブルを作成し (メモリ内に構築されます)、そのテーブルをドキュメントに追加することは、必ずしも賢明ではありません (この時点でのみ、メモリを解放できます)。ドキュメントにある大きなテーブル戦略をいくつか試してみたいと思うかもしれません。

  3. 場合によっては、メモリ内にテーブルを構築してからドキュメントに追加することが、使用できる唯一の方法です。その後、iText はテーブルのコンテンツをさまざまなページに分散し、ページ イベントをトリガーします。ただし、テーブルに固有のイベントをトリガーする場合は、テーブルのレベルでイベントを定義することもできます。この正確な目的のために、PdfPTableEventSplitおよびPdfPTableEventAfterSplitクラスがあります。

あなたが提供したコードサンプルは、実際には問題を示していませんでした。私の答えのいずれかが問題の核心に到達するかどうかわからないので、問題を言い換えてください。

于 2013-11-07T08:39:40.720 に答える