转载一篇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/
分享到:
相关推荐
itext7 html转换为pdf;iText7页码、页眉、页脚,itext 的复杂表格实现;完整springboot项目代码
搜索了好多篇例子,算是强拼硬凑成现在的样子,还算比较满意吧。 此包中包含可测试成功代码,关联模板、字体文件、jar等 希望能帮助到大家。 这篇文章的作者蛮厉害,有不少借鉴。 ...
主要介绍了itext生成PDF设置页眉页脚的实例详解的相关资料,希望通过本文能帮助到大家,需要的朋友可以参考下
itextpdf 使用之 html 转 pdf 页眉页脚带图片,详见:https://blog.csdn.net/z1353095373/article/details/124762949
通过itextpdf生成页眉页脚
iText页码、页眉、页脚,itext 的复杂表格实现、保留表头、表尾、根据需求生成不同的iText表格
JSP页面直接转pdf,支持添加页眉页脚;如有问题请在下面评论联系
此资源包包含了用struts下载带有页眉页脚水印的pdf文件,其中用到的技术freemarker+itext整合开发,由于是刚从工程中抠出来的,不能运行起来,但完能是完好的,希望对网友们有帮助!
使用Itext简单生产了PDF文件,添加图片页眉的简单例子
NULL 博文链接:https://housen1987.iteye.com/blog/1335036
itext5.4.2 html2pdf 支持中文
iText7 用于html转换pdf核心包-html2pdf-1.0.1.jar。。。。
itext将图片生成PDF(高清版),可按比例缩放,三种可选的缩放方式,导出高清版的PDF,直接可导入使用的demo文件,内含jar包,无坑版!
1、itext将静态html转pdf中文显示及换行问题 2、itext将静态html转pdf 字体问题 3、html转pdf 参考我的另外一篇博文https://blog.csdn.net/qq_38616723/article/details/125188407?spm=1001.2014.3001.5502
itext 生成pdf 目录,itext 生成pdf 目录,itext 生成pdf 目录
利用itext读取PDF后使用pdfbox将PDF转为图片。压缩包内附有相应JAR文件
com.itextpdf.itextpdf.5.5.13.3 相关jar包和包含源码jar包 <groupId>com.itextpdf</groupId> <artifactId>itextpdf <version>5.5.13.3 下载地址为: ...
Android端用itext库生成的PDF文档无法输出中文,现修改itext库jar包,未修改源码,只是加入了字体部分。调用示例亲测可用,生成中文PDF文档
java实现html转pdf,包含后端代码,html测试页面,pom依赖,jar包,如页面过于复杂需调整页面,有些样式itextpdf不支持,请寻找其它样式替换。
java使用itextpdf、itext-asian对pdf文件加中文文字水印,此demo只提供参考,希望给需要的朋友带来帮助,谢谢支持!