1

我正在创建一个 pdf,其中每个 pdf 页面的标题将根据当前页码进行自定义。例如,第一页的标题是“第一页”,第二页的标题是“第二页”,以此类推...

我们现在要做的是将标题添加到 PdfPTable,然后我们还将许多其他内容添加到 PdfPTable,因此此 PdfPTable 包含几页数据。最后我们将这个大的 PdfPTable 对象添加到文档中。现在我们要使用 PdfPageEventHelper 中的 onStartPage() 方法来获取当前页码,这样我们就可以自定义每个页面的标题。

问题是 onStartPage() 在我们将那个大的 PdfPTable 对象添加到文档之前不会触发,这意味着我们不能让资源包在 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. 创建一个大表(它在内存中建立)然后将表添加到文档中并不总是明智的(只有此时,内存才能被释放)。也许您想尝试文档中的一些大表策略

  3. 在某些情况下,在内存中构建一个表,然后将其添加到文档中是您可以使用的唯一策略。然后 iText 会将表格的内容分布到不同的页面上,从而触发页面事件。但是:如果要触发特定于表的事件,还可以在表级别定义事件。为此目的,有一个PdfPTableEventSplit和一个PdfPTableEventAfterSplit类。

您提供的代码示例并没有真正说明问题。您能否重新表述这个问题,因为我不确定我的任何答案是否触及问题的核心。

于 2013-11-07T08:39:40.720 回答