轉自: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.<