iText5添加页眉、页脚,logo、页码等实现

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

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;/*** 重写页面结束时间  分别添加页眉、页脚*/@Overridepublic 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  所以减去60table.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  所以减去60table.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());}/*** 文档关闭事件*/@Overridepublic 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添加页脚页眉的全部伪代码逻辑。

iText5添加页眉、页脚,logo、页码等实现相关推荐

  1. PDF编辑技巧2:设置页眉页脚和添加页码

    一份优秀的PDF文档肯定是需要经过多番的修改和编辑的.编辑PDF的方法各有不同,但是都需要借助第三方PDF编辑软件来实现.在这里给大家推荐一款十分好用的PDF编辑器--迅捷PDF编辑器,绝对能让你快速 ...

  2. 解决如何为扫描件图片PDF添加页眉页脚页码日期的问题

    前言:在日常办公中,会面临这样的情况:需要将几份盖章的扫描件整合到一个文档中,并编制页眉/页脚/页码.普通的word文档,可以直接添加页眉页脚.页码,并通过"另存为..."pdf格 ...

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

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

  4. C# 添加PDF页眉/页脚

    这篇文章主要介绍了C# 添加PDF页眉/页脚的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 概述 页眉页脚是一篇完整.精致的文档的重要组成部分.在页眉页脚处,可 ...

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

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

  6. C# 如何添加Excel页眉页脚(图片、文字、奇偶页不同)

    简介 我们可以通过代码编程来对Excel工作表实现很多操作,在下面的示例中,将介绍如何来添加Excel页眉.页脚.在页眉处,我们可以添加文字,如公司名称.页码.工作表名.日期等,也可以添加图片,如LO ...

  7. ITEXT 页眉页脚页码三件套

    问题场景 利用itext写PDF的过程中遇到生成页眉页脚页码的问题,记录下. 整体思路 编写相应事件 在适当位置添加事件 效果 CODE 需要导入的包:itext-pdfa-5.5.6.jar.ite ...

  8. Print 页眉页脚页码

    页眉页脚 当我们想打印当前页面或者保存当前页面为PDF的时候,希望加上自己自定义的logo或者文字,经过调研,找到如下两种最常用的添加页眉页脚方式,但是却不是最理想的实现方案,依然在努力调研中 tab ...

  9. WORD页边距、行距、页码、页眉页脚

    页边距:上2.5cm,下2.5cm,左2.5cm,右2cm,页眉1.5cm,页脚1.75cm,左侧装订: 行距:1.5倍行距: 页码:底部居中,五号: 页边距及页眉.页脚,装订线位置设置在" ...

  10. 【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页

    itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标 鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类 ...

最新文章

  1. c语言程序开发过程上机步骤,C语言程序上机步骤2010.doc
  2. sshd修改端口后几次启动失败
  3. 传统APP与微信端APP十大优劣对比
  4. 动态创建asp.net控件之我见
  5. 基于 Slax 构建译者专用 Linux
  6. push模式的水晶报表,参数的设置要放在数据源设置之后
  7. 使用certbot自动申请续期SSL证书(Ubuntu)
  8. 微博回应裁员;罗永浩股权被冻结;“隐形贫困”人群最爱苹果 | 极客头条
  9. the android emulator process,Android studio报错:The emulator process for AVD (xxx) was killed
  10. Litjson快速入门
  11. PyQt、PySide、PySide2这三者到底有什么区别?
  12. Python学习笔记——python基础 4. 函数进阶
  13. MarkDown 分割线
  14. 【计算机网络】【应用层-5】
  15. python计算球体体积_鬼斧神工:求n维球的体积
  16. macBook下将m4a转换成mp3
  17. 服务器可不可以选择ssd硬盘
  18. 良心推荐:某音上最厉害的明日之后房子蓝图设计师都在这里了
  19. 用html5 Canvas制作一个简单的游戏 英雄抓小怪物(上)
  20. idea的项目模板的创建

热门文章

  1. 实战,Python处理Excel比Vba快100倍,媳妇连连夸赞今晚不用再跪搓衣板
  2. 机械键盘从门前到门后
  3. 云BI,如何成为了企业的“贴身管家”?
  4. 达人评测:i9 10900kf和i9 10900k区别-i9 10900kf和i9 10900k选哪个
  5. codeblocks调出logs框
  6. ABAP 编程语言中 Class(类)的设计原理剖析
  7. 计算机画图软件技巧,Win7系统自带画图工具快速浏览图片的技巧
  8. Day33 继承的三大特性之 封装与多态
  9. 观史图馆之《苏美尔与巴比伦历史地图》与《赫梯历史地图》
  10. vue 幻灯片组件_vue.js的幻灯片组件