轉自: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.itextpdf.text.DocumentException;
-
import com.itextpdf.text.Element;
-
import com.itextpdf.text.ExceptionConverter;
-
import com.itextpdf.text.Image;
-
import com.itextpdf.text.Phrase;
-
import com.itextpdf.text.Rectangle;
-
import com.itextpdf.text.pdf.ColumnText;
-
import com.itextpdf.text.pdf.PdfPCell;
-
import com.itextpdf.text.pdf.PdfPTable;
-
import com.itextpdf.text.pdf.PdfPageEventHelper;
-
import com.itextpdf.text.pdf.PdfTemplate;
-
import com.itextpdf.text.pdf.PdfWriter;
-
-
public class TableHeader extends PdfPageEventHelper{
-
String header;
-
PdfTemplate total;
-
-
public void setHeader(String header){
-
this.header=header;
-
}
-
-
public void onOpenDocument(PdfWriter writer,Document document){
-
total = writer.getDirectContent().createTemplate(30,16);
-
}
-
-
public void onEndPage (PdfWriter writer, Document document) {
-
PdfPTable table = new PdfPTable(3);
-
try{
-
table.setWidths(new int[]{24,24,2});
-
table.setTotalWidth(527);
-
table.setLockedWidth(true);
-
table.getDefaultCell().setFixedHeight(20);
-
table.getDefaultCell().setBorder(Rectangle.BOTTOM);
-
-
table.addCell(header);
-
table.getDefaultCell().setHorizontalAlignment(
-
Element.ALIGN_RIGHT);
-
table.addCell(String.format("page
%d of",writer.getPageNumber()));
-
PdfPCell cell = new PdfPCell(Image.getInstance(total));
-
cell.setBorder(Rectangle.BOTTOM);
-
table.addCell(cell);
-
table.writeSelectedRows(0,-1,34,803,writer.getDirectContent());
-
-
}
-
catch(DocumentException de){
-
throw new ExceptionConverter(de);
-
}
-
}
-
-
public void onCloseDocument(PdfWriter writer,Document document){
-
ColumnText.showTextAligned(total,Element.ALIGN_LEFT,new Phrase(String.valueOf(writer.getPageNumber()-1)),2,2,0);
-
-
}
- }