Itext生成PDF文档页脚问题的处理,是采用HeaderFooter还是采用模板的方式

因为生成的PDF有特定的页脚格式要求,所以查看网上资料有两种方式

1.采用HeaderFooter,简便,代码简单,但是不能实现第几页/共几页里面的总页数的实现(一般在itext的低版本中使用这种方式)

2.采用模板类,利用一些事件进行处理(不限itext版本)

本人使用的是itext2.1.7版本

实现方式以及结果:

1.HeaderFooter

           String var1="制表人:xxx"+"                          ";
           Dated = new Date();
           SimpleDateFormat sdf=newSimpleDateFormat("yyyy-MM-dd");
          String var2="                           "+sdf.format(d);
           HeaderFooterfooter=new HeaderFooter(new Phrase(var1+"-",f3),newPhrase("-"+var2,f3)); 
           footer.setAlignment(1);
           footer.setBorder(0);
          pdfDocument.setFooter(footer);

这种方式可以实现不计总页数的完美显示

显示图:如下

由于页脚和pdftable之间总有1-2CM的空白,我的pdftable是自动分页的,查阅了itext的api文档,空白如何而来怎么去除不能解释,所以这种方式放弃

2.模板类实现

网上很多关于itext5的模板实现页脚的方式,综合了多个实例,加上自己需求的设计,经验证可以完美实现

1Itext高版本和低版本都可以用事件+模板来设定特定格式页脚

下面是设定页脚的工具类PdfHeaderFooter

package com.xxx.util;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.ExceptionConverter;
import com.lowagie.text.Font;
import com.lowagie.text.Image;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.ColumnText;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
importcom.lowagie.text.pdf.PdfPageEventHelper;
import com.lowagie.text.pdf.PdfTemplate;
import com.lowagie.text.pdf.PdfWriter;
public class PdfHeaderFooter extendsPdfPageEventHelper{
                    Stringheader;
                    intpresentFontSize = 12;
                    PdfTemplatetotal;
                    BaseFontbf = null;
                    FontfontDetail = null;
 
                    publicvoid setHeader(String header) {
                    this.header= header;
                    }
                    publicvoid onOpenDocument(PdfWriter writer, Document document) {
                    total= writer.getDirectContent().createTemplate(30, 16);
                    }
                    publicvoid onEndPage(PdfWriter writer, Document document) {
                    RectanglepageSize = writer.getBoxSize("art");
                    try{
                    if(bf == null) {
                    bf= BaseFont.createFont("C:/Windows/Fonts/Simli.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//隶书
                    }
                    if(fontDetail == null) {
                    fontDetail= new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
                    }
                    }catch (DocumentException e) {
                    e.printStackTrace();
                    }catch (IOException e) {
                    e.printStackTrace();
                    }
                    intpageN = writer.getPageNumber();
   		String nstr="xxx";//后期进行设计处理
                   Date d = new Date();
                   SimpleDateFormat sdf=newSimpleDateFormat("yyyy-MM-dd");
                   String tstr=sdf.format(d);
                    Stringtext1 = "制表人:"+nstr;
                    Stringtext2 = "制表时间:"+tstr;
                    Stringtext3 = "第" + pageN + "页/共 ";
                    PdfPTabletable = new PdfPTable(4);
                    try{
                    table.setWidths(newint[] { 2, 2, 1, 1 });
                    table.setWidthPercentage(100F);//占据百分百宽度
                    table.setTotalWidth(pageSize.getRight()- pageSize.getLeft());
                    PdfPCellcell1 = new PdfPCell(new Phrase(text1, fontDetail));
                    PdfPCellcell2 = new PdfPCell(new Phrase(text2, fontDetail));
                    PdfPCellcell3 = new PdfPCell(new Phrase(text3, fontDetail));
                    PdfPCellcell4 = new PdfPCell(Image.getInstance(total));
                    cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell1.setBorder(Rectangle.NO_BORDER);
                    cell2.setHorizontalAlignment(Element.ALIGN_CENTER);
                    cell2.setBorder(Rectangle.NO_BORDER);
                    cell3.setHorizontalAlignment(Element.ALIGN_RIGHT);
                    cell3.setBorder(Rectangle.NO_BORDER);
                    cell4.setHorizontalAlignment(Element.ALIGN_LEFT);
                    cell4.setBorder(Rectangle.NO_BORDER);
                    table.addCell(cell1);
                    table.addCell(cell2);
                    table.addCell(cell3);
                    table.addCell(cell4);
                    table.writeSelectedRows(0,-1, document.left(), document.bottom(), writer.getDirectContent());
                    }catch (DocumentException de) {
                    thrownew ExceptionConverter(de);
                    }
                    }
                    publicvoid onCloseDocument(PdfWriter writer, Document document) {
                    try{
                    if(bf == null) {
                       bf= BaseFont.createFont("C:/Windows/Fonts/Simli.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);//隶书
                    }
                    if(fontDetail == null) {
                    fontDetail= new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体
                    }
                    }catch (DocumentException e) {
                    e.printStackTrace();
                    }catch (IOException e) {
                    e.printStackTrace();
                    }
                    ColumnText.showTextAligned(total,Element.ALIGN_LEFT, new Phrase(String.format("%d页",writer.getPageNumber() - 1), fontDetail), 2, 2, 0);
                    }
}

2)在需要生成pdfservice层,先建立模板,套用工具类的模板,将数据写入

//构建一个PDF文档输出流程

                    DocumentpdfDocument = new Document(PageSize.A4.rotate(),20,20,20,20);
                    intsubmitAmount=2000;
                    PdfWriterwriter=PdfWriter.getInstance(pdfDocument,os);
                    PdfHeaderFooterheaderFooter = new PdfHeaderFooter();//建立模板建立页脚
                    writer.setBoxSize("art",PageSize.A4.rotate());
                    writer.setPageEvent(headerFooter);

3)这样就可以在每一个页脚生成需要的页脚(A4横向和纵向)



你可能感兴趣的:(java,itext2.1.7,pdf页脚处理)