如何在 Itext 7 中获取 CurrentPageNumber()

How to getCurrentPageNumber() in Itext 7

在 Itext 5 中,PdfWriter 曾经有一个名为 getCurrentPageNumber() 的方法。 itext 7 没有了。

由于整个 pdf 将从头到尾使用相同的 Document 实例(PdfDocument pdfDocument = new PdfDocument(writer)),我该如何获取当前页码?

用例:使用itext5编写的应用程序需要使用itext7重写。 我们的应用程序为我们客户的每月账单生成 PDF 文件。

pdf 的结构:

  1. 创建文档:

     PdfWriter writer = new PdfWriter(new FileOutputStream(filename));
     PdfDocument pdfDocument = new PdfDocument(writer);
     Document document = new Document(pdfDocument, PageSize.A4);
     document.setMargins(235, 35, 0, 38);
     buildBody(pdfData, document, writer);
    
  2. 对于每个页面,我使用一个 IEventHandler 作为开始,另一个用于页面的结束,以便在 Header 和页脚处添加一些数据。

     pdfDocument.addEventHandler(PdfDocumentEvent.START_PAGE, new  
     StartPageHandler<>(pdfData, document, this));
     pdfDocument.addEventHandler(PdfDocumentEvent.END_PAGE, new  
     EndPageHandler<>(pdfData, document, this));
    

3.Each IEventHandler 实例具有此格式(矩形值除外):

Rectangle rectangle = new Rectangle(51, 50, 500, 60); (This is for the END_PAGE)
Rectangle[] columns = new Rectangle[] {rectangle};
document.setRenderer(new ColumnDocumentRenderer(document, columns));
document.add(lineSeparatorHeader);
document.add(paragraphInfo); // information used in the Header/Footer
  1. buildBody(pdfData, document, writer) 方法(来自第 1 步)使用 writer.getCurrentPageNumber()方法来检查我们要添加的内容是否已经超过页面上的space,并且已经通过了另一个页面。如果它在另一个页面上传递,我将不得不在添加其余内容之前添加一些额外信息(以某种方式作为页面 body 中的标题)。 (它曾经与 itext5 一起工作)

考虑到您要移植的代码显然使用了 iText 5 PdfDocument/PdfWriter 模式,该代码中的 当前页码 始终是当前最后一页页码,即正在创建的文档中的当前页数

在 iText 7 中,这些数字不会自动相同;但是,如果您移植保持通用架构的代码,那么这些数字很可能也会在您的 iText 7 代码中保持不变。

在 iText 7 中,您可以从有问题的 PdfDocument 中获取 当前页数

PdfDocument pdfDocument = ...;
...
int currentNamberOfPages = pdfDocument.getNumberOfPages();

目前您的 buildBody 方法签名不包括 PdfDocument(这在 iText 5 中有意义)。对于 iText 7,您应该考虑更改签名以包含 PdfDocument。不过,您很可能不再需要 PdfWriter,然后可以将其排除。

如果您出于某些不明确的原因需要保留该方法签名,您可以使用 getPdfDocument 方法从 Document 中检索 PdfDocument