技术开发 频道

利用iText在JSP中生成PDF报表

    如何通过JSP生成PDF报表

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

    直接在服务器上生成PDF文件

<%@ page import ="com.lowagie.text.*,com.lowagie.text.pdf.*, java.io.*"%> <% String filename = "PDF"+(new Random()).nextInt()+".pdf" ; Document document = new Document(PageSize.A4); ServletOutputStream out1 = response.getOutputStream(); try{ PdfWriter writer = PdfWriter.getInstance(document,new FileOutputStream(filename) ); document.open(); document.add(new Paragraph("Hello World")); document.close(); } catch(Exception e){} %>

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

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

    i) 直接通过JSP页面生成

<%@ page import="java.io.*, java.awt.Color,com.lowagie.text.*, com.lowagie.text.pdf.*"%> <%response.setContentType( "application/pdf" ); Document document = new Document(); ByteArrayOutputStream buffer= new ByteArrayOutputStream(); PdfWriter writer=PdfWriter.getInstance( document, buffer ); document.open(); document.add(new Paragraph("Hello World"));document.close(); DataOutput output = new DataOutputStream( response.getOutputStream() ); byte[] bytes = buffer.toByteArray(); response.setContentLength(bytes.length); for( int i = 0;i < bytes.length; i++ ) { output.writeByte( bytes[i] ); } %>

     ii) 通过Servlet生成

import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import com.lowagie.text.*; import com.lowagie.text.pdf.*; public void doGet(HttpServletRequest request,HttpServletResponse response)throws IOException,ServletException {Document document = new Document(PageSize.A4, 36,36,36,36); ByteArrayOutputStream ba= new ByteArrayOutputStream(); try{PdfWriter writer = PdfWriter.getInstance(document, ba); document.open(); document.add(new Paragraph("Hello World")); } catch(DocumentException de) {de.printStackTrace(); System.err.println("A Document error:" +de.getMessage()); }document.close(); response.setContentType("application/pdf"); response.setContentLength(ba.size()); ServletOutputStream out = response.getOutputStream(); ba.writeTo(out); out.flush();}

    结束

    我采用的是第二种方法。本文的源码在tomcat上面都是调试通过的。希望可以给大家带来方便。

0
相关文章