iText7添加页眉、页脚

news/2024/10/23 20:28:53/

iText7添加页眉、页脚

  • iText7添加页眉、页脚
    • 版本号及maven依赖
    • PdfHeaderFooterEvent
    • PdfTest

iText7添加页眉、页脚

因为iText5对部分pdf操作的支持没有iText7的多,所以后续将项目原本用的itext5升级到了iText7,本文就整理一下iText7添加页眉和页脚的实现。
iText7修改实现IEventHandler,重写handlerEvent方法进行处理,然后addEventHandler到PdfDocment,并指定触发事件的类型。
还是以下边的页眉页脚为例:
页眉: 左边为logo,右边报告简称;
页脚:左边为导出人名,中间为页码,右边为导出日期;
将页眉和页脚都放在在表格里边,然后页眉仅显示底部边框,页脚仅显示顶部边框,做到分割线的作用。
注意点就是总页码,总页码是动态,只有到了写完整个文档,才能知道总页码,iText7修改为使用PdfFormXObject,并且需要在关闭文档前,手动调用。

版本号及maven依赖

在这里插入图片描述

PdfHeaderFooterEvent

@Slf4j
public class PdfHeaderFooterEvent extends IEventHandler {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 PdfFormXObject totalNumTemplate = null ;/*** 事件处理*/@Overridepublic void handlerEvent(Event event){final PdfDocumentEvent docEvent = (PdfDocumentEvent) event;final PdfDocument pdfDoc = docEvent.getDocument();final Document doc = new Document(pdfDoc);final PdfPage page = docEvent.getPage();final Rectangle pageSize = page.getPageSize();final int pageNumber = pdfDoc.getPageNumber(page);final float pdfHeight = pageSize.getHeight();try{this.addPageHeader(doc, pdfHeight);}catch(Exception e){log.error("添加页眉出错", e);}try{this.addPageFooter(doc, pdfDoc, page);}catch(Exception e){log.error("添加页脚出错", e);}}/*** 页眉*/private void addPageHeader(Document docment, float pdfHeight){//创建字体Font textFont = new Font(BASE_FONT, 10f);float width = PageSize.A4.getWidth()-60;//表格 一行两列Table table = new Table(2);table.setWidth(width);//logoImage logo = new Image(ImageDataFactory.create(logoPath));table.addCell(new Cell().add(logo).setHeight(40).setBorderTop(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER));//名称Paragraph nameP = new Paragraph("test").setFont(textFont).setFontSize(10f);table.addCell(new Cell().add(nameP).setHorizontalAlignment(HorizontalAlignment.RIGHT).setVerticalAlignment(VerticalAlignment.MIDDLE).setTextAlignment(TextAlignment.RIGHT).setBorderTop(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER));//设置表格的位置 页眉处table.setFixedPosition(document.getLeftMargin()-10, pdfHeight-document.getTopMargin()-40, table.getWidth());document.add(table);}/*** 页脚*/private void addPageFooter(Document docment, PdfDocument pdf, PdfPage page){Rectangle pageSize = page.getPageSize();//创建字体Font textFont = new Font(BASE_FONT, 10f);float width = PageSize.A4.getWidth()-60;//表格 一行两列Table table = new Table(3);table.setWidth(width);//导入人Paragraph nameP = new Paragraph("admin").setFont(textFont).setFontSize(10f);table.addCell(new Cell().add(nameP).setBorderBottom(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER));//页码 居右if(null == totalNumTemplate){totalNumTemplate = new PdfFormXObject(new Rectangle(0,0,20,20));}int pageNum = pdf.getPageNumber(page);PdfCanvas canvasP = new PdfCanvas(page);Canvas canvas = new Canvas(canvasP, pageSize);canvas.setFontSize(10f);Paragraph pageP = new Paragraph(pageNum).add(" / ").setFont(textFont).setFontSize(10f);canvas.showTextAligned(pageP, 295, 10, TextAlignment.RIGHT);canvas.close();canvasP.addXObjectAt(totalNumTemplate, 300f, 7f);canvasP.release();//日期Paragraph dateP = new Paragraph("2022/09/30").setFont(textFont).setFontSize(10f);table.addCell(new Cell().add(dateP).setBorderBottom(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderRight(Border.NO_BORDER));table.setFixedPosition(document.getLeftMargin()-10, pdfHeight-document.getBottomMargin()-40, table.getWidth());document.add(table);}/*** 文档关闭  手动调用*/public void closeDocument(PdfDocument docment){//修改总页码  居左Canvas canvas = new Canvas(totalNumTemplate, docment);canvas.setFontSize(10f);canvas.showTextAligned(Integer.toString(docment.getNumberOfPages(),0,3f,TextAlignment.LEFT));canvas.close();}
}

PdfTest

public class PdfTest{public static void main(String[] args){String pdfPath = "test.pdf";PdfWriter writer = PdfWriter.getInstance(docment, new FileOutputStream(pdfPath));PdfDocument pdfDoc = new PdfDocument(writer);Document docment = new Documnet(pdfDoc);PdfHeaderFooterEvent event = new PdfHeaderFooterEvent();pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, event);document.add(new Paragraph("test  contents"));event.closeDocument(pdfDoc);document.close();}
}

以上就是iText7添加页脚页眉的全部伪代码逻辑。


http://www.ppmy.cn/news/797083.html

相关文章

word2016中的毕设论文——页眉页脚相关设置及页眉横线的删除

word2016中的毕设论文——页眉页脚相关设置及页眉横线的删除 毕设论文的格式要求双面打印设置页眉设置封面摘要ABSTRACT目录第一章 绪论后续页眉横线的删除 PS 毕设论文的格式要求 双面打印设置 由于毕设论文需要双面打印,为了方便装订,首先需要将论文…

怎么把word转换成只有一页的长页PDF?

来百度APP畅享高清图片 要将Word文档打印成一长页的PDF格式,我们得先知道word转PDF的工作原理。word转pdf其实就是将word打印出来,就是跟你用物理打印机打印的原理是差不多的,所不同的是,PDF虚拟打印的原理是利用虚拟打印机驱动程…

面试经验小点

作者:南极 链接:https://www.zhihu.com/question/23858584/answer/150506189 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 注:适用于工作一到三年有一定经验的Java后端人员&#…

全世界的AI明星公司都在这!CB人工智能100深度拆解

12月13日,国家工业和信息化部发布《促进新一代人工智能产业发展三年行动计划(2018-2020年)》,宣布在接下来的2018-2020这三年内,国家要重点推动人工智能和实体经济深度融合,推进人工智能技术产业化、集成应…

html autocomplete 多个参数切换

<!doctype html> <html lang"en"> <head><meta charset"utf-8"><title>自助搜索</title><link rel"stylesheet" href"//apps.bdimg.com/libs/jqueryui/1.10.4/css/jquery-ui.min.css"><…

Spring FrameWork从入门到NB - ApplicationContext

先看一下ApplicationContext的类结构&#xff1a; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-maqTZDw5-1688910614392)(/img/bVc8BnW)] 可知&#xff1a;ApplicationContext是BeanFactory&#xff0c;所以具有BeanFactory的能力&#xff1a;初始…

文章同步--飞鹤官方商城加密逆向分析(小程序)、蝉管家滑块加密参数逆向分析

飞鹤官方商城加密逆向分析&#xff08;小程序&#xff09; 蝉管家滑块加密参数逆向分析

数据集 VOC转YOLO格式

一、xml转换为txt import os.path import xml.etree.ElementTree as ET import os import random # class_names [palm, stone, scissor, awesome, heartB, OK, ROCK, one, swear, thanks, heartA, # heartC, good, bad, pray, call, take_picture, salute] c…