`
nakupanda
  • 浏览: 410773 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

iText加入页码

    博客分类:
  • java
阅读更多
    如果不需要显示总页数(像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实例调用结果类似于插入一个占位符,文档总页数确定了的进候再回去填值?
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics