<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-72  評論-63  文章-0  trackbacks-0
    轉自csdn:http://kb.csdn.net/java/Articles/200309/c2b8794b-ac82-457c-af08-435d241e9f28.html
    1.????背景
    2.????介紹iText
    3.????如何利用iText在java程序中生成PDF報表
    4.????如何利用iText在JSP中生成PDF報表
    1)????直接在服務器上生成PDF文件
    2)????通過jsp生成PDF文件流輸出到客戶端
    3)????通過Servlet生成PDF文件流輸出到客戶端
    5.????總結


    1.背景


    ????前不久做了一個通過JSP生成PDF報表的小項目,算得上開了一次眼界。企業的一些信息通過網絡形成Html報表,雖然IE可以直接打印顯示在其中的內容,但是從界面上來看,如果直接將Html的顯示結果打印出來,顯得不太美觀。如果將它轉成PDF文件再打印,則打印效果會好很多。

    2.iText簡介


    ????iText是一個開放源碼的Java類庫,可以用來方便地生成PDF文件。大家通過訪問http://sourceforge.net/project/showfiles.php?group_id=15255&release_id=167948下載最新版本的類庫,下載完成之后會得到一個.jar包,把這個包加入JDK的classpath即可使用。如果生成的PDF文件中需要出現中文、日文、韓文字符,則還需要通過訪問http://itext.sourceforge.net/downloads/iTextAsian.jar下載iTextAsian.jar包。
    關于iText類庫的使用,http://www.lowagie.com/iText/tutorial/index.html有比較詳細的教程。該教程從入門開始,比較系統地介紹了在PDF文件中放入文字、圖片、表格等的方法和技巧。讀完這片教程,大致就可以做一些從簡單到復雜的PDF文件了。不過,試圖通過教程解決在生成PDF文件過程中遇到的所有困難無疑是一種奢望。所以,閱讀iText的api文檔顯得非常重要。讀者在下載類庫的同時,也可以下載類庫的文檔。

    3.如何利用iText在java程序中生成PDF報表


    ????以下是上述教程中一個最簡單的例子,這個例子刻畫了通過iText生成PDF文件的一般
    程序框架。讀者只需要在document.open();和document.close();兩條語句中間加入自己希望放在PDF文件中的內容即可。該例子只在PDF文件中加了“Hello?World“一行文字。
    1. ????????Document?document?=?new?Document();
    2. ????????try?{?
    3. ????????????PdfWriter.getInstance(document,?new?FileOutputStream??????????("Chap0101.pdf"));
    4. ????????????document.open();
    5. ????????????document.add(new?Paragraph("Hello?World"));
    6. ????????}
    7. ????????catch(DocumentException?de)?{
    8. ????????????System.err.println(de.getMessage());
    9. ????????}
    10. ????????catch(IOException?ioe)?{
    11. ????????????System.err.println(ioe.getMessage());
    12. ????????}
    13. ????????document.close();

    ????由以上的例子可見,程序的框架十分清楚明了。然而在PDF中指定文字、圖畫、表格的位置是一件非常麻煩的事情。除了不斷地在程序中修改位置、然后運行程序、生成PDF文件、觀察元素在PDF中的位置是否合理這樣的過程以外,似乎還沒有其它更好的方法。

    4.如何通過JSP生成PDF報表


    ????這一部分是在iText的教程中所沒有的,網上的相關資料也比較少。我曾在CSDN上看過有人開帖詢問實現細節,有人回復了實現的原理:先在服務器上生成PDF文件,然后用戶通過點擊指向PDF文件的超鏈接選擇下載或打開。這是一個思路,或者說是思路之一。本文實現了這個思路,又給出另外一個思路并通過兩種途徑實現之。
    1)直接在服務器上生成PDF文件。
    1. <%@?page?import?="com.lowagie.text.*,com.lowagie.text.pdf.*,?java.io.*"%>
    2. <%
    3. ????????String?filename?=?"PDF"+(new?Random()).nextInt()+".pdf"?;
    4. ????????Document?document?=?new?Document(PageSize.A4);
    5. ????????ServletOutputStream?out1?=?response.getOutputStream();
    6. ?try{
    7. ????????????PdfWriter?writer?=?PdfWriter.getInstance(document,?new?FileOutputStream(filename)?);
    8. ????????????document.open();
    9. ????????????document.add(new?Paragraph("Hello?World"));
    10. ????????????document.close();
    11. ????}
    12. ????????????catch(Exception?e){}
    13. %>

    ???上面的程序在服務器上生成了一個靜態的PDF文件。顯然,每次運行所得的PDF文件的名稱應該是獨一無二不能有重的。本程序通過隨機函數來命名生成的PDF文件。本程序的缺點就是,每次運行都會在服務器上產生一個PDF文件,如果不及時刪除,數量會越來越大,這顯然是站點維護者所不愿意看到的。
    2)將PDF文件通過流的形式輸送到客戶端的緩存。這樣做的好處是不會在服務器上留下任何“遺跡”。
    i)直接通過JSP頁面生成
    1. <%@
    2. ???????page?import="java.io.*,java.awt.Color,com.lowagie.text.*,com.lowagie.text.pdf.*"%>
    3. <%
    4. response.setContentType(?"application/pdf"?);
    5. Document?document?=?new?Document();
    6. ByteArrayOutputStream?buffer?=?new?ByteArrayOutputStream();
    7. PdfWriter?writer=PdfWriter.getInstance(?document,?buffer?);
    8. document.open();
    9. document.add(new?Paragraph("Hello?World"));
    10. document.close();
    11. DataOutput?output?=?new?DataOutputStream(?response.getOutputStream()?);
    12. byte[]?bytes?=?buffer.toByteArray();
    13. response.setContentLength(bytes.length);
    14. for(?int?i?=?0;?i?<?bytes.length;?i++?)?{?output.writeByte(?bytes[i]?);?}
    15. %>
    ii)通過Servlet生成
    1. import?java.io.*;
    2. import?javax.servlet.*;
    3. import?javax.servlet.http.*;
    4. import?com.lowagie.text.*;
    5. import?com.lowagie.text.pdf.*;
    6. public?void?doGet(HttpServletRequest?request,
    7. ???????????????????????????????HttpServletResponse?response)
    8. ?throws?IOException,ServletException
    9. {
    10. ??Document?document?=?new?Document(PageSize.A4,?36,36,36,36);
    11. ??ByteArrayOutputStream?ba?=?new?ByteArrayOutputStream();
    12. ??try
    13. ??{
    14. ?????PdfWriter?writer?=?PdfWriter.getInstance(document,?ba);
    15. ?????document.open();
    16. ?????document.add(new?Paragraph("Hello?World"));
    17. ??}
    18. ??catch(DocumentException?de)
    19. ??{
    20. ????de.printStackTrace();
    21. ????System.err.println("A?Document?error:"?+de.getMessage());
    22. ???}
    23. ??document.close();
    24. ??response.setContentType("application/pdf");
    25. ??response.setContentLength(ba.size());
    26. ??ServletOutputStream?out?=?response.getOutputStream();
    27. ??ba.writeTo(out);
    28. ??out.flush();
    29. }

    5.結束


    ??我在項目中采用的是第二種方法。本文的源碼在我的tomcat4上面都是調試通過的。希望可以給大家帶來方便。
    歡迎大家采用,如需轉載,請注明出處。
    posted on 2006-05-25 18:22 船長 閱讀(1203) 評論(1)  編輯  收藏 所屬分類: 開源相關

    評論:
    # re: 如何利用iText在JSP中生成PDF報表 [未登錄] 2012-02-20 10:56 | joan
    pdf輸出流輸出到客戶端后想直接打印而不通過 ACROBAT閱讀插件預覽.您有什么好辦法嗎  回復  更多評論
      
    主站蜘蛛池模板: 亚洲人成影院在线高清| 亚洲日本va中文字幕久久| 亚洲fuli在线观看| 四虎免费影院ww4164h| 亚洲av丰满熟妇在线播放| 黄网站免费在线观看| 亚洲av伊人久久综合密臀性色 | 亚洲人成网站免费播放| 亚洲欧洲久久精品| 免费黄色网址网站| 亚洲乱码在线卡一卡二卡新区| 99精品全国免费观看视频| 亚洲欧美日韩综合久久久久 | 久久久WWW成人免费精品| 中文字幕亚洲综合久久菠萝蜜| 久久精品无码专区免费| 久久伊人久久亚洲综合| 3344免费播放观看视频| 亚洲国产精品日韩av不卡在线 | 丁香婷婷亚洲六月综合色| 成年女人毛片免费播放视频m | 亚洲第一第二第三第四第五第六| 国产又大又粗又硬又长免费| 国产成人精品免费大全| 麻豆亚洲AV永久无码精品久久 | 一级看片免费视频| 亚洲AV无码一区二区乱孑伦AS| 成人免费毛片内射美女-百度| 亚洲AV成人无码网站| 亚洲性猛交XXXX| 波多野结衣在线免费视频| 激情无码亚洲一区二区三区| 亚洲色婷婷一区二区三区| 免费h片在线观看网址最新| 337P日本欧洲亚洲大胆艺术图 | 亚洲AV无码片一区二区三区| 国产精一品亚洲二区在线播放| AV大片在线无码永久免费| 免费无码专区毛片高潮喷水 | 亚洲av综合av一区二区三区| 亚洲欧洲日产国码av系列天堂|