一、页码添加,重写事件,直接上代码:
public class PdfPageXofYEventHelper extends PdfPageEventHelper {
public PdfTemplate total;
public BaseFont baseFont;
/**
* 重写PdfPageEventHelper中的onOpenDocument方法
*/
@Override
public void onOpenDocument(PdfWriter writer, Document document) {
// 得到文档的内容并为该内容新建一个模板
total = writer.getDirectContent().createTemplate(500, 500);
try {
ClassPathResource cpr = new ClassPathResource("arial.ttf");
baseFont = BaseFont.createFont(cpr.getPath(),BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
throw new ExceptionConverter(e);
}
}
/**
* 重写PdfPageEventHelper中的onEndPage方法
*/
@Override
public void onEndPage(PdfWriter writer, Document document) {
// 新建获得用户页面文本和图片内容位置的对象
PdfContentByte pdfContentByte = writer.getDirectContent();
// 保存图形状态
pdfContentByte.saveState();
String text = writer.getPageNumber() + "/";
// 获取点字符串的宽度
float textSize = baseFont.getWidthPoint(text, 9);
pdfContentByte.beginText();
// 设置随后的文本内容写作的字体和字号
pdfContentByte.setFontAndSize(baseFont, 9);
// 定位'X/'
// float x = (document.right() + document.left()) / 2;
float x = document.right();
float y = 20f;
pdfContentByte.setTextMatrix(x, y);
pdfContentByte.showText(text);
pdfContentByte.endText();
// 将模板加入到内容(content)中- // 定位'Y'
pdfContentByte.addTemplate(total, x + textSize, y);
pdfContentByte.restoreState();
}
/**
* 重写PdfPageEventHelper中的onCloseDocument方法
*/
@Override
public void onCloseDocument(PdfWriter writer, Document document) {
total.beginText();
try {
ClassPathResource cpr = new ClassPathResource("arial.ttf");
baseFont = BaseFont.createFont(cpr.getPath(),BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
total.setFontAndSize(baseFont, 9);
} catch (DocumentException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
total.setTextMatrix(0, 0);
// 设置总页数的值到模板上,并应用到每个界面
total.showText(String.valueOf(writer.getPageNumber() - 1));
total.endText();
}
}
重写完事件之后,在写pdf时添加上即可:
。。。
// 1.新建document对象
document = new Document(PageSize.A4);
// 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
writer = PdfWriter.getInstance(document, os);
//--------------------------页码添加---------------------------
// 设置页面布局
writer.setViewerPreferences(PdfWriter.PageLayoutOneColumn);
// 为这篇文档设置页面事件(X/Y)
writer.setPageEvent(new PdfPageXofYEventHelper());
//--------------------------页码添加---------------------------
// 3.打开文档
document.open();
效果图:
二、页脚添加
public class Footer extends PdfPageEventHelper {
public static PdfPTable footer;
@SuppressWarnings("static-access")
public Footer(PdfPTable footer) {
this.footer = footer;
}
@Override
public void onEndPage(PdfWriter writer, Document document) {
//把页脚表格定位
footer.writeSelectedRows(0, -1, 38, 50, writer.getDirectContent());
}
/**
* 页脚是文字
* @param writer
* @param songti09
*/
public void setTableFooter(PdfWriter writer, Font songti09) {
PdfPTable table = new PdfPTable(1);
table.setTotalWidth(520f);
PdfPCell cell = new PdfPCell();
cell.setBorder(1);
String string = "地址: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 网址: www.xxxxxxx.com 咨询热线: 400x-xxx-xxx";
Paragraph p = new Paragraph(string, songti09);
cell.setPaddingLeft(10f);
cell.setPaddingTop(-2f);
cell.addElement(p);
table.addCell(cell);
Footer event = new Footer(table);
writer.setPageEvent(event);
}
}
写pdf时添加上即可:
// 3.打开文档
document.open();
PdfPTable pdfPTable1 = new PdfPTable(1);
// 自己重写的Footer 类
Footer footerTable = new Footer(pdfPTable1);
footerTable.setTableFooter(writer, PdfCommon.createFont(9f));
document.add(pdfPTable1);
效果图:
也可参考 :https://www.bbsmax.com/A/rV5702oLdP/