在servlet中使用jfreereport直接产生pdf文件报表

浏览:48日期:2023-03-22
内容: 首先说些废话。基于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.jaritext-1.2.2.jariTextAsian.jarjcommon-0.9.7.jarjfreereport-0.8.4_11-core.jarjfreereport-0.8.4_11-misc-configstore-base.jarjfreereport-0.8.4_11-output-pageable-base.jarjfreereport-0.8.4_11-output-pageable-pdf.jarjfreereport-0.8.4_11-output-support-itext.jarjfreereport-0.8.4_11-output-support-pagelayout.jarjfreereport-0.8.4_11-parser-base.jarjfreereport-0.8.4_11-parser-ext.jarpixie-0.8.1.jarjfreereport中自带的itext-1.02b.jar版本低,可以替换为新版本,iTextAsian.jar是生成中文所必须的。2. 编码和汉字问题由于我的环境是英文系统(Win2k en version + sp4)加装中文支持,为了在开发环境中支持中文必须使用UTF-8编码。因此需要对jfreereport中的一些参数进行配置。需要将orgjfreereportmodulesoutputsupportitextconfiguration.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.javapackage 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<?xml version='1.0' encoding='UTF-8'?> report-definition PUBLIC '//JFreeReport//DTD report definition//EN//extended' 'http://jfreereport.sourceforge.net/extreport.dtd'> Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
上一条:扩展JAAS下一条:P2P的Jxta解决方案
相关文章: