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

itext5页眉页脚工具类,实现page x of y 完美兼容各种格式大小文档A4/B5/B3,兼容各种文档格式自动计算页脚XY轴坐标

鉴于没人做的这么细致,自己就写了一个itext5页眉页脚工具类,实现第几页/共几页,方便各位刚进入itext的童鞋调用。2013年9月16日 14:51:01

背景:网上流传的都是一些简单的demo,直接扔个A4文档就说实现了,其实很坑的,换个A4横版打印,那些代码就不行了,所以自己搞了这个出来。

如果页面看着排版不好,请移步我的百度空间 :http://hi.baidu.com/ae6623/item/08abce3ce29359119dc65ecf

工具类PdfReportM1HeaderFooter.java

[java] view plaincopy

  1. <span style="font-family:Microsoft YaHei; font-size:12px">/**
  2. * Project Name:report
  3. * File Name:PdfReportM1HeaderFooter.java
  4. * Package Name:com.riambsoft.report.pdf
  5. * Date:2013-9-16上午08:59:00
  6. * Copyright (c) 2013, riambsoft All Rights Reserved.
  7. *
  8. */
  9. package com.riambsoft.report.pdf;
  10. import java.io.IOException;
  11. import com.itextpdf.text.Document;
  12. import com.itextpdf.text.DocumentException;
  13. import com.itextpdf.text.Element;
  14. import com.itextpdf.text.Font;
  15. import com.itextpdf.text.PageSize;
  16. import com.itextpdf.text.Phrase;
  17. import com.itextpdf.text.Rectangle;
  18. import com.itextpdf.text.pdf.BaseFont;
  19. import com.itextpdf.text.pdf.ColumnText;
  20. import com.itextpdf.text.pdf.PdfContentByte;
  21. import com.itextpdf.text.pdf.PdfPageEventHelper;
  22. import com.itextpdf.text.pdf.PdfTemplate;
  23. import com.itextpdf.text.pdf.PdfWriter;
  24. /**
  25. * ClassName:PdfReportM1HeaderFooter <br/> Function: TODO ADD FUNCTION. <br/> Reason: TODO ADD REASON. <br/> Date: 2013-9-13 上午08:59:00 <br/>
  26. *
  27. * @author 落雨
  28. * @version 394263788(QQ)
  29. * @since JDK 1.5
  30. * @see http://hi.baidu.com/ae6623
  31. */
  32. public class PdfReportM1HeaderFooter extends PdfPageEventHelper {
  33. /**
  34. * 页眉
  35. */
  36. public String header = "";
  37. /**
  38. * 文档字体大小,页脚页眉最好和文本大小一致
  39. */
  40. public int presentFontSize = 12;
  41. /**
  42. * 文档页面大小,最好前面传入,否则默认为A4纸张
  43. */
  44. public Rectangle pageSize = PageSize.A4;
  45. // 模板
  46. public PdfTemplate total;
  47. // 基础字体对象
  48. public BaseFont bf = null;
  49. // 利用基础字体生成的字体对象,一般用于生成中文文字
  50. public Font fontDetail = null;
  51. /**
  52. *
  53. * Creates a new instance of PdfReportM1HeaderFooter 无参构造方法.
  54. *
  55. */
  56. public PdfReportM1HeaderFooter() {
  57. }
  58. /**
  59. *
  60. * Creates a new instance of PdfReportM1HeaderFooter 构造方法.
  61. *
  62. * @param yeMei
  63. *            页眉字符串
  64. * @param presentFontSize
  65. *            数据体字体大小
  66. * @param pageSize
  67. *            页面文档大小,A4,A5,A6横转翻转等Rectangle对象
  68. */
  69. public PdfReportM1HeaderFooter(String yeMei, int presentFontSize, Rectangle pageSize) {
  70. this.header = yeMei;
  71. this.presentFontSize = presentFontSize;
  72. this.pageSize = pageSize;
  73. }
  74. public void setHeader(String header) {
  75. this.header = header;
  76. }
  77. public void setPresentFontSize(int presentFontSize) {
  78. this.presentFontSize = presentFontSize;
  79. }
  80. /**
  81. *
  82. * TODO 文档打开时创建模板
  83. *
  84. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
  85. */
  86. public void onOpenDocument(PdfWriter writer, Document document) {
  87. total = writer.getDirectContent().createTemplate(50, 50);// 共 页 的矩形的长宽高
  88. }
  89. /**
  90. *
  91. * TODO 关闭每页的时候,写入页眉,写入‘第几页共‘这几个字。
  92. *
  93. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
  94. */
  95. public void onEndPage(PdfWriter writer, Document document) {
  96. try {
  97. if (bf == null) {
  98. bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
  99. }
  100. if (fontDetail == null) {
  101. fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
  102. }
  103. } catch (DocumentException e) {
  104. e.printStackTrace();
  105. } catch (IOException e) {
  106. e.printStackTrace();
  107. }
  108. // 1.写入页眉
  109. ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, fontDetail), document.left(), document.top() + 20, 0);
  110. // 2.写入前半部分的 第 X页/共
  111. int pageS = writer.getPageNumber();
  112. String foot1 = "第 " + pageS + " 页 /共";
  113. Phrase footer = new Phrase(foot1, fontDetail);
  114. // 3.计算前半部分的foot1的长度,后面好定位最后一部分的‘Y页‘这俩字的x轴坐标,字体长度也要计算进去 = len
  115. float len = bf.getWidthPoint(foot1, presentFontSize);
  116. // 4.拿到当前的PdfContentByte
  117. PdfContentByte cb = writer.getDirectContent();
  118. // 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0F 再给偏移20F适合人类视觉感受,否则肉眼看上去就太偏左了 ,y轴就是底边界-20,否则就贴边重叠到数据体里了就不是页脚了;注意Y轴是从下往上累加的,最上方的Top值是大于Bottom好几百开外的。
  119. ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer, (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F + 20F, document.bottom() - 20, 0);
  120. // 6.写入页脚2的模板(就是页脚的Y页这俩字)添加到文档中,计算模板的和Y轴,X=(右边界-左边界 - 前半部分的len值)/2.0F + len , y 轴和之前的保持一致,底边界-20
  121. cb.addTemplate(total, (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F, document.bottom() - 20); // 调节模版显示的位置
  122. }
  123. /**
  124. *
  125. * TODO 关闭文档时,替换模板,完成整个页眉页脚组件
  126. *
  127. * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)
  128. */
  129. public void onCloseDocument(PdfWriter writer, Document document) {
  130. // 7.最后一步了,就是关闭文档的时候,将模板替换成实际的 Y 值,至此,page x of y 制作完毕,完美兼容各种文档size。
  131. total.beginText();
  132. total.setFontAndSize(bf, presentFontSize);// 生成的模版的字体、颜色
  133. String foot2 = " " + (writer.getPageNumber() - 1) + " 页";
  134. total.showText(foot2);// 模版显示的内容
  135. total.endText();
  136. total.closePath();
  137. }
  138. }</span>

如何调用?

这样调用即可,下面的代码就是 第几页/共几页的实现方式!推荐大家使用,直接扔到自己的工程,在创建pdf的时候,直接把此event set进去即可。

[java] view plaincopy

  1. <span style="font-family:Microsoft YaHei; font-size:12px">/**
  2. * Project Name:report
  3. * File Name:PDFBuilder.java
  4. * Package Name:com.riambsoft.report.itext
  5. * Date:2013-9-13下午03:35:53
  6. * Copyright (c) 2013, riambsoft All Rights Reserved.
  7. *
  8. */
  9. package com.riambsoft.report.itext;
  10. import java.io.FileOutputStream;
  11. import java.io.IOException;
  12. import com.itextpdf.text.Document;
  13. import com.itextpdf.text.DocumentException;
  14. import com.itextpdf.text.PageSize;
  15. import com.itextpdf.text.Rectangle;
  16. import com.itextpdf.text.pdf.ColumnText;
  17. import com.itextpdf.text.pdf.PdfContentByte;
  18. import com.itextpdf.text.pdf.PdfWriter;
  19. import com.riambsoft.report.pdf.PdfReportM1HeaderFooter;
  20. /**
  21. * ClassName:PDFBuilder <br/>
  22. * Function: TODO ADD FUNCTION. <br/>
  23. * Reason:   TODO ADD REASON. <br/>
  24. * Date: 2013-9-13 下午03:35:53 <br/>
  25. * @author Administrator
  26. * @version
  27. * @since JDK 1.5
  28. * @see
  29. */
  30. public class PDFBuilder {
  31. private int pageHeight;
  32. private int pageWidth;
  33. private PDFBuilder(){
  34. }
  35. public static PDFBuilder getInstance(){
  36. return new PDFBuilder();
  37. }
  38. public void generatePDF()throws Exception {
  39. Document document = new Document(new Rectangle(pageWidth, pageHeight));
  40. PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(""));
  41. this.setFooter(writer);
  42. writer.setFullCompression();
  43. writer.setPdfVersion(PdfWriter.VERSION_1_4);
  44. document.open();
  45. // Set pdf version to 1.4
  46. PdfContentByte cb = writer.getDirectContent();
  47. ColumnText ct=new ColumnText(cb);
  48. for(int i=0;i<10;i++){
  49. document.newPage();
  50. //如果不设置 空白页无法单独显示
  51. writer.setPageEmpty(false);
  52. }
  53. document.close();
  54. }
  55. private void setFooter(PdfWriter writer) throws DocumentException, IOException {
  56. //HeaderFooter headerFooter = new HeaderFooter(this);
  57. //更改事件,瞬间变身 第几页/共几页 模式。
  58. PdfReportM1HeaderFooter headerFooter = new PdfReportM1HeaderFooter();//就是上面那个类
  59. writer.setBoxSize("art",PageSize.A4);
  60. writer.setPageEvent(headerFooter);
  61. }
  62. public int getPageHeight() {
  63. return pageHeight;
  64. }
  65. public void setPageHeight(int pageHeight) {
  66. this.pageHeight = pageHeight;
  67. }
  68. public int getPageWidth() {
  69. return pageWidth;
  70. }
  71. public void setPageWidth(int pageWidth) {
  72. this.pageWidth = pageWidth;
  73. }
  74. public static void main(String[] args) throws Exception {
  75. PDFBuilder builder=new PDFBuilder();
  76. builder.setPageHeight(400);
  77. builder.setPageWidth(600);
  78. builder.generatePDF();
  79. }
  80. }</span>

核心算法:就是计算文档的长宽,算出中点,记得中文字体是需要占用宽度的,所以也要计算进去,其次没什么重点,研究一下中点的计算吧,初中知识。

paga x 这种好做,page x of y 按照官方 itext in action 2这本书上面说的那种办法,无法准确计算各种文档的x轴和y轴坐标。

我按照书上所写的实现方式如下,不推荐使用,因为只适合于A4纸张。

PdfReportM1HeaderFooter2.java

[java] view plaincopy

  1. <span style="font-family:Microsoft YaHei; font-size:12px">/**
  2. * Project Name:report
  3. * File Name:PdfReportM1HeaderFooter.java
  4. * Package Name:com.riambsoft.report.pdf
  5. * Date:2013-9-13上午08:59:00
  6. * Copyright (c) 2013, riambsoft All Rights Reserved.
  7. *
  8. */
  9. package com.riambsoft.report.pdf;
  10. import java.io.IOException;
  11. import com.itextpdf.text.Document;
  12. import com.itextpdf.text.DocumentException;
  13. import com.itextpdf.text.Element;
  14. import com.itextpdf.text.ExceptionConverter;
  15. import com.itextpdf.text.Font;
  16. import com.itextpdf.text.Image;
  17. import com.itextpdf.text.Phrase;
  18. import com.itextpdf.text.Rectangle;
  19. import com.itextpdf.text.pdf.BaseFont;
  20. import com.itextpdf.text.pdf.ColumnText;
  21. import com.itextpdf.text.pdf.PdfPCell;
  22. import com.itextpdf.text.pdf.PdfPTable;
  23. import com.itextpdf.text.pdf.PdfPageEventHelper;
  24. import com.itextpdf.text.pdf.PdfTemplate;
  25. import com.itextpdf.text.pdf.PdfWriter;
  26. /**
  27. * ClassName:PdfReportM1HeaderFooter2 <br/> Function: TODO ADD FUNCTION. <br/> Reason: TODO ADD REASON. <br/> Date: 2013-9-13 上午08:59:00 <br/>
  28. *
  29. * @author Administrator
  30. * @version
  31. * @since JDK 1.5
  32. * @see
  33. */
  34. public class PdfReportM1HeaderFooter2 extends PdfPageEventHelper {
  35. String header;
  36. int presentFontSize = 12;
  37. PdfTemplate total;
  38. BaseFont bf = null;
  39. Font fontDetail = null;
  40. public void setHeader(String header) {
  41. this.header = header;
  42. }
  43. public void onOpenDocument(PdfWriter writer, Document document) {
  44. total = writer.getDirectContent().createTemplate(30, 16);
  45. }
  46. public void onEndPage(PdfWriter writer, Document document) {
  47. Rectangle pageSize = writer.getBoxSize("art");
  48. try {
  49. if (bf == null) {
  50. bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
  51. }
  52. if (fontDetail == null) {
  53. fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
  54. }
  55. } catch (DocumentException e) {
  56. e.printStackTrace();
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. int pageN = writer.getPageNumber();
  61. String text = "第 " + pageN + "页/共 ";
  62. // 页眉
  63. ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase("我是页眉,土豪我们做朋友吧",fontDetail), document.left(), document.top() + 20, 0);
  64. PdfPTable table = new PdfPTable(2);
  65. try {
  66. table.setWidths(new int[] { 1, 1 });
  67. table.setWidthPercentage(100F);// 占据百分百宽度
  68. table.setTotalWidth(pageSize.getRight() - pageSize.getLeft() - 100);
  69. PdfPCell cell1 = new PdfPCell(new Phrase(text, fontDetail));
  70. PdfPCell cell2 = new PdfPCell(Image.getInstance(total));
  71. cell1.setHorizontalAlignment(Element.ALIGN_RIGHT);
  72. cell1.setBorder(Rectangle.NO_BORDER);
  73. cell2.setHorizontalAlignment(Element.ALIGN_LEFT);
  74. cell2.setBorder(Rectangle.NO_BORDER);
  75. table.addCell(cell1);
  76. table.addCell(cell2);
  77. table.writeSelectedRows(0, -1, document.left(), document.bottom(), writer.getDirectContent());
  78. } catch (DocumentException de) {
  79. throw new ExceptionConverter(de);
  80. }
  81. }
  82. public void onCloseDocument(PdfWriter writer, Document document) {
  83. try {
  84. if (bf == null) {
  85. bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);
  86. }
  87. if (fontDetail == null) {
  88. fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
  89. }
  90. } catch (DocumentException e) {
  91. e.printStackTrace();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. ColumnText.showTextAligned(total, Element.ALIGN_LEFT, new Phrase(String.format("%d页", writer.getPageNumber() - 1), fontDetail), 2, 2, 0);
  96. }
  97. }</span>

这种只能自己去计算Y轴坐标,很容易不在一行。所以不如我的第一种方便。具体就看你使用了。

时间: 2024-10-07 22:28:52

【Itext】7步制作Itext5页眉页脚pdf实现第几页共几页的相关文章

Word 页眉插入自动标题(页眉显示章节标题)

做word文档时有时候需要将章节标题加到页眉中,这里实现自动获取和自动更新页眉里面的标题 1.双击页眉,输入固定文字作为页眉左边的显示,然后敲2下table键,为接下来插入自动标题做好准备,如下图: 2.点击[插入] 3.在[插入]选项中找到[文档部件]>>[域],如图: 4.在[域]里选择[StyleRef],然后设置你想要显示在页眉里面的标题的类型就可以了,如图: 如果要插入对应的标题编号(前提是你使用的是自动编号,而不是你手动输入的编号),可以在[域选项]里先勾选[插入段落编号],然后[

分节符、分页符及页眉设置方法

每天忙于写论文,小论文倒也罢了,没有多少需要排版的东西,最多是一栏变两栏,字体字号等等,简单得很,可大论文就不一样了,需要封面设计.页眉页脚.表格不能跨页.一级标题.二级标题--,几乎把我变成了一个排版工人!没办法,只能一点点学,但学会了也发现其实很简单的,俗话说:求人不如求己,所以还是自己学会一点排版的知识,防止在需要的时候束手无策!以后我会把文章编排的各种小窍门写下来与大家共享. 1.如何设置页眉页脚? "视图"→"页眉和页脚",将会打开页眉页脚编辑工具栏,同时

Word2010中的页眉怎样删除和添加横线

http://jingyan.baidu.com/article/f79b7cb3bb3c629144023e05.html 我们在使用Word2010编辑文档中时,有时需要在页眉下方删除或添加一条横线.本篇经验就来介绍一下删除和添加横线的方法. 工具/原料 Word 2010 一.删除横线 1 打开Word2010文档,双击页眉. 2 选中整个页眉段落,注意一定要选择段落标记. 3 单击"开始"功能区. 4 在"段落"中单击边框线下三角按钮. 5 在边框线列表中选

如何让页眉随章节的不同而变化(Word 2010)

在一般情况下,我们将页眉设置完成后,所有章节的页眉都是一样的. 但在某些时候,我们需要让不同的章节拥有各自不同的页眉.那么该如何设置呢? 1. 我们以下图的文件为例,该文件一共包括4个实验,暂未设置页眉. 2. 双击页眉处进入页眉编辑,输入“实验一 甲基丙烯酸甲酯的本体聚合”,设置页眉. 此时,我们可以看到“实验二”(第4页)的页眉同样也是“实验一 甲基丙烯酸甲酯的本体聚合”. 页眉.页脚均无“节”的信息. 同样,实验三的页眉也是“实验一 甲基丙烯酸甲酯的本体聚合”. 现在开始分节,对页眉进行处

word页眉与页脚详解

1.如何隔离封面等不需要插入页码的页面: 首先插入分节符下一页(一定是分节符),再在下一页(即要开始插入页码的页面)选择视图-->页眉和页脚-->设置为取消链接到前一页.设置页码格式为起始页码-->插入页码 2.如何插入去除封面的总页数: 你只需要用总页数减去封面页数就行了,象平时一样插入总的页数,按Alt+F9切换至域代码,会看到形如{ NUMPAGES },选中它,剪切,按Ctrl+F9插入一对花括号,点一下花括号中间的位置,粘贴,在前面加入=号,在后面减去页数,即形如{ ={ NU

Office WORD如何为每一页设置不同的页眉页脚

如下图所示,我想要为封面和目录,摘要等等设置不同的页眉页脚(一般封面和目录不需要页脚) ? 而从正文开始,套用相同的页眉和以页数作为页脚(注意"第一章 绪论"不是这个文档的第一页) ? 具体实现方法: 1 将光标定位到第一页(在第一页的任意位置都行),点击视图-页眉和页脚.然后输入页眉"封面".点击关闭按钮,这个页眉就做好了. ? 2 往下翻,发现每一页的页眉都是"封面".我的第二页是目录,所以要把页眉改成目录.首先光标定位到第一页的末尾,点击插

itext 生成pdf文件添加页眉页脚

原文来自:https://www.cnblogs.com/joann/p/5511905.html 我只是记录所有jar版本,由于版本冲突及不兼容很让人头疼的,一共需要5个jar, 其中itextpdf是itext的升级版本,并且itextpdf-5.5.jar以上版本算总页数不需要-1,之前版本必须-1: jfinal.jar只能用2.0版本,用3.0的会报版本过高:希望能帮到有需要的人 itextpdf-5.5.13.jar 下载地址:http://central.maven.org/mav

iText + Freemarker实现pdf的导出,支持中文、css以及图片,页眉页脚,页眉添加图片

本文为了记录自己的实现过程,具体的实现步骤是参考博文 https://www.cnblogs.com/youzhibing/p/7692366.html 来实现的,只是在他的基础上添加了页眉页脚及页眉图片 原来是决定采用wkhtmlToPdf将html页面转换为pdf,而且html样式保存的还挺好,但是最后尝试下来发现,他转换不了我们框架中的html页面,将框架中的html页面地址进行转换总是会转换成首页的图片,多次查询无果,最终放弃了,改换成itext工具. 由于我们的需求中要求有页眉和页脚,

iText5报表_页眉与页脚

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