Android Java iTextPDF 动态页码:生成 PDF 文档时添加页眉页脚和页码
在使用 iTextPDF 生成 PDF 文档时,可以通过在文档中添加页眉或页脚的方式动态插入页码。具体实现步骤如下:
-
在文档生成前创建页眉或页脚的模板,包括页码的位置、字体、大小等信息。
-
使用 PdfPageEventHelper 类扩展 PdfPageEvent 接口,实现 onEndPage 方法,该方法会在每一页生成结束时自动调用。
-
在 onEndPage 方法中,通过 PdfWriter 类的方法 getDirectContent() 获取 PdfContentByte 对象,然后使用该对象绘制页眉或页脚模板。
-
获取当前页码,使用 PdfContentByte 对象的 showTextAligned 方法将页码绘制在指定位置。
-
将实现了 PdfPageEvent 接口的类对象作为参数传递给 PdfWriter 对象的 setPageEvent 方法,即可自动在每一页生成结束时插入页眉或页脚,以及动态插入页码。
下面是一个示例代码片段:
public class PageNumberEvent extends PdfPageEventHelper {
private PdfTemplate template;
private BaseFont font;
public void onOpenDocument(PdfWriter writer, Document document) {
template = writer.getDirectContent().createTemplate(50, 50);
try {
font = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void onEndPage(PdfWriter writer, Document document) {
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
String text = 'Page ' + writer.getPageNumber();
float textWidth = font.getWidthPoint(text, 12);
float x = (document.right() + document.left() + textWidth) / 2;
float y = document.bottom() - 20;
cb.beginText();
cb.setFontAndSize(font, 12);
cb.setTextMatrix(x, y);
cb.showText(text);
cb.endText();
cb.addTemplate(template, x - textWidth/2, y);
cb.restoreState();
}
public void onCloseDocument(PdfWriter writer, Document document) {
template.beginText();
template.setFontAndSize(font, 12);
template.setTextMatrix(0, 0);
template.showText('' + (writer.getPageNumber()-1));
template.endText();
}
}
在代码中,onOpenDocument 方法创建了一个 50x50 的 PdfTemplate 对象,并在其中绘制了页码模板。onEndPage 方法获取当前页码并绘制在指定位置,同时使用 PdfContentByte 对象的 addTemplate 方法将页码模板插入到 PDF 文档中。onCloseDocument 方法在文档生成结束时将总页数绘制在页码模板中。
在生成 PDF 文档时,可以将实现了 PdfPageEvent 接口的 PageNumberEvent 对象作为参数传递给 PdfWriter 对象的 setPageEvent 方法,即可自动在每一页生成结束时插入页眉或页脚,并动态插入页码。
原文地址: https://www.cveoy.top/t/topic/nPsC 著作权归作者所有。请勿转载和采集!