将信息添加到文档页脚时如何获取 iText7 中的总页码?

How to get the total page number in iText7 when adding that info to the document footer?

在 iTextSharp 中,我们可以覆盖 OnCloseDocument() 事件并在文档的页脚上添加 #total 的页码。但是,PdfDocument 不再有此文档关闭事件。既然我们在添加新页面时无法确定总页数,那么我们如何确定这个总页数并在生成文档时将其放在页脚上呢?

我看过一些暴力破解的建议:在生成 PDF 文档后刷新之前,使用 PdfReader 通读它以获得总数,然后再更新页脚。这是唯一的方法吗?有更好的方法吗?

谢谢。

这是其中一种方法。

code sample:

中描述了另一种方法
protected void manipulatePdf(String dest) throws Exception {
    PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
    Document doc = new Document(pdfDoc);

    int numberOfPages = pdfDoc.getNumberOfPages();
    for (int i = 1; i <= numberOfPages; i++) {

        // Write aligned text to the specified by parameters point
        doc.showTextAligned(new Paragraph(String.format("page %s of %s", i, numberOfPages)),
                559, 806, i, TextAlignment.RIGHT, VerticalAlignment.TOP, 0);
    }

    doc.close();
}

在该代码示例中,您将在创建和刷新 PDF 后添加页脚。这是执行此请求的一种非常简单易行的方法。

另一种方法是使用 IEventHandler。

 PdfWriter writer = new PdfWriter(myMemoryStream);
                 pdf.AddEventHandler(PdfDocumentEvent.END_PAGE, new TextFooterEventHandler(document));

然后 :

  public class TextFooterEventHandler : IEventHandler
    {
        protected Document doc;

        public TextFooterEventHandler(Document doc)
        {
            this.doc = doc;
        }

        public void HandleEvent(Event currentEvent)
        {
            var docEvent = (PdfDocumentEvent)currentEvent;
            var pageSize = docEvent.GetPage().GetPageSize();
            var fonts = new FontHelper();
            var font = fonts.Label();

            int pageNum = docEvent.GetDocument().GetPageNumber(docEvent.GetPage());

            float coordX = ((pageSize.GetLeft() + doc.GetLeftMargin())
                             + (pageSize.GetRight() - doc.GetRightMargin())) / 2;
            float footerY = doc.GetBottomMargin();

            Canvas canvas = new Canvas(docEvent.GetPage(), pageSize);
            canvas
                .SetFont(font)
                .SetFontSize(8)
                .ShowTextAligned((("Page " + pageNum.ToString())), coordX + 250, footerY - 40, TextAlignment.CENTER)
                .SetLineThrough()
                .Close();
        }
    }