Itext 学习笔记(六) pdf的页眉页脚

转载一篇blog 源地址为:
[url]
http://blog.chinaunix.net/uid-122937-id-3052063.html
[/url]
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);



}

}


调用代码会显示页眉为page 1 of 2 字样。


参考文献
1.Adding page events to PdfWriter (iText 5).http://what-when-how.com/itext-5/adding-page-events-to-pdfwriter-itext-5/
2iText5参考. http://api.itextpdf.com/itext/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值