iText5報表_頁眉與頁腳

轉自:http://blog.chinaunix.net/uid-122937-id-3052063.html

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.     
  18.     public void setHeader(String header){
  19.      this.header=header;
  20.     }
  21.     
  22.     public void onOpenDocument(PdfWriter writer,Document document){
  23.         total = writer.getDirectContent().createTemplate(30,16);
  24.     }
  25.     
  26.     public void onEndPage (PdfWriter writer, Document document) {
  27.      PdfPTable table = new PdfPTable(3);
  28.      try{
  29.      table.setWidths(new int[]{24,24,2});
  30.      table.setTotalWidth(527);
  31.      table.setLockedWidth(true);
  32.      table.getDefaultCell().setFixedHeight(20);
  33.      table.getDefaultCell().setBorder(Rectangle.BOTTOM);

  34.      table.addCell(header);
  35.      table.getDefaultCell().setHorizontalAlignment(
  36.      Element.ALIGN_RIGHT);
  37.      table.addCell(String.format("page %d of",writer.getPageNumber()));
  38.      PdfPCell cell = new PdfPCell(Image.getInstance(total));
  39.      cell.setBorder(Rectangle.BOTTOM);
  40.      table.addCell(cell);
  41.      table.writeSelectedRows(0,-1,34,803,writer.getDirectContent());

  42.      }
  43.      catch(DocumentException de){
  44.      throw new ExceptionConverter(de);
  45.      }
  46.     }
  47.     
  48.     public void onCloseDocument(PdfWriter writer,Document document){
  49.         ColumnText.showTextAligned(total,Element.ALIGN_LEFT,new Phrase(String.valueOf(writer.getPageNumber()-1)),2,2,0);
  50.      
  51.     }
  52. }
調用代碼如上面HeaderAndFooterDemo.java所示。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章