在servlet中使用jfreereport直接产生pdf文件报表
来源:百度文库 编辑:神马文学网 时间:2024/04/27 13:40:48
目前基于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
Java Look and Feel Graphics Repository
This report lists the icons contained in the Java Look and Feel Graphics Repository.
For more information about the repository, refer to:
http://developer.java.sun.com/developer/techDocs/hi/repository/
The design of this report is described in the JFreeReport PDF documentation.
SansSerif
12
true
bottom
REPORT TOTAL:
OverallCount
#0
-
OverallSum
#,##0
-
true
9
SansSerif
false
black
bottom
Java Look and Feel Graphics Repository
-
d-MMM-yyyy
report.date
false
9
SansSerif
false
-
Page #0
PageNumber
Category
STSong-Light
UniGB-UCS2-H
12
true
false
black
left
bottom
分类:
-
Category
名称:
图标:
文件大小:
SansSerif
11
true
false
bottom
Group Total:
-
#0
GroupCount
-
#,##0
GroupSum
STSong-Light
UniGB-UCS2-H
10
bottom
-
Name
Icon
-
#,##0
Size
Name
Category
Size
Category
Name
Size
4. 总结
这是自认为目前最佳的Web应用的打印解决方案,虽然仅使用jfreereport产生pdf文件的功能,但是jfreereport提供的页面自动布置的功能使产生报表的工作较之使用iText直接产生要方便许多。以上的例子理论上可以在任何的符合j2ee 1.3规范(或部分符合,如tomcat 4.x)的应用服务器上运行,我仅仅在was 5.0.x上进行了测试。仅供大家参考。
参考
JFreeReport 0.8.3 Reference Guide - http://www.object-refinery.com/ jfreereport/jfreereport-0.8.3-A4.pdf
用Java实现PDF报表 - http://blog.csdn.net/legendinfo/articles/176184.aspx
转载:转载请保留本信息,本文来自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">
topmargin="72"
bottommargin="72"
leftmargin="72"
rightmargin="72"/>
4. 总结
这是自认为目前最佳的Web应用的打印解决方案,虽然仅使用jfreereport产生pdf文件的功能,但是jfreereport提供的页面自动布置的功能使产生报表的工作较之使用iText直接产生要方便许多。以上的例子理论上可以在任何的符合j2ee 1.3规范(或部分符合,如tomcat 4.x)的应用服务器上运行,我仅仅在was 5.0.x上进行了测试。仅供大家参考。
参考
JFreeReport 0.8.3 Reference Guide - http://www.object-refinery.com/ jfreereport/jfreereport-0.8.3-A4.pdf
用Java实现PDF报表 - http://blog.csdn.net/legendinfo/articles/176184.aspx
在servlet中使用jfreereport直接产生pdf文件报表
在servlet中使用jfreereport直接产生pdf文件报表 - My World|80x86
使用JFreeReport生成报表
中国Linux公社 -viewtopic-Servlet直接打开pdf、doc、xls等文件。
B/S环境下使用JFreeReport展示报表
在Servlet/SJP中使用Excel电子表格
利用iText在JSP中生成PDF报表
如何利用iText在JSP中生成PDF报表
使用qq过程中产生的无用文件,记得清理
在Web应用中动态创建PDF文件
如何在CAJViewer7.0中注释PDF文件(转)
使用iText操作pdf文件
在VB应用程序中使用INI文件
使用XML文件来实现对Servlet的配置
鲜为人知的PDF文件使用技巧
将Word2010文档直接保存为PDF文件
在visual c++中使用fopen()函数来读写文件
爱在细节中产生
使用MiddleGen产生hibernate的数据库表映射文件
PDF文件中利用金山词霸进行屏幕取词- -
servlet产生验证码的代码
在JSP开发中使用jdom解析临时存放数据的XML文件
水晶报表中如何动态加载图片(图片文件版本及数据库版本)
水晶报表中如何动态加载图片(图片文件版本及数据库版本)