<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 船長 閱讀(1204) 評論(1)  編輯  收藏 所屬分類: 開源相關

    評論:
    # re: 如何利用iText在JSP中生成PDF報表 [未登錄] 2012-02-20 10:56 | joan
    pdf輸出流輸出到客戶端后想直接打印而不通過 ACROBAT閱讀插件預覽.您有什么好辦法嗎  回復  更多評論
      
    主站蜘蛛池模板: 亚洲图片校园春色| 久久99亚洲网美利坚合众国 | 日本亚洲免费无线码| 久久这里只精品热免费99| 国产AⅤ无码专区亚洲AV| aa级女人大片喷水视频免费| 久久久精品国产亚洲成人满18免费网站 | mm1313亚洲国产精品美女| 麻豆va在线精品免费播放 | 亚洲av无码国产精品色午夜字幕| 免费无码作爱视频| 久久久久亚洲AV无码专区体验| 16女性下面无遮挡免费| 亚洲日本VA午夜在线电影| 国产乱弄免费视频| 好吊色永久免费视频大全| 亚洲黄色免费网址| 在线免费观看一级毛片| 男人j进女人p免费视频| 亚洲精品美女久久久久99| 99免费在线观看视频| 亚洲高清中文字幕免费| 亚洲av成人一区二区三区在线观看| 久久久精品国产亚洲成人满18免费网站 | 夭天干天天做天天免费看| 精品一区二区三区免费毛片| 中文字幕亚洲一区二区va在线| 久操视频在线免费观看| 亚洲国产精品一区二区三区在线观看| 免费国产人做人视频在线观看| 99久久免费国产特黄| 亚洲人成影院77777| 亚洲国产激情一区二区三区| 国产成人精品无码免费看| 亚洲妇女水蜜桃av网网站| 国产一区二区三区免费视频 | 日韩成人免费视频| 亚洲高清乱码午夜电影网| 久久久无码精品亚洲日韩蜜桃| 成人au免费视频影院| 成全在线观看免费观看大全|