iText生成PDF文件,每页显示页码以及总页数的实现

如果想在页眉或者页脚加上第x页这样的信息,用普通的HeaderFooter就能轻松搞定。
HeaderFooter footer = new HeaderFooter(new Phrase("第:",FontChinese), new Phrase("页",FontChinese));    
footer.setBorder(Rectangle.NO_BORDER);
document.setFooter(footer);
document.open();


如果想在每页显示第x页/共y页这样的功能,实现起来没有那么轻松。
官方页面有具体实现的例子,连接地址:
[url]http://itextdocs.lowagie.com/tutorial/directcontent/pageevents/index.php[/url]
源码:
[url]http://itextdocs.lowagie.com/examples/com/lowagie/examples/directcontent/pageevents/PageNumbersWatermark.java[/url]

源码里面的东西比较繁多,精简以后如下:


import java.io.FileOutputStream;

import com.lowagie.text.Document;
import com.lowagie.text.Element;
import com.lowagie.text.ExceptionConverter;
import com.lowagie.text.Font;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfContentByte;
import com.lowagie.text.pdf.PdfPageEventHelper;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;

public class PdfExport extends PdfPageEventHelper{

public PdfTemplate tpl;
public BaseFont bf;

public static void main(String[] args) {
Document document = new Document(PageSize.A4, 20, 20, 20, 20);
try {
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("D:\\HelloItext.pdf"));
writer.setPageEvent(new PdfExport());

BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);

document.open();

Paragraph title = new Paragraph("测试内容。。。。", new Font(bfChinese,15));
title.setAlignment(Element.ALIGN_CENTER);
document.add(title);
} catch (Exception de) {
de.printStackTrace();
}
document.close();
}

public void onOpenDocument(PdfWriter writer, Document document) {
try {
tpl = writer.getDirectContent().createTemplate(100, 100);
bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
}
catch(Exception e) {
throw new ExceptionConverter(e);
}
}

public void onEndPage(PdfWriter writer, Document document) {
//在每页结束的时候把“第x页”信息写道模版指定位置
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
String text = "第" + writer.getPageNumber() + "页,共";
cb.beginText();
cb.setFontAndSize(bf, 8);
cb.setTextMatrix(460, 786);//定位“第x页,共” 在具体的页面调试时候需要更改这xy的坐标
cb.showText(text);
cb.endText();
cb.addTemplate(tpl, 492, 786);//定位“y页” 在具体的页面调试时候需要更改这xy的坐标

cb.saveState();
cb.stroke();
cb.restoreState();
cb.closePath();//sanityCheck();
}

public void onCloseDocument(PdfWriter writer, Document document) {
//关闭document的时候获取总页数,并把总页数按模版写道之前预留的位置
tpl.beginText();
tpl.setFontAndSize(bf, 8);
tpl.showText(Integer.toString(writer.getPageNumber() - 1)+"页");
tpl.endText();
tpl.closePath();//sanityCheck();
}
}
您可以使用itextpdf库中的PageXofY类来设置页脚页数,同时也可以使用PdfPageEventHelper类来设置页面显示效果。以下是一个示例,展示如何同时设置页脚页数和页面显示效果: ``` class PageNumberEventHandler extends PdfPageEventHelper { protected PdfFont font; protected float fontSize; protected float yOffset; public PageNumberEventHandler(PdfFont font, float fontSize, float yOffset) { this.font = font; this.fontSize = fontSize; this.yOffset = yOffset; } @Override public void onEndPage(PdfWriter writer, Document document) { PdfCanvas pdfCanvas = new PdfCanvas(writer.getPageNumber(), writer.getPageSize()); Rectangle pageSize = pdfCanvas.getPageSize(); Paragraph para = new Paragraph().setFont(font).setFontSize(fontSize).add("Page " + writer.getPageNumber()); new Canvas(pdfCanvas, pdfCanvas.getDocument(), pageSize) .showTextAligned(para, pageSize.getWidth() / 2, yOffset, TextAlignment.CENTER); } } public void addPageNumbersAndPageEffect(String src, String dest, PdfFont font, float fontSize, float yOffset) throws IOException { PdfReader reader = new PdfReader(src); PdfWriter writer = new PdfWriter(dest); PdfDocument pdfDoc = new PdfDocument(reader, writer); pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE, new PageNumberEventHandler(font, fontSize, yOffset)); pdfDoc.getCatalog().setPageMode(PdfName.UseOutlines); pdfDoc.getCatalog().setPageLayout(PdfName.SinglePage); pdfDoc.close(); } ``` 在上面的示例中,我们创建了一个PageNumberEventHandler类来设置页脚页数并继承PdfPageEventHelper类来设置页面显示效果。在onEndPage()方法中,我们获取当前页码、页面大小和PdfCanvas对象,并使用Canvas类将页码添加到页面底部的中心位置。在addPageNumbersAndPageEffect()方法中,我们将源PDF文件的路径和目标PDF文件的路径作为参数,并使用PdfDocument对象打开源PDF文件,添加PageNumberEventHandler对象,并设置页面显示效果(使用书签和单页模式)。最后,我们将结果保存到目标PDF文件中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值