1. 程式人生 > >itext高版本的pdf的頁首和頁尾資訊顯示方法

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();  
            }  
        }  
    }