转载一篇blog 源地址为:
[url]
http://blog.chinaunix.net/uid-122937-id-3052063.html
[/url]
1.概述
iText5中并没有之前版本HeaderFooter对象设置页眉和页脚,可以利用PdfPageEventHelper来完成页眉页脚的设置工作。PdfPageEventHelper中包含以下事件处理器。
onOpenDocument() — 当打开一个文档时触发,可以用于初始化文档的全局变量。
onStartPage() — 当一个页面初始化时触发,可用于初始化页面的设置参数,但是注意这个函数触发时,该页面并没有创建好,不用利用这个函数添加内容,最好利用onEndPage()处理页面的初始化。
onEndPage() — 在创建一个新页面完成但写入内容之前触发,是添加页眉、页脚、水印等最佳时机。
onCloseDocument() — 在文档关闭之前触发,可以用于释放一些资源。

2.重载PdfPageEventHelper类
定义一个类HeaderFooter,继承了父类PdfPageEventHelper
在文档的每个页面中,必须定义一个Ractangle矩形,其中参数为art,这样在HeaderFooter类中就可以通过这个矩形,获取文档的边框位置,从而设置页眉和页脚。
代码如下:

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);

    }

}

调用代码如下:

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,直到最后一个页面才将内容写入到这个模板。

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);

    }

}

调用代码会显示页眉为page 1 of 2 字样。

参考文献
1.Adding page events to PdfWriter (iText 5).http://what-when-how.com/itext-5/adding-page-events-to-pdfwriter-itext-5/
2iText5参考. http://api.itextpdf.com/itext/

Itext 学习笔记(六) pdf的页眉页脚相关推荐

  1. java反射 pdf_java反射学习笔记整理.pdf

    java反射学习笔记整理.pdf 还剩 15页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保! 内容要点: Java 反射笔记 ...

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

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

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

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

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

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

  5. Itext pdf的页眉页脚

    1.概述 iText5中并没有之前版本HeaderFooter对象设置页眉和页脚,可以利用PdfPageEventHelper来完成页眉页脚的设置工作.PdfPageEventHelper中包含以下事 ...

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

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

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

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

  8. Word学习笔记:P6-文档封面、页眉、页脚设置

    文章目录 一.文档封面设计 二.页眉.页脚设置 一.文档封面设计 今天我们需要插入一张图片作为封面,此时我们需要将第一页空出来.有的人会将鼠标移动到第一页标题的开头,然后一直按Enter键,直到第一页 ...

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

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

最新文章

  1. 静态路由与配置 知识点
  2. 8个容易被忽略但不能忽略的SD-WAN功能-Vecloud
  3. Transformer入门篇-深度万字长文带你轻松入门深度学习框架
  4. C++学习之路 | PTA乙级—— 1032 挖掘机技术哪家强 (20 分)(精简)
  5. xp和linux的引导文件,Linux与XP双系统中grub引导配置笔记
  6. linux视频字幕下载工具,Linux中编辑视频字幕
  7. Michael Bronstein从代数拓扑学取经,提出了一种新的图神经网络计算结构!
  8. QTableView实现冻结行冻结列
  9. CH 6202 黑暗城堡
  10. 算法导论8.4-4-单位圆中均匀分布情况--桶排序
  11. linux pv 信号量,pv操作与信号量(示例代码)
  12. python建立数据库连接时出错_python连接数据库
  13. weinre安装及使用
  14. 企业邮箱品牌选择,公司邮箱托管,外包企业邮箱哪个好?
  15. 从根本上理解 机器学习中真实值、观测值、预测值的区别
  16. 谨慎程序员创业的思维障碍
  17. idea怎么打开war包并运行
  18. [ZZULIOJ] 1205: 你爱我么?
  19. Java 泛型中的 ? T K V E等代表的意思
  20. what a pity!

热门文章

  1. 测试不同体重体型软件样子的,hikaku-sitatter身高软件,一键测试自己的体型
  2. DM36X UBL UBoot
  3. Computer Vision—计算机视觉 (一)
  4. A5SHB,A5SHB芯片三极管规格书
  5. 罗斯蒙特333D信号转换器
  6. 利用谷歌镜像网站编辑Latex的参考文献与doi链接
  7. 《西西弗神话》笔记——不期待人生可以过得很顺利,但我希望碰到人生难关的时候,自己可以是它的对手
  8. 微信公众号服务器瘫痪的现象,微信出现大范围故障瘫痪30分钟 现已恢复正常
  9. 微软 Office Online 在线查看word,pdf, xls,ppt 文档
  10. 小猫打螃蟹-第10届蓝桥杯Scratch省赛真题第2题