iText7 学习笔记2--页眉页脚
创建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--页眉页脚相关推荐
- Itext 学习笔记(六) pdf的页眉页脚
转载一篇blog 源地址为: [url] http://blog.chinaunix.net/uid-122937-id-3052063.html [/url] 1.概述 iText5中并没有之前版本 ...
- PyQt5使用笔记(一) 处理excel文件获取页眉页脚信息 2020.03.14
Openpyxl库只能处理.xlsx的excel文件, 而xlrd无法获取页眉页脚信息, 使用win32com库调用excel软件来获取页眉, 需要电脑上安装office软件. 1. python 安 ...
- 论文页眉奇偶页不同怎么设置_怎样设置Word页眉页脚奇偶页不同?
来自Excel之家,侵联系删 有伙伴问,怎么设置满足下列要求的页眉页脚: 页眉要求正文部分偶数页居中对齐为"XXXX毕业设计(论文)",奇数页居中对齐是各章章名:字体采用宋体5号. ...
- excel插入页码_Excel里毫不起眼的页眉页脚,居然有这3种高能用法!
点击上方蓝字关注星标★不迷路 本文作者:小敏 本文编辑:小叮 一说到页眉页脚,你脑海中出现的,是不是这样一个画面? 规规矩矩的页眉页脚,比如,公司 logo 或者文件名称放在页眉位置,底部加个页码. ...
- python批量打印机excel_python批量设置多个Excel文件页眉页脚的脚本
本文实例为大家分享了python批量设置多个Excel文件页眉页脚的具体代码,供大家参考,具体内容如下 import os import openpyxl from openpyxl.workshee ...
- PDF页眉页脚删除用什么方法
PDF页眉页脚删除用什么方法.相信每一个小伙伴都在网络上下载过PDF文件,当我们打开PDF文件后,发现文件里有着我们不需要的页眉与页脚,我们应该如何将其删除掉呢?如果屏幕前的你不清楚的话,那就和小编一 ...
- 【vue2】中 谷歌 Chrome 实现自定义页眉页脚打印
解决的最终方案如下图 需求:页眉页脚如下,设计图所示,使用浏览器Ctrl+P打印即可,大小B5试纸 一.实现方法 说明:数据内容不确定分页的情况下,建议使用 方法二 相关属性参考地址:https:// ...
- [ZT]:fancy设置latex页眉页脚
在latex中用自定义页眉页脚, 一般都要使用宏包fancy. 关键是琢磨一下下面的例子, 在看看相应的说明, 一般就可以得到你想要的结果了. 下面的内容主要来自CTEX - 在线文档, 例子部分已经 ...
- Word 注重页面细节才专业(添加页眉页脚,调整页边距,消灭孤行) | 职场人就应该这样用 Word
本篇博文结合这两篇食用更佳(知识点遥相呼应,有共通之处,且大多结合使用,轻松举一反三) Excel 表格打印篇(批量添加标题,同页打印,打印logo与页码) Word 高效办公,三步搞定活动策划书 ...
最新文章
- 打家劫舍系列(dp)
- SDNU 1171.合并果子(区间dp)
- zabbix2.2.3 VMware Vsphere exsi监控配置步骤
- [蓝桥杯][算法提高VIP]夺宝奇兵-递推+记忆化搜索
- vagrant网站中box下载方法
- 话里话外:家族化管理模式和职业化管理模式孰优孰劣
- 易乐游无盘服务器缓存设置,易乐游缓存设置图文教程
- OpenGL ES Emulator横向比较
- [转载] python json 编码(dump/dumps:字典转化为json)、解码(load/loads:json转化为字典)
- Wifite批量破解WEP/WPA/WPS
- apt-get安装软件:依赖冲突问题及解决
- Intouch2014无法自动启动西门子驱动DASSIDIRECT.EXE的原因及解决办法
- 写DM9000网卡芯片驱动的预备知识
- Error: (list) object cannot be coerced to type 'double'
- static Splitterwnd hide and show --by wyj
- 微信小说域名被封-366tool在线解答微信屏蔽小说网页停止访问的解决方案
- FileZilla Server源码分析--大漠落日5节
- 如何用windows系统自带的截图工具截图
- 2022年一级建造师考试《市政公用工程》练习题及答案(多选题)
- python生成器能用while吗_Python:在while循环中使用生成器