iText5添加页眉、页脚,logo、页码等实现
iText5添加页眉、页脚
iText5添加页眉和页脚通过事件出发,需要继承PdfPageEventHelper,重写onEndPage方法进行处理,然后setPageEvent到PdfWriter。
以下边的页眉页脚为例:
页眉: 左边为logo,右边报告简称;
页脚:左边为导出人名,中间为页码,右边为导出日期;
将页眉和页脚都放在在表格里边,然后页眉仅显示底部边框,页脚仅显示顶部边框,做到分割线的作用。
注意点就是总页码,总页码是动态,只有到了写完整个文档,才能知道总页码,所以需要使用PdfTemplate,在页面关闭事件,写入到模板对象里。
版本及maven依赖
PdfHeaderFooterEvent
@Slf4j
public class PdfHeaderFooterEvent extends PdfPageEventHelper {
private final static String FONT_PATH = "C:\Windows\Fonts\simsun.ttc,0";
private final static BaseFont BASE_FONT = BaseFont.createFont(FONT_PATH, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
private final static String logoPath = "D:\Users\admin\Downloads\logo.png";
//总页码使用的模板对象
public PdfTemplate totalNumTemplate = null;
/**
* 重写页面结束时间 分别添加页眉、页脚
*/
@Override
public void onEndPage(pdfWriter writer, Document docment){
try{
this.addPageHeader(writer, docment);
}catch(Exception e){
log.error("添加页眉出错", e);
}
try{
this.addPageFooter(writer, docment);
}catch(Exception e){
log.error("添加页脚出错", e);
}
}
/**
* 页眉
*/
private void addPageHeader(pdfWriter writer, Document docment){
//创建字体
Font textFont = new Font(BASE_FONT, 10f);
//两列 一列logo 一列项目简称
PdfTable table = new PdfTable(2);
//设置表格宽度 A4纸宽度减去两个边距 比如我一边30 所以减去60
table.setTotalWidth(PageSize.A4.getWidth()-60);
//logo
//创建图片对象
Image logo = Image.getInstance(logoPath);
//创建一个Phrase对象 再添加一个Chunk对象进去 Chunk里边是图片
Phrase logoP = new Phrase("", textFont);
//自己调整偏移值 主要是y轴值
logoP.add(new Chunk(logo, 0, -35))
PdfPCell logoCell = new PdfPCell(logoP);
//只保留底部边框和设置高度
logoCell.disableBorderSide(13);
logoCell.setFixedHeight(40);
table.addCell(logoCell);
Phrase nameP = new Phrase("TEST", textFont);
PdfPCell nameCell = new PdfPCell(nameP);
//只保留底部边框和设置高度 设置水平居右和垂直居中
nameCell.disableBorderSide(13);
nameCell.setFixedHeight(40);
nameCell.setHorizontalAlignment(Element.ALIGN_RIGHT);
nameCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
table.addCell(logoCell);
//再把表格写到页眉处 使用绝对定位
table.writeSelectedRows(0, -1, 30, Page.A4.getHeight()-20, write.getDirectContent());
}
/**
* 页脚
*/
private void addPageFooter(PdfWriter writer, Document docment){
//创建字体
Font textFont = new Font(BASE_FONT, 10f);
//三列 一列导出人 一列页码 一列时间
PdfTable table = new PdfTable(3);
//设置表格宽度 A4纸宽度减去两个边距 比如我一边30 所以减去60
table.setTotalWidth(PageSize.A4.getWidth()-60);
//仅保留顶部边框
table.getDefaultCell().disableBorderSide(14);
table.getDefaultCell().setFixedHeight(40);
table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
//导出人
table.addCell(new Phrase("admin", textFont));
//页码
//初始化总页码模板
if(null == totalNumTemplate){
totalNumTemplate = write.getDirectContent().createTemplate(30, 16);
}
//再嵌套一个表格 一左一右 左边当前页码 右边总页码
PdfTable pageNumTable = new PdfTable(2);
pageNumTable.setTotalWidth(new float[]{80f, 80f});
pageNumTable.setLockedWidth(true);
pageNumTable.setPaddingTop(-5f);
//第一列居右
pageNumTable.getDefaultCell().disableBorderSide(15);
pageNumTable.getDefaultCell().setFixedHeight(16);
pageNumTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
pageNumTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_BOTTOM);
pageNumTable.addCell(new Phrase(writer.getPageNumber()+" / ", textFont));
//第二列居左
Image totalNumImg = Image.getInstance(totalNumTemplate);
totalNumImg.setPaddingTop(-5f);
pageNumTable.getDefaultCell().setPaddingTop(-18f);
pageNumTable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_LEFT);
pageNumTable.getDefaultCell().setVerticalAlignment(Element.ALIGN_TOP);
pageNumTable.addCell(totalNumImg);
//把页码表格添加到页脚表格
table.addCell(pageNumTable);
//日期
table.addCell(new Phrase(new Date(), textFont));
//再把表格写到页脚处 使用绝对定位
table.writeSelectedRows(0, -1, 30, 40, write.getDirectContent());
}
/**
* 文档关闭事件
*/
@Override
public void onCloseDocument(PdfWriter writer, Document docment){
//创建字体
Font textFont = new Font(BASE_FONT, 10f);
//将最后的页码写入到总页码模板
String totalNum = writer.getPageNumber + "页";
totalNumTemplate.beginText();
totalNumTemplate.setFontAndSize(BASE_FONT, 5f);
totalNumTemplate.showText(totalNum);
totalNumTemplate.setHeight(16f);
totalNumTemplate.endText();
totalNumTemplate.closePath();
}
}
PdfTest
public class PdfTest{
public static void main(String[] args){
String pdfPath = "test.pdf";
Document docment = new Documnet(PageSize.A4);
PdfWriter writer = PdfWriter.getInstance(docment, new FileOutputStream(pdfPath));
docment.open();
PdfHeaderFooterEvent event = new PdfHeaderFooterEvent();
writer.setPageEvent(event);
document.add(new Paragraph("test contents"));
document.close();
}
}
以上就是iText5添加页脚页眉的全部伪代码逻辑。