itext高版本的pdf的頁首和頁尾資訊顯示方法
本次對itext的研究主要針對的是pdf 的table,主要應用於列印單據。
框架為jfinal,表頭資訊中有動態資料,比如:年月日等。
下面直接貼程式碼:
/*** 前臺呼叫列印方法
* LMM
*
*/
public void printStorage(){
try {
Integer id=getParaToInt("pid",0);//獲取前臺傳資料
List<Stordetail> stolist=Stordetail.dao.find("select s.*,st.*,p.pub_name,e.edi_name,i.iss_name from stordetail s " +
" left join publish p on s.pub_id=p.pub_id left join edition e on s.edi_id=e.edi_id" +
" left join storsummary st on s.stsu_id=st.stsu_id " +
" left join issue i on s.iss_id=i.iss_id where s.stsu_id="+id+" order by det_id desc");//需要顯示的資料
Storsummary stsu=Storsummary.dao.findById(id);//需要顯示的資料
//start print
Rectangle rec = new Rectangle(240*2.5f,140*2.5f); //自定義紙張大小
Document document = new Document(rec,10,10,50,50);//紙張大小,marginleft,marginright,margintop,marginbottom
//設定輸出的位置並把物件裝入輸出物件中
PdfWriter writer=PdfWriter.getInstance(document, new FileOutputStream(PathKit.getWebRootPath() + "/temp/printStorage.pdf"));
//設定pdf每頁的頁首和頁尾
writer.setPageEvent(new HeadFootInfoPdfPageEvent(stolist,stsu));
//開啟文件
document.open();
//設定中文字型
BaseFont baseFont = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);//配置中文
//字型和字號
Font font = new Font(baseFont, 12, Font.NORMAL);
//title
String[] date=stolist.get(0).getDate("stsu_data").toString().split("-");
//table start包括table的每列的寬度
PdfPTable table = new PdfPTable(new float[]{20f,70f,30f,50f,100f});
table.setSpacingBefore(5);//
table.setSpacingAfter(5);
table.setHeaderRows(1);//設定每頁的table都要顯示head
//head
PdfPHeaderCell head=new PdfPHeaderCell();
PdfPCell c1 = new PdfPCell(new Phrase("序號", font));
c1.addHeader(head);//列設定為head
table.addCell(c1).setHorizontalAlignment(1);
PdfPCell c2 = new PdfPCell(new Phrase("入庫品種版本", font));
c2.addHeader(head);
table.addCell(c2).setHorizontalAlignment(1);
PdfPCell c3 = new PdfPCell(new Phrase("期數", font));
c3.addHeader(head);
table.addCell(c3).setHorizontalAlignment(1);
PdfPCell c5 = new PdfPCell(new Phrase("數量", font));
c5.addHeader(head);
table.addCell(c5).setHorizontalAlignment(1);
PdfPCell c6 = new PdfPCell(new Phrase("備註", font));
c6.addHeader(head);
table.addCell(c6).setHorizontalAlignment(1);
//value
for(int i=0;i<stolist.size();i++){
table.addCell(new PdfPCell(new Phrase(""+(i+1)+"", font))).setHorizontalAlignment(1);
table.addCell(new PdfPCell(new Phrase(""+stolist.get(i).getStr("pub_name")
+"-"+stolist.get(i).getStr("edi_name")+"", font))).setHorizontalAlignment(1);
table.addCell(new PdfPCell(new Phrase(""+stolist.get(i).getStr("iss_name")+"期", font))).setHorizontalAlignment(1);
table.addCell(new PdfPCell(new Phrase(""+stolist.get(i).getInt("det_num")+"", font))).setHorizontalAlignment(1);
table.addCell(new PdfPCell(new Phrase("", font))).setHorizontalAlignment(1);
}
document.add(table);//table end
//關閉文件
document.close();
//顯示路徑
redirect(getRequest().getScheme() + "://" +getRequest().getServerName() + ":" +
getRequest().getServerPort() + getRequest().getContextPath()+"/temp/printStorage.pdf");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
這個class是一個內部的class,如果你要設定的頁首和頁尾只是靜態內容的話,可以新建一個public class,由於我個人需要顯示一些查詢的資料作為頁首或者頁尾,jfinal顯示內容的時候必須繼承Controller,而下面的class也需要繼承一個類,因為不能繼承兩個class,故建為內部類,程式碼如下:
/**
* 設定列印單據的頭部和底部資訊
* @author LMM
*
*/
class HeadFootInfoPdfPageEvent extends PdfPageEventHelper{
//自定義傳引數
protected List<Stordetail> stolist=new ArrayList<Stordetail>();//查出的入庫list
protected Storsummary stsu=new Storsummary();//入庫彙總
//無參構造方法
public HeadFootInfoPdfPageEvent() {
super();
// TODO Auto-generated constructor stub
}
//有參構造方法
public HeadFootInfoPdfPageEvent(List<Stordetail> stolist, Storsummary stsu) {
super();
this.stolist = stolist;
this.stsu = stsu;
}
//實現頁首和頁尾的方法
public void onEndPage(PdfWriter writer, Document document) {
try{
String[] date=stolist.get(0).getDate("stsu_data").toString().split("-");
PdfContentByte headAndFootPdfContent = writer.getDirectContent();
headAndFootPdfContent.saveState();
headAndFootPdfContent.beginText();
//設定中文
BaseFont bfChinese = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
headAndFootPdfContent.setFontAndSize(bfChinese,12);
//文件頁頭資訊設定
float x = document.top(-20);
float x1 = document.top(-5);
//頁頭資訊中間
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_CENTER,
"******責任公司入庫單",
(document.right() + document.left())/2,
x, 0);
//頁頭資訊左面
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_LEFT,
date[0]+"年"+date[1]+"月"+date[2]+"日",
document.left()+100, x1, 0);
//頁頭資訊中間
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_CENTER,
"入庫單號:"+stsu.getStr("stsu_code")+"",
(document.right() + document.left())/2,
x1, 0);
//頁頭資訊右面
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_RIGHT,
" 單位:冊",
document.right()-100, x1, 0);
//文件頁尾資訊設定
float y = document.bottom(-20);
//頁尾資訊左面
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_LEFT,
"負責人:",
document.left()+100, y, 0);
//頁尾資訊中間
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_CENTER,
" 庫管員: ",
(document.right() + document.left())/2,
y, 0);
//頁尾資訊右面
headAndFootPdfContent.showTextAligned(PdfContentByte.ALIGN_RIGHT,
" 經手人:",
document.right()-100, y, 0);
headAndFootPdfContent.endText();
headAndFootPdfContent.restoreState();
}catch(DocumentException de) {
de.printStackTrace();
}catch(IOException de) {
de.printStackTrace();
}
}
}