zoukankan      html  css  js  c++  java
  • 使用JSP页面生成PDF报表

    转自:http://developer.51cto.com/art/200907/134261.htm

    1、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文档显得非常重要。读者在下载类库的同时,也可以下载类库的文档。

    2、如何利用iText在JSP页面中生成PDF报表

    以下是一个最简单的例子,这个例子刻画了通过iText生成PDF文件的一般程序框架。读者只需要在document.open();和 document.close();两条语句中间加入自己希望放在PDF文件中的内容即可。该例子只在PDF文件中加了“Hello World“一行文字。

    1. Document document = new Document();  
    2. try  
    3. {  
    4. PdfWriter.getInstance  
    5. (document, new FileOutputStream  
    6. ("Chap0101.pdf"));  
    7. document.open();  
    8. document.add(new Paragraph("Hello World"));  
    9. }  
    10. catch(DocumentException de)  
    11. {  
    12. System.err.println(de.getMessage());  
    13. }  
    14. catch(IOException ioe)  
    15. {  
    16. System.err.println(ioe.getMessage());  
    17. }  
    18. document.close(); 

    由以上的例子可见,程序的框架十分清楚明了。然而在PDF中指定文字、图画、表格的位置是一件非常麻烦的事情。除了不断地在程序中修改位置、然后运行程序、生成PDF文件、观察元素在PDF中的位置是否合理这样的过程以外,似乎还没有其它更好的方法。

    3、如何通过JSP生成PDF报表

    这一部分是在iText的教程中所没有的,网上的相关资料也比较少。我经过一段时间研究发现:先在服务器上生成PDF文件,然后用户通过点击指向PDF文件的超链接选择下载或打开。这是一个思路,或者说是思路之一。本文实现了这个思路,又给出另外一个思路并通过两种途径实现之。

    1)直接在服务器上生成PDF报表。

    1. <%@ page import ="com.lowagie.text.*  
    2. ,com.lowagie.text.pdf.*, java.io.*"%
    3. <%  
    4. String filename =  
    5. "PDF"+(new Random()).nextInt()+".pdf" ;  
    6. Document document =  
    7. new Document(PageSize.A4);  
    8. ServletOutputStream out1 
    9. response.getOutputStream();  
    10. try{  
    11. PdfWriter writer =  
    12. PdfWriter.getInstance(document,  
    13. new FileOutputStream(filename) );  
    14. document.open();  
    15. document.add(new Paragraph("Hello World"));  
    16. document.close();  
    17. }  
    18. catch(Exception e){}  
    19. %

    上面的程序在服务器上生成了一个静态的PDF文件。显然,每次运行所得的PDF文件的名称应该是独一无二不能有重的。本程序通过随机函数来命名生成的PDF文件。本程序的缺点就是,每次运行都会在服务器上产生一个PDF文件,如果不及时删除,数量会越来越大,这显然是站点维护者所不愿意看到的。

    2)将PDF文件通过流的形式输送到客户端的缓存。这样做的好处是不会在服务器上留下任何“遗迹”。

    ◆直接通过JSP页面生成PDF报表

    1. <%@  
    2. page import="java.io.*,  
    3. java.awt.Color,com.lowagie.text.*,  
    4. com.lowagie.text.pdf.*"%
    5. <%  
    6. response.setContentType  
    7. ( "application/pdf" );  
    8. Document document = new Document();  
    9. ByteArrayOutputStream buffer 
    10. new ByteArrayOutputStream();  
    11. PdfWriter writer=  
    12. PdfWriter.getInstance( document, buffer );  
    13. document.open();  
    14. document.add(new Paragraph("Hello World"));  
    15. document.close();  
    16. DataOutput output =  
    17. new DataOutputStream  
    18. ( response.getOutputStream() );  
    19. byte[] bytes = buffer.toByteArray();  
    20. response.setContentLength(bytes.length);  
    21. for( int i = 0;  
    22. bytes.length;  
    23. i++ )  
    24. {  
    25. output.writeByte( bytes[i] );  
    26. }  
    27. %

    ◆通过Servlet生成PDF报表

    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  
    7. (HttpServletRequest request,  
    8. HttpServletResponse response)  
    9. throws IOException,ServletException  
    10. {  
    11. Document document =  
    12. new Document(PageSize.A4, 36,36,36,36);  
    13. ByteArrayOutputStream ba 
    14. new ByteArrayOutputStream();  
    15. try  
    16. {  
    17. PdfWriter writer =  
    18. PdfWriter.getInstance(document, ba);  
    19. document.open();  
    20. document.add(new  
    21. Paragraph("Hello World"));  
    22. }  
    23. catch(DocumentException de)  
    24. {  
    25. de.printStackTrace();  
    26. System.err.println  
    27. ("A Document error:" +de.getMessage());  
    28. }  
    29. document.close();  
    30. response.setContentType  
    31. ("application/pdf");  
    32. response.setContentLength(ba.size());  
    33. ServletOutputStream out 
    34. response.getOutputStream();  
    35. ba.writeTo(out);  
    36. out.flush();  
  • 相关阅读:
    第二阶段站立会议第十天
    第二阶段站立会议第九天
    第二阶段站立会议第八天
    第二阶段站立会议第七天
    第二阶段站立会议第六天
    第二阶段站立会议第五天
    第二阶段站立会议第四天
    第二冲刺阶段个人进度10
    第二冲刺阶段个人进度09
    第二冲刺阶段个人进度08
  • 原文地址:https://www.cnblogs.com/sharpest/p/10391586.html
Copyright © 2011-2022 走看看