如果不需要显示总页数(像X of Y , 当前是第X页,共Y页之类的),下面的方法就够.
在Document.open()之前加上
HeaderFooter footer = new HeaderFooter(new Phrase("页码:",yourFont, true);
footer.setBorder(Rectangle.NO_BORDER);
document.setFooter(footer);
如果要加上总页数,就麻烦多了-___-.
您需要使用PdfTemplate来保存总页数信息,需要使用PdfPageEvent来在一些类型的事件响应代码里做些处理.
获得总页数这样的工作随便一想好像很容易,但是在iText流水式输出内容到pdf文档中的每一页的时候,它怎么知道一共有多少页?好吧,是在它把内容全部输出完的时候,它知道自己弄了多少页了,但这时候又怎么回过头来给每个页面重新加上页码?
说实话,到现在我也只是根据
官方例子成功得到了想要的效果而并不太了解相关的工作原理.
我们可以通过实现PdfPageEvent接口或者扩展PdfPageEventHelper类,使我们可以在文档开始、每页开始、每页结束、文档结束等地方做些工作以达到插入页码的目的.
public class PDFMaker extends PdfPageEventHelper {
/**这个PdfTemplate实例用于保存总页数 */
public PdfTemplate tpl;
/** 页码字体 */
public BaseFont helv;
public void make(Document doc) throws Exception
{
pdf = new com.lowagie.text.Document(pagesize,10,10,10,10);
PdfWriter writer = PdfWriter.getInstance(pdf,pdfout);
//设置页页事件监听器
Font pageNumFont = new Font(bf_chn,9,Font.NORMAL);
writer.setPageEvent(this);
pdf.open();
//正常的PDF写入操作代码
pdf.close();
}
@Override
public void onCloseDocument(PdfWriter writer, com.lowagie.text.Document arg1) {
// TODO Auto-generated method stub
System.out.println("OCD");
tpl.beginText();
tpl.setFontAndSize(helv, 12);
tpl.setTextMatrix(0, 0);
tpl.showText("" + (writer.getPageNumber() - 1));
tpl.endText();
}
/* (non-Javadoc)
* @see com.lowagie.text.pdf.PdfPageEventHelper#onEndPage(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
*/
@Override
public void onEndPage(PdfWriter writer, com.lowagie.text.Document document) {
// TODO Auto-generated method stub
System.out.println("OEP");
PdfContentByte cb = writer.getDirectContent();
cb.saveState();
String text = "Page " + writer.getPageNumber() + " of ";
float textSize = helv.getWidthPoint(text, 9);
float textBase = document.bottom();
cb.beginText();
cb.setFontAndSize(helv, 9);
// for odd pagenumbers, show t
cb.setTextMatrix(document.left(), textBase);
cb.showText(text);
cb.endText();
cb.addTemplate(tpl, document.left() + textSize, textBase);
cb.saveState();
}
/* (non-Javadoc)
* @see com.lowagie.text.pdf.PdfPageEventHelper#onOpenDocument(com.lowagie.text.pdf.PdfWriter, com.lowagie.text.Document)
*/
@Override
public void onOpenDocument(PdfWriter writer, com.lowagie.text.Document arg1) {
// TODO Auto-generated method stub
System.out.println("OOD");
try{
// initialization of the template
tpl = writer.getDirectContent().createTemplate(100, 100);
// tpl.setBoundingBox(new Rectangle(0, 0, 10, 10));
// initialization of the font
helv = BaseFont.createFont("Helvetica", BaseFont.WINANSI, false);
}catch(Exception e)
{
}
}
}
基本流程如上述不完整程序(要完整的请看官方例子,不过那个例子还有其他演示功能不好集中精神分析页码问题),我不明白的是,总页码数是在文档结束时放进PdfTemplate实例里面,怎么在文档结束前的每一页结尾处都可以拿到该值?
之前在每页结尾处的PdfTemplate实例调用结果类似于插入一个占位符,文档总页数确定了的进候再回去填值?
分享到:
相关推荐
itext7 html转换为pdf;iText7页码、页眉、页脚,itext 的复杂表格实现;完整springboot项目代码
iText页码、页眉、页脚,itext 的复杂表格实现、保留表头、表尾、根据需求生成不同的iText表格
gradle项目,首次使用请先下载jar包(右键项目→Gradle→Refresh),不然报错!
NULL 博文链接:https://oneinit.iteye.com/blog/1529917
你搜索过上百个结果告诉你itext如何写rtf、word文件的页码,但你一定搜索不到任何一个结果告诉你怎么写总页数。意外的收获让我怀疑是不是过于粗心,但总之我给你答案。
iText.jar,生成pdf所需,已经加入iTextAsian.jar中的字体类,可以不用再单独下载iTextAsian,直接将iText加入项目即可,不用配置环境变量啥的
用Itext操作word,可以在word里画表格,也可以往word里插入图片
IText 和 ITextAsian 的开发包
多个版本的itext-jar包, itext-2.0.4/itext-2.1.5/itext-2.1.7
iText.jar,生成pdf所需,已经加入iTextAsian.jar中的字体类,可以不用再单独下载iTextAsian,直接将iText加入项目即可,不用配置环境变量啥的
iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库... iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。
itext 生成pdf 目录,itext 生成pdf 目录,itext 生成pdf 目录
Itext5.5.13 完整的全套包,包含bcpkix-jdk15on-1.47.jar bcprov-jdk15on-1.59.jar itext-asian-5.2.0.jar itext-hyph-xml-5.1.1.jar itext-pdfa-5.5.13-javadoc.jar itext-pdfa-5.5.13-sources.jar itext-pdfa-...
itextpdf中绝对位置添加文本,也可以进行多页设置。pdf插入文本
java导出word文档,使用itext包,可以生成pdf,word,生成段落,插入图图片,页码
赠送jar包:itext-2.1.7.jar; 赠送原API文档:itext-2.1.7-javadoc.jar; 赠送源代码:itext-2.1.7-sources.jar; 赠送Maven依赖信息文件:itext-2.1.7.pom; 包含翻译后的API文档:itext-2.1.7-javadoc-API文档-...
iText1.2.7、iText-rtf2.1.7、iTextAsian
IText7jar集合
iText7jar和英文文档,以及itext5的一些文档。建议大家去官网看itext7,改动有点大。我也在摸索中。
itext 操作PDF需要的jar包