创建PDF文档,页眉页脚是必不可少的一环,页面页脚的作用一般是会存放一些固定的信息,例如当前页面的章节名称,公司logo,页码等等,我这里以下图为例:

位置: 1 : 显示当前页面的所在的版块名称,例如一本书的第几章等

2: 显示当前的用户名或作者之类

3:logo图片

4:当前页码

一、事件

页眉页脚在每一页的布局和逻辑都是一致,除了页码需要跟着页面变动而改变。在itext7 提供了事件出来的方式。代码如下

pdfDoc.addEventHandler(type,IEventHandler);

参数:type   :  事件的类型,有四种分别是 PdfDocumentEvent.END_PAGE ; PdfDocumentEvent.START_PAGE; PdfDocumentEvent.INSERT_PAGE; PdfDocumentEvent.REMOVE_PAGE。

看名称就是知道分别代表都是页面完成,开始,插入,移除时触发事件

IEventHandler  : 触发的事件具体代码,需要自己编写一个类,并实现接口IEventHandler

二、具体代码

 1、实现接口IEventHandler的类  DemoHeaderFooterHandler.java   

public class DemoHeaderFooterHandler implements IEventHandler {private final String imgLogo;private final PdfFont font;public DemoHeaderFooterHandler(final String imgLogo, final PdfFont font) {this.imgLogo = imgLogo;this.font = font;}@Overridepublic void handleEvent(final Event event) {try {final PdfDocumentEvent docEvent = (PdfDocumentEvent) event;final PdfDocument pdfDoc = docEvent.getDocument();final Document doc = new Document(pdfDoc);final PdfPage page = docEvent.getPage();final int pageNumber = pdfDoc.getPageNumber(page);final Rectangle pageSize = page.getPageSize();final float pdfWidth = pageSize.getWidth();final float pdfHeight = pageSize.getHeight();final PdfCanvas pdfCanvas = new PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDoc);final Color lineColor = new DeviceRgb(57, 123, 198);pdfCanvas.setLineWidth(1.5f).setStrokeColor(lineColor);final float tableWidth = pdfWidth - doc.getRightMargin() - doc.getLeftMargin();// 页眉final float x0 = doc.getRightMargin(), y0 = pdfHeight - doc.getTopMargin();pdfCanvas.moveTo(x0, y0).lineTo(pdfWidth - doc.getRightMargin(), y0).stroke();final Table headerTable = new Table(2);headerTable.setHeight(30);headerTable.setFixedLayout();headerTable.setWidth(tableWidth);headerTable.setHorizontalAlignment(HorizontalAlignment.CENTER);final Paragraph pageNameParagraph = new Paragraph();// realnameParagraph.setFixedLeading(4f);pageNameParagraph.setVerticalAlignment(VerticalAlignment.BOTTOM);pageNameParagraph.add("页面名称");final Cell pageNameCell = new Cell();pageNameCell.setBorder(Border.NO_BORDER);pageNameCell.add(pageNameParagraph);pageNameCell.setFont(this.font);pageNameCell.setFontSize(12f);pageNameCell.setFontColor(lineColor);pageNameCell.setVerticalAlignment(VerticalAlignment.BOTTOM);headerTable.addCell(pageNameCell);final Paragraph realnameParagraph = new Paragraph();// realnameParagraph.setFixedLeading(4f);realnameParagraph.setVerticalAlignment(VerticalAlignment.BOTTOM);realnameParagraph.add(new Tab()).addTabStops(new TabStop(1000, TabAlignment.RIGHT));realnameParagraph.add("半路凉亭");final Cell realnameCell = new Cell();realnameCell.setBorder(Border.NO_BORDER);realnameCell.add(realnameParagraph);realnameCell.setFont(this.font);realnameCell.setFontSize(12f);realnameCell.setFontColor(lineColor);realnameCell.setVerticalAlignment(VerticalAlignment.BOTTOM);headerTable.addCell(realnameCell);headerTable.setFixedPosition(doc.getLeftMargin(), pdfHeight - doc.getTopMargin(), tableWidth);doc.add(headerTable);// 页脚pdfCanvas.moveTo(x0, doc.getBottomMargin()).lineTo(pdfWidth - doc.getRightMargin(), doc.getBottomMargin()).stroke();final Table table = new Table(2);table.setHeight(40);table.setFixedLayout();table.setWidth(tableWidth);table.setHorizontalAlignment(HorizontalAlignment.CENTER);final Cell imgCell = new Cell();imgCell.setBorder(Border.NO_BORDER);imgCell.add(this.getLogoImage());imgCell.setVerticalAlignment(VerticalAlignment.TOP);table.addCell(imgCell);final String pageNo = String.format("%d", pageNumber);final Paragraph pageNoParagraph = new Paragraph();pageNoParagraph.setFontColor(new DeviceRgb(166, 166, 166));pageNoParagraph.setFontSize(12f);pageNoParagraph.add(new Tab()).addTabStops(new TabStop(1000, TabAlignment.RIGHT));pageNoParagraph.add(pageNo);table.addCell(new Cell().add(pageNoParagraph).setBorder(Border.NO_BORDER));table.setFixedPosition(doc.getLeftMargin(), doc.getBottomMargin() - table.getHeight().getValue(),tableWidth);doc.add(table);System.out.println("***" + table.getHeight());} catch (final Exception e) {e.printStackTrace();throw new NormStarRuntimeException("页脚异常" + e.getMessage());}}private Image getLogoImage() {Image image;try {image = new Image(ImageDataFactory.create(this.imgLogo));image.scaleToFit(75, 100);} catch (final MalformedURLException e) {final String errorMessage = "logo图片";throw new NormStarRuntimeException(errorMessage, e);}return image;}}

  2、生成文档的代码 

    private final String fileImg = "D:/itext-pdf/logo.png";public PdfFont getSongTiFont() throws IOException {return PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", false);}public PdfFont getHeiTiFont() throws IOException {return PdfFontFactory.createFont("D:/itext-pdf/font/heiti.TTF", PdfEncodings.IDENTITY_H,false);}/*** 页眉页脚** @author * @date 2021年3月29日*/@Testpublic void testHeaderFooter() {final File file = new File("D:/itext-pdf/001.pdf");Document doc = null;try {final PdfFont font = this.getSongTiFont();final PdfWriter writer = new PdfWriter(file);final PdfDocument pdfDoc = new PdfDocument(writer);doc = new Document(pdfDoc);final Image img = new Image(ImageDataFactory.create(this.fileImg));img.setHeight(new UnitValue(UnitValue.POINT, 35f));img.setWidth(new UnitValue(UnitValue.POINT, 100f));doc.setMargins(50, 60, 50, 60);pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE,new DemoHeaderFooterHandler(this.fileImg, this.getHeiTiFont()));pdfDoc.addNewPage();final int number = pdfDoc.getNumberOfPages();final float pdfWidth = pdfDoc.getPage(number).getPageSize().getWidth();final float pdfHeight = pdfDoc.getPage(number).getPageSize().getHeight();final Paragraph paragraph = new Paragraph("你好 itext-pdf");paragraph.add("第" + number + "页");paragraph.add("宽:" + pdfWidth + " 高:" + pdfHeight); // 宽:595.0 高:842.0paragraph.setFont(font);paragraph.add(img);doc.add(paragraph);// PdfContentByte cb = writer.getDirectContent();final PdfOutline root = pdfDoc.getOutlines(true);final String title = String.format("Numbers from %s to %s", 1, 10);final Text c = new Text(title);//final TOCTextRenderer renderer = new TOCTextRenderer(root, c);//c.setNextRenderer(renderer);doc.add(new Paragraph(c));pdfDoc.addNewPage();System.out.println("***" + root.getTitle());} catch (final Exception e) {e.printStackTrace();final String errorMessage = "异常";throw new NormStarRuntimeException(errorMessage, e);} finally {if (doc != null) {doc.close();}}}

注意:

1.中文字体问题  

页尾页脚中如果有中文字体,则必须使用外部嵌入的字体,如我这里嵌入的黑体,使用默认的宋体,则会报错

2.表格绝对坐标定位

setFixedPosition(); 使用这个方法写入表格时,是以表格的左下角为坐标原点定位的。

iText7 学习笔记2--页眉页脚相关推荐

  1. Itext 学习笔记(六) pdf的页眉页脚

    转载一篇blog 源地址为: [url] http://blog.chinaunix.net/uid-122937-id-3052063.html [/url] 1.概述 iText5中并没有之前版本 ...

  2. PyQt5使用笔记(一) 处理excel文件获取页眉页脚信息 2020.03.14

    Openpyxl库只能处理.xlsx的excel文件, 而xlrd无法获取页眉页脚信息, 使用win32com库调用excel软件来获取页眉, 需要电脑上安装office软件. 1. python 安 ...

  3. 论文页眉奇偶页不同怎么设置_怎样设置Word页眉页脚奇偶页不同?

    来自Excel之家,侵联系删 有伙伴问,怎么设置满足下列要求的页眉页脚: 页眉要求正文部分偶数页居中对齐为"XXXX毕业设计(论文)",奇数页居中对齐是各章章名:字体采用宋体5号. ...

  4. excel插入页码_Excel里毫不起眼的页眉页脚,居然有这3种高能用法!

    点击上方蓝字关注星标★不迷路 本文作者:小敏 本文编辑:小叮 一说到页眉页脚,你脑海中出现的,是不是这样一个画面? 规规矩矩的页眉页脚,比如,公司 logo 或者文件名称放在页眉位置,底部加个页码. ...

  5. python批量打印机excel_python批量设置多个Excel文件页眉页脚的脚本

    本文实例为大家分享了python批量设置多个Excel文件页眉页脚的具体代码,供大家参考,具体内容如下 import os import openpyxl from openpyxl.workshee ...

  6. PDF页眉页脚删除用什么方法

    PDF页眉页脚删除用什么方法.相信每一个小伙伴都在网络上下载过PDF文件,当我们打开PDF文件后,发现文件里有着我们不需要的页眉与页脚,我们应该如何将其删除掉呢?如果屏幕前的你不清楚的话,那就和小编一 ...

  7. 【vue2】中 谷歌 Chrome 实现自定义页眉页脚打印

    解决的最终方案如下图 需求:页眉页脚如下,设计图所示,使用浏览器Ctrl+P打印即可,大小B5试纸 一.实现方法 说明:数据内容不确定分页的情况下,建议使用 方法二 相关属性参考地址:https:// ...

  8. [ZT]:fancy设置latex页眉页脚

    在latex中用自定义页眉页脚, 一般都要使用宏包fancy. 关键是琢磨一下下面的例子, 在看看相应的说明, 一般就可以得到你想要的结果了. 下面的内容主要来自CTEX - 在线文档, 例子部分已经 ...

  9. Word 注重页面细节才专业(添加页眉页脚,调整页边距,消灭孤行) | 职场人就应该这样用 Word

      本篇博文结合这两篇食用更佳(知识点遥相呼应,有共通之处,且大多结合使用,轻松举一反三) Excel 表格打印篇(批量添加标题,同页打印,打印logo与页码) Word 高效办公,三步搞定活动策划书 ...

最新文章

  1. 打家劫舍系列(dp)
  2. SDNU 1171.合并果子(区间dp)
  3. zabbix2.2.3 VMware Vsphere exsi监控配置步骤
  4. [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索
  5. vagrant网站中box下载方法
  6. 话里话外:家族化管理模式和职业化管理模式孰优孰劣
  7. 易乐游无盘服务器缓存设置,易乐游缓存设置图文教程
  8. OpenGL ES Emulator横向比较
  9. [转载] python json 编码(dump/dumps:字典转化为json)、解码(load/loads:json转化为字典)
  10. Wifite批量破解WEP/WPA/WPS
  11. apt-get安装软件:依赖冲突问题及解决
  12. Intouch2014无法自动启动西门子驱动DASSIDIRECT.EXE的原因及解决办法
  13. 写DM9000网卡芯片驱动的预备知识
  14. Error: (list) object cannot be coerced to type 'double'
  15. static Splitterwnd hide and show --by wyj
  16. 微信小说域名被封-366tool在线解答微信屏蔽小说网页停止访问的解决方案
  17. FileZilla Server源码分析--大漠落日5节
  18. 如何用windows系统自带的截图工具截图
  19. 2022年一级建造师考试《市政公用工程》练习题及答案(多选题)
  20. python生成器能用while吗_Python:在while循环中使用生成器

热门文章

  1. 全栈工程师必备技能栈,聊聊月薪2W以内都该会点啥?
  2. web大学生个人网站作业模板——上海旅游景点介绍网页代码 家乡旅游网页制作模板 大学生静态HTML网页源码...
  3. Java系统程序Bug解决方法论(一) - 教程简介
  4. 基于SSM框架的图书馆借阅管理系统
  5. MJT's Blog
  6. Ubuntu 18.04 更换阿里源
  7. Failed to load API definition
  8. 专访架构师周爱民:谈企业软件架构设计 1
  9. 维基解密想帮助苹果、Google 对抗 CIA 黑客入侵
  10. git之bitbucket