【7步製做Itext5頁眉頁腳pdf實現第幾頁共幾頁】

itext5頁眉頁腳工具類,實現page x of y 完美兼容各類格式大小文檔A4/B5/B3,兼容各類文檔格式自動計算頁腳XY軸座標鑑於沒人作的這麼細緻,本身就寫了一個itext5頁眉頁腳工具類,實現第幾頁/共幾頁,方便各位剛進入itext的童鞋調用。java

  背景:網上流傳的都是一些簡單的demo,直接扔個A4文檔就說實現了,其實很坑的,換個A4橫版打印,那些代碼就不行了,因此本身搞了這個出來。工具

  工具類PdfReportM1HeaderFooter.java字體

  [java]ui

  <span style="font-family:Microsoft YaHei; font-size:12px">/**this

  * Project Name:reportspa

  * File Name:PdfReportM1HeaderFooter.java對象

  * Package Name:com.riambsoft.report.pdf文檔

  * Date:2013-9-16上午08:59:00字符串

  * Copyright (c) 2013, riambsoft All Rights Reserved.get

  *

  */

  package com.riambsoft.report.pdf;

  import java.io.IOException;

  import com.itextpdf.text.Document;

  import com.itextpdf.text.DocumentException;

  import com.itextpdf.text.Element;

  import com.itextpdf.text.Font;

  import com.itextpdf.text.PageSize;

  import com.itextpdf.text.Phrase;

  import com.itextpdf.text.Rectangle;

  import com.itextpdf.text.pdf.BaseFont;

  import com.itextpdf.text.pdf.ColumnText;

  import com.itextpdf.text.pdf.PdfContentByte;

  import com.itextpdf.text.pdf.PdfPageEventHelper;

  import com.itextpdf.text.pdf.PdfTemplate;

  import com.itextpdf.text.pdf.PdfWriter;

  /**

  * ClassName:PdfReportM1HeaderFooter <br/> Function: TODO ADD FUNCTION. <br/> Reason: TODO ADD REASON. <br/> Date: 2013-9-13 上午08:59:00 <br/>

  *

  * @author 落雨

  * @version 394263788(QQ)

  * @since JDK 1.5

  * @see //hi.baidu.com/ae6623

  */

  public class PdfReportM1HeaderFooter extends PdfPageEventHelper {

  /**

  * 頁眉

  */

  public String header = "";

  /**

  * 文檔字體大小,頁腳頁眉最好和文本大小一致

  */

  public int presentFontSize = 12;

  /**

  * 文檔頁面大小,最好前面傳入,不然默認爲A4紙張

  */

  public Rectangle pageSize = PageSize.A4;

  // 模板

  public PdfTemplate total;

  // 基礎字體對象

  public BaseFont bf = null;

  // 利用基礎字體生成的字體對象,通常用於生成中文文字

  public Font fontDetail = null;

  /**

  *

  * Creates a new instance of PdfReportM1HeaderFooter 無參構造方法。

  *

  */

  public PdfReportM1HeaderFooter() {

  }

  /**

  *

  * Creates a new instance of PdfReportM1HeaderFooter 構造方法。

  *

  * @param yeMei

  *            頁眉字符串

  * @param presentFontSize

  *            數據體字體大小

  * @param pageSize

  *            頁面文檔大小,A4,A5,A6橫轉翻轉等Rectangle對象

  */

  public PdfReportM1HeaderFooter(String yeMei, int presentFontSize, Rectangle pageSize) {

  this.header = yeMei;

  this.presentFontSize = presentFontSize;

  this.pageSize = pageSize;

  }

  public void setHeader(String header) {

  this.header = header;

  }

  public void setPresentFontSize(int presentFontSize) {

  this.presentFontSize = presentFontSize;

  }

  /**

  *

  * TODO 文檔打開時建立模板

  *

  * @see com.itextpdf.text.pdf.PdfPageEventHelper#onOpenDocument(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)

  */

  public void onOpenDocument(PdfWriter writer, Document document) {

  total = writer.getDirectContent()。createTemplate(50, 50);// 共 頁 的矩形的長寬高

  }

  /**

  *

  * TODO 關閉每頁的時候,寫入頁眉,寫入'第幾頁共'這幾個字。

  *

  * @see com.itextpdf.text.pdf.PdfPageEventHelper#onEndPage(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)

  */

  public void onEndPage(PdfWriter writer, Document document) {

  try {

  if (bf == null) {

  bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);

  }

  if (fontDetail == null) {

  fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 數據體字體

  }

  } catch (DocumentException e) {

  e.printStackTrace();

  } catch (IOException e) {

  e.printStackTrace();

  }

  // 1.寫入頁眉

  ColumnText.showTextAligned(writer.getDirectContent(), Element.ALIGN_LEFT, new Phrase(header, fontDetail), document.left(), document.top() + 20, 0);

  // 2.寫入前半部分的 第 X頁/共

  int pageS = writer.getPageNumber();

  String foot1 = "第 " + pageS + " 頁 /共";

  Phrase footer = new Phrase(foot1, fontDetail);

  // 3.計算前半部分的foot1的長度,後面好定位最後一部分的'Y頁'這倆字的x軸座標,字體長度也要計算進去 = len

  float len = bf.getWidthPoint(foot1, presentFontSize);

  // 4.拿到當前的PdfContentByte

  PdfContentByte cb = writer.getDirectContent();

  // 5.寫入頁腳1,x軸就是(右margin+左margin + right() -left()- len)/2.0F 再給偏移20F適合人類視覺感覺,不然肉眼看上去就太偏左了 ,y軸就是底邊界-20,不然就貼邊重疊到數據體裏了就不是頁腳了;注意Y軸是從下往上累加的,最上方的Top值是大於Bottom好幾百開外的。

  ColumnText.showTextAligned(cb, Element.ALIGN_CENTER, footer, (document.rightMargin() + document.right() + document.leftMargin() - document.left() - len) / 2.0F + 20F, document.bottom() - 20, 0);

  // 6.寫入頁腳2的模板(就是頁腳的Y頁這倆字)添加到文檔中,計算模板的和Y軸,X=(右邊界-左邊界 - 前半部分的len值)/2.0F + len , y 軸和以前的保持一致,底邊界-20

  cb.addTemplate(total, (document.rightMargin() + document.right() + document.leftMargin() - document.left()) / 2.0F + 20F, document.bottom() - 20); // 調節模版顯示的位置

  }

  /**

  *

  * TODO 關閉文檔時,替換模板,完成整個頁眉頁腳組件

  *

  * @see com.itextpdf.text.pdf.PdfPageEventHelper#onCloseDocument(com.itextpdf.text.pdf.PdfWriter, com.itextpdf.text.Document)

  */

  public void onCloseDocument(PdfWriter writer, Document document) {

  // 7.最後一步了,就是關閉文檔的時候,將模板替換成實際的 Y 值,至此,page x of y 製做完畢,完美兼容各類文檔size.

  total.beginText();

  total.setFontAndSize(bf, presentFontSize);// 生成的模版的字體、顏色

  String foot2 = " " + (writer.getPageNumber() - 1) + " 頁";

  total.showText(foot2);// 模版顯示的內容

  total.endText();

  total.closePath();

  }

  }</span>

  如何調用?

  這樣調用便可,下面的代碼就是 第幾頁/共幾頁的實現方式!推薦你們使用,直接扔到本身的工程,在建立pdf的時候,直接把此event set進去便可。

  [java]

  <span style="font-family:Microsoft YaHei; font-size:12px">/**

  * Project Name:report

  * File Name:PDFBuilder.java

  * Package Name:com.riambsoft.report.itext

  * Date:2013-9-13下午03:35:53

  * Copyright (c) 2013, riambsoft All Rights Reserved.

  *

  */

相關文章
相關標籤/搜索