1.概述 

       iText5中并没有之前版本HeaderFooter对象设置页眉和页脚,可以利用PdfPageEventHelper来完成页眉页脚的设置工作。PdfPageEventHelper中包含以下事件处理器。 

       onOpenDocument() — 当打开一个文档时触发,可以用于初始化文档的全局变量。 

       onStartPage() — 当一个页面初始化时触发,可用于初始化页面的设置参数,但是注意这个函数触发时,该页面并没有创建好,不用利用这个函数添加内容,最好利用onEndPage()处理页面的初始化。 

       onEndPage() — 在创建一个新页面完成但写入内容之前触发,是添加页眉、页脚、水印等最佳时机。 

       onCloseDocument() — 在文档关闭之前触发,可以用于释放一些资源。 

 

2.重载PdfPageEventHelper类 

       定义一个类HeaderFooter,继承了父类PdfPageEventHelper 

       在文档的每个页面中,必须定义一个Ractangle矩形,其中参数为art,这样在HeaderFooter类中就可以通过这个矩形,获取文档的边框位置,从而设置页眉和页脚。 

代码如下: 

 

Java代码  

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);  

  

    }  

  

}  

 

 

调用代码如下: 

 

Java代码  

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,直到最后一个页面才将内容写入到这个模板。 

 

Java代码  

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);  

  

       

  

    }