iText5報表_頁首與頁尾

來源:互聯網
上載者:User

轉自: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類中就可以通過這個矩形,擷取文檔的邊框位置,從而設定頁首和頁尾。
代碼如下:
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.<

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.