将信息添加到文档页脚时如何获取 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();
}
}
在 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();
}
}