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);
-
-
}
-
}
调用代码如上面HeaderAndFooterDemo.java所示。
参考文献1.Adding page events to PdfWriter (iText 5).
2iText5参考.
阅读(16725) | 评论(1) | 转发(1) |