在servlet中使用jfreereport直接产生pdf文件报表 - My World|80x86

来源:百度文库 编辑:神马文学网 时间:2024/04/28 03:01:40
目前基于Web的精确打印解决方案主要有两类:一是加强客户端的逻辑;二是在服务器端产生适于精确打印的文件。流行的打印工具中用Applet实现、用浏览器插件实现或是开发嵌入浏览器的客户端的方法属于第一类;而在服务器端产生图片文件、pdf或ps等.精确打印文件的方法属于第二类。下面就给出一个servlet通过模板生成pdf文件的实现.选择的报表工具是jfreereport.


转载:转载请保留本信息,本文来自http://www.matrix.org.cn/resource/article/1/1261.html 首先说些废话。
基于Java开发的Web的应用系统的打印问题一直困扰着我。原因是基于Web的应用是瘦客户端应用,逻辑集中在服务器上,而打印是基于客户端的行为。

目前基于Web的精确打印解决方案主要有两类:一是加强客户端的逻辑;二是在服务器端产生适于精确打印的文件。
流行的打印工具中用Applet实现、用浏览器插件实现或是开发嵌入浏览器的客户端的方法属于第一类;而在服务器端产生图片文件、pdf或ps等

精确打印文件的方法属于第二类。

以上流行的解决方案的比较:

方案 打印效果 浏览器依赖 部署代价 维护代价
Applet实现 页面控制困难 需要java plug-in插件 无需客户端部署 客户端调整
浏览器插件实现 同本地打印,效果好 依赖特定类型版本的浏览器 客户端动态部署 客户端调整
图片文件实现 页面控制困难 无 无 无
pdf文件实现 同本地打印,效果好 需要acroreader插件 无需客户端部署 无

pdf文件是流行的文件格式,浏览器和pdf阅读器已成为客户端必备的安装内容。对于通用的打印解决方案我认为pdf文件的方式具有更大的灵活性和可用性。

废话到此为止,下面就给出一个servlet通过模板生成pdf文件的实现:

我选择的是报表工具是jfreereport,当然若简单的文本可以使用iText直接产生。

1. jfreereport与was5.0.x的集成

was5.0.x依据j2ee 1.3规范,jaxp/dom/sax的版本分别为1.1/2/2,与jfreereport依赖的gunjaxp.jar中的一致,其他的包也不存在冲突。因此可以将这些

包直接加到Web项目的包目录/WEB-INF/lib中。
jfreereport的包很多,与读取模板、生成报表和生成pdf文件相关的有:
gnujaxp.jar
itext-1.2.2.jar
iTextAsian.jar
jcommon-0.9.7.jar
jfreereport-0.8.4_11-core.jar
jfreereport-0.8.4_11-misc-configstore-base.jar
jfreereport-0.8.4_11-output-pageable-base.jar
jfreereport-0.8.4_11-output-pageable-pdf.jar
jfreereport-0.8.4_11-output-support-itext.jar
jfreereport-0.8.4_11-output-support-pagelayout.jar
jfreereport-0.8.4_11-parser-base.jar
jfreereport-0.8.4_11-parser-ext.jar
pixie-0.8.1.jar

jfreereport中自带的itext-1.02b.jar版本低,可以替换为新版本,iTextAsian.jar是生成中文所必须的。


2. 编码和汉字问题
由于我的环境是英文系统(Win2k en version + sp4)加装中文支持,为了在开发环境中支持中文必须使用UTF-8编码。因此需要对jfreereport中的一些参数进行配置。
需要将org\jfree\report\modules\output\support\itext\configuration.properties文件中的org.jfree.report.modules.output.support.itext.Encoding参数设为GBK(或GB18030,请量力而行,我的环境未安装GB18030的支持)。
需要将显示中文的区域的字体和编码分别设为"STSong-Light"和"UniGB-UCS2-H"。此字体和编码是生成pdf文件时显示中文所必须的,与jfreereport的GUI工具的显示无关。

3. 程序示例
我选用了jfreereport中的Java Look and Feel Graphics Repository的例子,并将部分内容换为中文。以下是直接生成pdf的servlet代码和我变更的报表模板。



//- GenPDFByJfreereportTemplateServlet.java

package acme.web.servlets;

import java.io.IOException;
import java.net.URL;

import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jfree.report.Boot;
import org.jfree.report.JFreeReport;
import org.jfree.report.demo.SwingIconsDemoTableModel;
import org.jfree.report.modules.output.pageable.base.PageableReportProcessor;
import org.jfree.report.modules.output.pageable.pdf.PDFOutputTarget;
import org.jfree.report.modules.parser.base.ReportGenerator;
import org.jfree.report.util.Log;
import org.jfree.report.util.ReportConfiguration;
import org.jfree.xml.ElementDefinitionException;

/**
* @version    1.0
* @author    Lee S
*/
public class GenPDFByJfreereportTemplateServlet extends HttpServlet implements Servlet
{
   /**
   * @see javax.servlet.http.HttpServlet#void (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
   */
   public void doGet(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException
   {
      resp.setContentType("application/pdf");

      ServletOutputStream out = resp.getOutputStream();
      
      try
      {
         // initialize JFreeReport
         Boot.start();

         ReportConfiguration.getGlobalConfig().setLogLevel("Error");
         // update the log system to use the new settings ...
         Log.getJFreeReportLog().init();

         final URL in =
            getClass().getResource("/acme/web/resources/swing-icons.xml");

         if (in == null)
         {
            throw new Exception("swing-icons.xml can‘t be found.");
         }

         final JFreeReport report = parseReport(in);
         report.setData(new SwingIconsDemoTableModel());

         PDFOutputTarget target =
            new PDFOutputTarget(out, report.getDefaultPageFormat());
         target.configure(report.getReportConfiguration());
         
         target.open();
         PageableReportProcessor proc = new PageableReportProcessor(report);
         proc.setOutputTarget(target);
         proc.processReport();
         target.close();


      }
      catch (Exception ex)
      {
         System.err.println("Generate PDF failed: " + ex);
      }
      finally
      {
         try
         {
            out.close();
         }
         catch (Exception e)
         {
            System.err.println("Output PDF failed: " + e);
         }
      }

   }

   /**
   * @see javax.servlet.http.HttpServlet#void (javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
   */
   public void doPost(HttpServletRequest req, HttpServletResponse resp)
      throws ServletException, IOException
   {
      doGet(req, resp);
   }


   /**
    * Reads the report from the swing-icons.xml report template.
    *
    * @param templateURL The template location.
    *
    * @return A report.
    * @throws ElementDefinitionException if the report generator encountered an error.
    * @throws IOException if there was an IO error while reading from the URL.
    */
   private JFreeReport parseReport(final URL templateURL)
       throws IOException, ElementDefinitionException
   {
     final ReportGenerator generator = ReportGenerator.getInstance();
     return generator.parseReport(templateURL);
   }


}




//- swing-icons.xml


   PUBLIC "-//JFreeReport//DTD report definition//EN//extended"
          "http://jfreereport.sourceforge.net/extreport.dtd">









 
 
 
 
   
   
   
   
   
   
 


 
 
 
 
          pageformat="LETTER"
      topmargin="72"
      bottommargin="72"
      leftmargin="72"
      rightmargin="72"/>
 


 
 
 
 
   

   
 


 
 
 
 

   
   
   
   
     

     
        SansSerif
        10
        bottom
     


     
       
       
     


     
       

       
     


     
       
       
     


     
       
       
     


     
       
       
     


   


   
   
   
   

     

     
        SansSerif
        12
        true
        bottom