The important thing in life is to have a great aim , and the determination

          常用鏈接

          統計

          IT技術鏈接

          保險相關

          友情鏈接

          基金知識

          生活相關

          最新評論

          IText使用PDF模板輸出報表的實踐(轉)

          本文所要用到的工具或jar主要有: Acrobat 8 這個主要用來制作PDF模板、eclipse這個看你喜歡咯(你用其他也行) 、 itext.jar、
          還有為了解決中文的輸出問題,需要多下載一個名為iTextAsian.jar的JAR包。這個包里面定義了與中文輸出相關的一些文件。
          好了,需要做的就是這些了,簡單的PDF生成這里就不再作介紹了,本文主要講解如何使用PDF模板。
          我們先來看看制作出來的效果:


          上圖表格上及表格中的數據是動態添加進去的,頁數為兩頁(為節約版面現只顯示一頁)
          兩頁都是用的同一模板的,
          1、 模板的制作:
          我主要使用的是Acrobat8.0,上面所用到的模板是由 周工作報告 模板修改而來的,如果想學習如何新建一個新的模板,大家可以參照下這里吧!
          http://lxy19791111.javaeye.com/blog/102848
          2、 取得每個表單域的名字
          模板制作好后,要插入數據首先就要知道需要插在模板中位置,
          Java代碼 復制代碼
          1.   //需要生成后的PDF    
          2. FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");    
          3.   //PDF模板路徑    
          4. String TemplatePDF ="c:/test/PdfTemplate.pdf";    
          5.        PdfReader reader = new PdfReader(TemplatePDF);      
          6. PdfStamper stamp = new PdfStamper(reader,fos);    
          7. AcroFields form = stamp.getAcroFields();    
          8. for (Iterator it = form.getFields().keySet().iterator(); it    
          9. .hasNext();) {    
          10. System.out.println(it.next());    
          11. }   

          這個是打印后的部分結果:

          我們只取后面那個命名就行,如"星期四[3]"
          當然,模板是你自己定義,文本域的命名你當然知道了,這里只是作個簡單介紹而已。
          3、下面是插入數據及PDF合并的代碼:
          Java代碼 復制代碼
          1. package com.golden.info.test;   
          2.   
          3. import java.io.ByteArrayOutputStream;   
          4. import java.io.FileNotFoundException;   
          5. import java.io.FileOutputStream;   
          6. import java.io.IOException;   
          7. import java.util.Date;   
          8.   
          9. import com.lowagie.text.Document;   
          10. import com.lowagie.text.DocumentException;   
          11. import com.lowagie.text.pdf.AcroFields;   
          12. import com.lowagie.text.pdf.PdfCopy;   
          13. import com.lowagie.text.pdf.PdfImportedPage;   
          14. import com.lowagie.text.pdf.PdfReader;   
          15. import com.lowagie.text.pdf.PdfStamper;   
          16. public class TestPdfTemplate {     
          17.     public static void main(String[] args) {   
          18.         try {   
          19.             int count = 8;// 總記錄數   
          20.             int pageCount = 4;// 每頁記錄數   
          21.             int index = 1// 表格序號   
          22.             int page = 0;// 總共頁數   
          23.             /** 主要控制總共的頁數*/  
          24.             if (count >= pageCount && count % pageCount == 0) {   
          25.                 page = count / pageCount;   
          26.             } else {   
          27.                 page = count / pageCount + 1;   
          28.             }   
          29.             String TemplatePDF = "c:/test/PdfTemplate.pdf";//設置模板路徑   
          30.             FileOutputStream fos = new FileOutputStream("c:/test/Pdf.pdf");//需要生成PDF   
          31.                
          32.             ByteArrayOutputStream baos[] = new ByteArrayOutputStream[page];//用于存儲每頁生成PDF流   
          33.             /** 向PDF模板中插入數據 */  
          34.             for (int item = 0; item < page; item++) {   
          35.                 baos[item] = new ByteArrayOutputStream();   
          36.                 PdfReader reader = new PdfReader(TemplatePDF);   
          37.                 PdfStamper stamp = new PdfStamper(reader, baos[item]);   
          38.                 AcroFields form = stamp.getAcroFields();   
          39.                 form.setField("DepartmnetNmae""藍飛");//插入的數據都為字符類型   
          40.                 form.setField("qq""252462807");                  
          41.                 form.setField("pageNumber""第" + (item + 1) + "頁,共" + page   
          42.                         + "頁");   
          43.                 if (count % pageCount != 0 && item == page - 1) {   
          44.                     System.out.println("====pageCount+" + pageCount + "=====");   
          45.                     pageCount = count % pageCount;   
          46.                 }   
          47.                 /**因為PDF中的表格其實是眾多的文本域組成,就是一個數組,所以把它循環出來就可以了*/  
          48.                 for (int j = 0; j < pageCount; j++) {   
          49.                     form.setField("ProjectTask[" + j + "]", index + "");   
          50.                     form.setField("星期一[" + j + "]""星期一[" + index + "]");   
          51.                     form.setField("星期二[" + j + "]""星期二[" + index + "]");   
          52.                     form.setField("星期三[" + j + "]""星期三[" + index + "]");   
          53.                     form.setField("星期四[" + j + "]""星期四[" + index + "]");   
          54.                     form.setField("星期五[" + j + "]""星期五[" + index + "]");   
          55.                     form.setField("星期六[" + j + "]""星期六[" + index + "]");   
          56.                     form.setField("星期日[" + j + "]""星期日[" + index + "]");   
          57.                     form.setField("意見[" + j + "]""同意[" + j + "]");   
          58.                     index++;   
          59.                 }   
          60.                 stamp.setFormFlattening(true); // 千萬不漏了這句啊, */   
          61.                 stamp.close();   
          62.             }   
          63.             Document doc = new Document();   
          64.             PdfCopy pdfCopy = new PdfCopy(doc, fos);   
          65.             doc.open();   
          66.             PdfImportedPage impPage = null;   
          67.             /**取出之前保存的每頁內容*/  
          68.             for (int i = 0; i < page; i++) {   
          69.                 impPage = pdfCopy.getImportedPage(new PdfReader(baos[i]   
          70.                         .toByteArray()), 1);   
          71.                 pdfCopy.addPage(impPage);   
          72.             }   
          73.             doc.close();//當文件拷貝  記得關閉doc   
          74.         } catch (FileNotFoundException e) {   
          75.             e.printStackTrace();   
          76.         } catch (IOException e) {   
          77.             e.printStackTrace();   
          78.         } catch (DocumentException e) {   
          79.             e.printStackTrace();   
          80.         }   
          81.   
          82.     }   
          83. }  


          至于,生于PDF后,想打印出來,只要調用以下代碼就行了
          Java代碼 復制代碼
          1.            
          2. try{                
          3. Executable ex = new Executable();          
          4.        ex.openDocument("c:/test/Pdf.pdf");              
          5.     ex.printDocument("c:/test/Pdf.pdf");   
          6.     }catch(IOException e){       
          7.     e.printStackTrace();         
          8.     }  

          到這里,運用上面的那些代碼,就完成了PDF模板輸出報表.
          (PDF模板、代碼跟運行結果在附件里)
          有錯誤之處請指正.
          也希望這篇文章可以幫到您.

          posted on 2009-08-12 09:53 鴻雁 閱讀(4513) 評論(0)  編輯  收藏 所屬分類: IT技術相關

          主站蜘蛛池模板: 嘉义县| 土默特右旗| 米脂县| 行唐县| 天长市| 萨迦县| 济宁市| 江达县| 汉寿县| 襄垣县| 吉林省| 潮州市| 华池县| 大埔区| 和硕县| 大兴区| 明星| 平陆县| 吉木乃县| 肥东县| 积石山| 八宿县| 随州市| 平阳县| 五台县| 清新县| 海城市| 黑水县| 湖口县| 思茅市| 鸡东县| 洛宁县| 阿拉善右旗| 陇南市| 桦川县| 安吉县| 东山县| 麻城市| 十堰市| 江陵县| 德安县|