1.概述

iText5中并没有之前版本HeaderFooter对象设置页眉和页脚,可以利用PdfPageEventHelper来完成页眉页脚的设置工作。PdfPageEventHelper中包含以下事件处理器。

onOpenDocument() — 当打开一个文档时触发,可以用于初始化文档的全局变量。

onStartPage() — 当一个页面初始化时触发,可用于初始化页面的设置参数,但是注意这个函数触发时,该页面并没有创建好,不用利用这个函数添加内容,最好利用onEndPage()处理页面的初始化。

onEndPage() — 在创建一个新页面完成但写入内容之前触发,是添加页眉、页脚、水印等最佳时机。

onCloseDocument() — 在文档关闭之前触发,可以用于释放一些资源。

2.重载PdfPageEventHelper类

定义一个类HeaderFooter,继承了父类PdfPageEventHelper

在文档的每个页面中,必须定义一个Ractangle矩形,其中参数为art,这样在HeaderFooter类中就可以通过这个矩形,获取文档的边框位置,从而设置页眉和页脚。

代码如下:

Java代码

import com.itextpdf.text.Document;

import com.itextpdf.text.Element;

import com.itextpdf.text.Phrase;

import com.itextpdf.text.Rectangle;

import com.itextpdf.text.pdf.ColumnText;

import com.itextpdf.text.pdf.PdfPageEventHelper;

import com.itextpdf.text.pdf.PdfWriter;

public class HeaderFooter extends PdfPageEventHelper{

public void onEndPage (PdfWriter writer, Document document) {

Rectangle rect = writer.getBoxSize("art");

switch(writer.getPageNumber() % 2) {

case 0:

ColumnText.showTextAligned(writer.getDirectContent(),

Element.ALIGN_RIGHT, new Phrase("even header"),

rect.getRight(), rect.getTop(), 0);

break;

case 1:

ColumnText.showTextAligned(writer.getDirectContent(),

Element.ALIGN_LEFT, new Phrase("odd header"),

rect.getLeft(), rect.getTop(), 0);

break;

}

ColumnText.showTextAligned(writer.getDirectContent(),

Element.ALIGN_CENTER, new Phrase(String.format("page %d", writer.getPageNumber())),

(rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0);

}

}

调用代码如下:

Java代码

import com.itext.HeaderFooter;

import com.itextpdf.text.pdf.PdfPageEventHelper;

import com.itextpdf.text.pdf.PdfWriter;

import com.itextpdf.text.pdf.ColumnText;

import com.itextpdf.text.*;

import java.io.FileOutputStream;

public class HeaderAndFooterDemo {

public static void main(String[] args){

Document document = new Document(PageSize.A4, 50, 50, 50, 50);

try{

PdfWriter writer=PdfWriter.getInstance(document,

new FileOutputStream("C:\\testHeaderAndFooter.pdf") );

Rectangle rect = new Rectangle(36, 54, 559, 788);

rect.setBorderColor(BaseColor.BLACK);

writer.setBoxSize("art", rect);

HeaderFooter header=new HeaderFooter();

writer.setPageEvent(header);

document.open();

document.newPage();

Paragraph par = new Paragraph("first paragraph");

document.add(par);

document.newPage();

Paragraph par2 = new Paragraph("second paragraph");

document.add(par2);

document.close();

}catch(Exception e){

e.printStackTrace();

}

}

}

3. 解决第X页/共Y页问题

我们通过PdfWriter中的getPageNumber()函数获取当前是第几页,但是没有办法获取文档共多少页。

我们可以利用XObject对象,iText仅在调用释放模板方法后才将PdfTemplate写入到OutputStream中,否则对象将一直保存在内存中,直到关闭文档。

我们可以给第1个页面添加template,直到最后一个页面才将内容写入到这个模板。

Java代码

import com.itextpdf.text.Document;

import com.itextpdf.text.DocumentException;

import com.itextpdf.text.Element;

import com.itextpdf.text.ExceptionConverter;

import com.itextpdf.text.Image;

import com.itextpdf.text.Phrase;

import com.itextpdf.text.Rectangle;

import com.itextpdf.text.pdf.ColumnText;

import com.itextpdf.text.pdf.PdfPCell;

import com.itextpdf.text.pdf.PdfPTable;

import com.itextpdf.text.pdf.PdfPageEventHelper;

import com.itextpdf.text.pdf.PdfTemplate;

import com.itextpdf.text.pdf.PdfWriter;

public class TableHeader extends PdfPageEventHelper{

String header;

PdfTemplate total;

public void setHeader(String header){

this.header=header;

}

public void onOpenDocument(PdfWriter writer,Document document){

total = writer.getDirectContent().createTemplate(30,16);

}

public void onEndPage (PdfWriter writer, Document document) {

PdfPTable table = new PdfPTable(3);

try{

table.setWidths(new int[]{24,24,2});

table.setTotalWidth(527);

table.setLockedWidth(true);

table.getDefaultCell().setFixedHeight(20);

table.getDefaultCell().setBorder(Rectangle.BOTTOM);

table.addCell(header);

table.getDefaultCell().setHorizontalAlignment(

Element.ALIGN_RIGHT);

table.addCell(String.format("page %d of",writer.getPageNumber()));

PdfPCell cell = new PdfPCell(Image.getInstance(total));

cell.setBorder(Rectangle.BOTTOM);

table.addCell(cell);

table.writeSelectedRows(0,-1,34,803,writer.getDirectContent());

}

catch(DocumentException de){

throw new ExceptionConverter(de);

}

}

public void onCloseDocument(PdfWriter writer,Document document){

ColumnText.showTextAligned(total,Element.ALIGN_LEFT,new Phrase(String.valueOf(writer.getPageNumber()-1)),2,2,0);

}

}

转载于:https://blog.51cto.com/cainiaobo/942235

Itext pdf的页眉页脚相关推荐

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

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

  2. itext Pdf页眉/页脚/水印

    package com.company.common.core.utils.itext;import com.itextpdf.text.*; import com.itextpdf.text.pdf ...

  3. itext给已有pdf添加页眉页脚

    网上百度到的基本都是生成pdf的时候,添加页眉页脚,但是假如对已有的pdf添加页眉页脚就比较麻烦,突然想到了可以曲线救国,用itext进行复制pdf的时候,在添加页眉页脚,最后可以成功的. 生成pdf ...

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

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

  5. itext总页数_itext 生成pdf文件添加页眉页脚

    原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpd ...

  6. itext对已经存在的pdf添加页眉页脚

    接上一篇拼接pdf后,需要对不同文件的pdf展示不同的页眉及页脚,所以,这篇分享对于已存在的pdf进行页眉页脚的添加. public static String RederAndCopyByPDF(S ...

  7. Java生成pdf设置两行页脚_Itextpdf 5 html生成pdf 页眉页脚

    效果图 QQ图片20190117140345.png 继承PdfPageEventHelper重写onEndPage方法 package com.xuqiang.itext.test; import ...

  8. html pdf支持css%写法吗,flying-saucer-pdf终于完美解决了(中文问题,换行问题,分页,页眉页脚,水印),html+css控制pdf样式...

    集成freemarker+flying-saucer-pdf+itext,通过html模板生成PDF 折腾了很久,flying-saucer-pdf终于完美解决了(中文问题,换行问题,页眉页脚,水印) ...

  9. SpringBoot html转pdf 支持中文、图片水印+文字水印、页眉页脚 flying-saucer-pdf-itext5 + freemarker

    使用 flying-saucer-pdf-itext5加freemarker生成pdf,支持中文.图片水印+文字水印.页眉页脚. 引入jar包 <!-- freemarker --> &l ...

最新文章

  1. Tuple解决在视图中通过razor获取控制器传递给视图的匿名对象的报错问题
  2. 无失真压缩法可以减少冗余_混音笔记(七)——压缩器(2)压缩器参数调节方法...
  3. QStackedWidget实现自适应紧凑布局
  4. Paxos共识算法详解
  5. Super超图,GIS软件
  6. 恒生电子:O45好在哪儿(深度)| 国君计算机李沐华
  7. input checkbox 选中问题
  8. PTA程序设计基础题目集(1)
  9. 扎克伯格让员工学会高效工作的26张PPT
  10. 进程的守护神 - daemontools(进程监控)
  11. cad vba 打开文件对话框_基于VBA的AutoCAD二次开发之批量替换DWG文件的指定范围(上)...
  12. 支付宝提现回调地址问题
  13. bmp格式如何转换成jpg
  14. 苹果vs剪辑下载_好用的短视频制作与剪辑APP工具盘点
  15. yolomouse怎么用_YoloMouse(游戏鼠标光标修改工具)_YoloMouse(游戏鼠标光标修改工具)官方版下载 - 键盘鼠标 - 绿软家园...
  16. 事务开启SpringBoot报错 The bean ‘xxxImpl’ could not be injected as a ‘com.xxx.service.impl.xxxServiceImpl
  17. 房车接父母“反向过年”成春运新亮点
  18. 无约束优化:线搜索最速下降
  19. 美国签证今天到手了, 发的是一年多次往返的
  20. 【CEPH-初识篇】ceph详细介绍+“ 一 ” 篇解决ceph集群搭建, “ 三 ” 大(对象、块、文件)存储使用

热门文章

  1. 视觉SLAM十四讲CH3代码解析及课后习题详解
  2. 工作笔记:Android高德定位使用说明
  3. 常见的积分商城游戏类型有哪些?
  4. HDU 5804 Price List (简单题)
  5. mp4转换m3u8格式php,【过程】第一次将m3u8文件转换为MP4文件经验分享
  6. python网格交易法详解_给大家科普一下网格交易法
  7. 在Windows上使用Cygwin源码安装tig
  8. 东方航空测试工程师面试题
  9. Linux gdb调试(4):多进程与多线程调试
  10. 熊猫直播P2P分享率优化(上):IP组网