如何在 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 的结构:
创建文档:
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);
对于每个页面,我使用一个 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
- 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
。
在 Itext 5 中,PdfWriter 曾经有一个名为 getCurrentPageNumber() 的方法。 itext 7 没有了。
由于整个 pdf 将从头到尾使用相同的 Document 实例(PdfDocument pdfDocument = new PdfDocument(writer)),我该如何获取当前页码?
用例:使用itext5编写的应用程序需要使用itext7重写。 我们的应用程序为我们客户的每月账单生成 PDF 文件。
pdf 的结构:
创建文档:
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);
对于每个页面,我使用一个 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
- 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
。