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

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

  1. import com.itextpdf.text.Document;
  2. import com.itextpdf.text.Element;
  3. import com.itextpdf.text.Phrase;
  4. import com.itextpdf.text.Rectangle;
  5. import com.itextpdf.text.pdf.ColumnText;
  6. import com.itextpdf.text.pdf.PdfPageEventHelper;
  7. import com.itextpdf.text.pdf.PdfWriter;
  8. public class HeaderFooter extends PdfPageEventHelper{
  9. public void onEndPage (PdfWriter writer, Document document) {
  10. Rectangle rect = writer.getBoxSize("art");
  11. switch(writer.getPageNumber() % 2) {
  12. case 0:
  13. ColumnText.showTextAligned(writer.getDirectContent(),
  14. Element.ALIGN_RIGHT, new Phrase("even header"),
  15. rect.getRight(), rect.getTop(), 0);
  16. break;
  17. case 1:
  18. ColumnText.showTextAligned(writer.getDirectContent(),
  19. Element.ALIGN_LEFT, new Phrase("odd header"),
  20. rect.getLeft(), rect.getTop(), 0);
  21. break;
  22. }
  23. ColumnText.showTextAligned(writer.getDirectContent(),
  24. Element.ALIGN_CENTER, new Phrase(String.format("page %d", writer.getPageNumber())),
  25. (rect.getLeft() + rect.getRight()) / 2, rect.getBottom() - 18, 0);
  26. }
  27. }

调用代码如下

  1. import com.itext.HeaderFooter;
  2. import com.itextpdf.text.pdf.PdfPageEventHelper;
  3. import com.itextpdf.text.pdf.PdfWriter;
  4. import com.itextpdf.text.pdf.ColumnText;
  5. import com.itextpdf.text.*;
  6. import java.io.FileOutputStream;
  7. public class HeaderAndFooterDemo {
        public static void main(String[] args){
  8. Document document = new Document(PageSize.A4, 50, 50, 50, 50);
  9. try{
  10. PdfWriter writer=PdfWriter.getInstance(document,
  11. new FileOutputStream("C:\\testHeaderAndFooter.pdf") );
  12. Rectangle rect = new Rectangle(36, 54, 559, 788);
  13. rect.setBorderColor(BaseColor.BLACK);
  14. writer.setBoxSize("art", rect);
  15. HeaderFooter header=new HeaderFooter();
  16. writer.setPageEvent(header);
  17. document.open();
  18. document.newPage();
  19. Paragraph par = new Paragraph("first paragraph");
  20. document.add(par);
  21. document.newPage();
  22. Paragraph par2 = new Paragraph("second paragraph");
  23. document.add(par2);
  24. document.close();
  25. }catch(Exception e){
  26. e.printStackTrace();
  27. }
  28. }
  29. }

3. 解决第X页/共Y页问题
       我们通过PdfWriter中的getPageNumber()函数获取当前是第几页,但是没有办法获取文档共多少页。
        我们可以利用XObject对象,iText仅在调用释放模板方法后才将PdfTemplate写入到OutputStream中,否则对象将一直保存在内存中,直到关闭文档。
       我们可以给第1个页面添加template,直到最后一个页面才将内容写入到这个模板。

  1. import com.itextpdf.text.Document;
  2. import com.itextpdf.text.DocumentException;
  3. import com.itextpdf.text.Element;
  4. import com.itextpdf.text.ExceptionConverter;
  5. import com.itextpdf.text.Image;
  6. import com.itextpdf.text.Phrase;
  7. import com.itextpdf.text.Rectangle;
  8. import com.itextpdf.text.pdf.ColumnText;
  9. import com.itextpdf.text.pdf.PdfPCell;
  10. import com.itextpdf.text.pdf.PdfPTable;
  11. import com.itextpdf.text.pdf.PdfPageEventHelper;
  12. import com.itextpdf.text.pdf.PdfTemplate;
  13. import com.itextpdf.text.pdf.PdfWriter;
  14. public class TableHeader extends PdfPageEventHelper{
  15. String header;
  16. PdfTemplate total;
  17. public void setHeader(String header){
  18. this.header=header;
  19. }
  20. public void onOpenDocument(PdfWriter writer,Document document){
  21. total = writer.getDirectContent().createTemplate(30,16);
  22. }
  23. public void onEndPage (PdfWriter writer, Document document) {
  24. PdfPTable table = new PdfPTable(3);
  25. try{
  26. table.setWidths(new int[]{24,24,2});
  27. table.setTotalWidth(527);
  28. table.setLockedWidth(true);
  29. table.getDefaultCell().setFixedHeight(20);
  30. table.getDefaultCell().setBorder(Rectangle.BOTTOM);
  31. table.addCell(header);
  32. table.getDefaultCell().setHorizontalAlignment(
  33. Element.ALIGN_RIGHT);
  34. table.addCell(String.format("page %d of",writer.getPageNumber()));
  35. PdfPCell cell = new PdfPCell(Image.getInstance(total));
  36. cell.setBorder(Rectangle.BOTTOM);
  37. table.addCell(cell);
  38. table.writeSelectedRows(0,-1,34,803,writer.getDirectContent());
  39. }
  40. catch(DocumentException de){
  41. throw new ExceptionConverter(de);
  42. }
  43. }
  44. public void onCloseDocument(PdfWriter writer,Document document){
  45. ColumnText.showTextAligned(total,Element.ALIGN_LEFT,new Phrase(String.valueOf(writer.getPageNumber()-1)),2,2,0);
  46. }
  47. }

调用代码如上面HeaderAndFooterDemo.java所示。

参考文献
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/

转载于:https://www.cnblogs.com/telwanggs/p/4921185.html

iText5报表_页眉与页脚相关推荐

  1. 如何使用报表工具设置页眉与页脚

    说明:盈帆报表中也可以设置页眉与页脚,本课程讲如何设置页眉与页脚. 第一步: 认识页眉与页脚 页眉和页脚:在菜单栏模板-页眉设置/页脚设置或者工具栏中点击都会弹出设置页面,页眉和页脚一样,在工作表中不 ...

  2. 水晶报表:页眉或页脚超过了一页 解决方式

    ============================================================================================ >> ...

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

    iText5添加页眉.页脚,logo.页码等实现 iText5添加页眉.页脚 版本及maven依赖 PdfHeaderFooterEvent PdfTest iText5添加页眉.页脚 iText5添 ...

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

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

  5. 论文页眉奇偶页不同怎么设置_还在愁毕业论文的页眉页脚吗?

    在文档中添加页眉和页脚能够很好的对相关信息进行展示或说明,在写论文的时候,设置页眉和页脚,能够让老师清楚的了解你的论文,但同时页眉和页脚的设置也是最让人头疼的,今天零壹学长就给大家详细的介绍页眉和页脚 ...

  6. 多份word合并 保留不同页眉_如何给Word设置不同页眉和页脚?

    我们在编辑Word文档时,有时需要设置不同的页眉,或每一页的页眉和页脚都各不相同,分别要用哪些功能键实现呢?用极速写作又是如何操作的呢?一起来学习下吧. 一.如何添加和删除页眉页脚 1.用极速写作打开 ...

  7. word删除任意单个字符_如何从Word中的单个页面中删除页眉或页脚

    word删除任意单个字符 You can remove or make changes to headers or footers on any page in Microsoft Word. Thi ...

  8. excel更改页眉页脚_如何在Excel的页眉和页脚中键入“&”号

    excel更改页眉页脚 Have you tried to type an ampersand (&) in a header or footer in Excel and seen it d ...

  9. mongo单个文档限制_如何在单个文档中使用多个页眉和页脚

    mongo单个文档限制 Word features a few built-in ways to change up your headers and footers in a document. F ...

最新文章

  1. 我是“真正的”软件工程师吗?
  2. 20145234黄斐《Java程序设计》第十周
  3. Node.js建站笔记-使用react和react-router取代Backbone
  4. 如果没有了Redis...
  5. java中怎样避免方法被重写
  6. python提高办公效率-提高工作效率的一点建议
  7. URLEncoder和URLDecoder(乱码处理)
  8. 【maven install报错】Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war
  9. NOIP2017提高组比赛总结
  10. ssl初一组周六模拟赛【2018.4.21】
  11. netflix 模式创新_创新设计模式:工厂模式
  12. 19. Python 类的重写   类的私有变量和私有方法
  13. java线程同步: synchronized详解(转)
  14. mysql全库备份/增量备份脚本
  15. 【优化算法】粒子群优化算法(PSO)【含Matlab源码 1073期】
  16. vue实现一个移动端屏蔽滑动的遮罩层
  17. 计算机二级MS office之excel常用函数
  18. [整理]VS2010中文版配置opencv2.4.8
  19. 2022年湖北安全员ABC证书查询是在哪里查真假呢?
  20. [UER#9]知识网络

热门文章

  1. (39)FPGA四种常用逻辑门(与非门)
  2. 5 加盐_洗猪肚,加盐洗就错了!加这2样,5分钟洗净,猪肚不腥不臊更入味
  3. leecode-12整数转化为罗马数字C版
  4. C语言中static关键字详解
  5. 蚌埠学院计算机科学技术校区,蚌埠学院计算机科学与关键技术(6页)-原创力文档...
  6. python里order_volume_Python 基础知识:Method Resolution Order (MRO) 和 super
  7. ajax nginx 转发 sessionid_「查缺补漏」巩固你的Nginx知识体系
  8. 读写自旋锁详解,第 3 部分(来自IBM)
  9. gettimeofday函数使用《代码》
  10. #ifndef #define #endif 和#pragma once的区别