开发者社区> 技术小甜> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

在浏览器中显示JasperReports PDF文档

简介:
+关注继续查看
一、 第一种实现 
  把一个JasperReports生成的PDF报告发送到用户浏览器的技巧在于,调用 net.sf.jasperreports.engine.JasperRunManager.runReportToPdf()方法。这个方法具有多个 重载版本,我们在本文中使用的这个版本具有三个参数:一个字符串—描述了编译的报告(jasper文件)的绝对路径;一个实现了 java.util.Map接口的类的实例;一个实现了net.sf.jasperreports.engine.JRDataSource接口的类的实 例。JasperRunManager.runReportToPdf()方法返回一个字节数组—它被作为一个参数传递给 javax.servlet.ServletOutputStream类的write()方法。我们可以从 javax.servlet.http.HttpServletResponse类的getOutputStream()方法中获得一个 ServletOutputStream的实例。事实胜于雄辩,下列代码片断展示了这一技术: 

package net.ensode.jasperreportsbrowserdemo;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.HashMap;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperRunManager;
public class JasperReportsBrowserDemoServlet extends HttpServlet
{
protected
void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{
ServletOutputStream servletOutputStream
= response.getOutputStream();
File reportFile
= new File(getServletConfig().getServletContext()
.getRealPath(
"/reports/Simple_Report.jasper"));
byte[] bytes = null;
try {
bytes
= JasperRunManager.runReportToPdf(reportFile.getPath(),
new HashMap(),new JREmptyDataSource());
response.setContentType(
"application/pdf");
response.setContentLength(bytes.length);
servletOutputStream.write(bytes,
0,bytes.length);
servletOutputStream.flush();
servletOutputStream.close();
}
catch (JRException e)
{
//在浏览器中显示栈跟踪消息 StringWriter stringWriter = new StringWriter();
PrintWriter printWriter
= new PrintWriter(stringWriter);
e.printStackTrace(printWriter);
response.setContentType(
"text/plain");
response.getOutputStream().print(stringWriter.toString());
}
}
}

    从前面的例子中可以看出,获得jasper文件绝对路径的最容易的方法是调用一个实现javax.servlet.ServletContext接口的类 实例的getRealPath()方法。对于本文中的简单示例来说,我们把一个java.util.HashMap空实例和一个 net.sf.jasperreports.engine.JREmptyDataSource实例作为另外两个参数传递给 JasperRunManager.runReportToPdf()方法。注意,对于更复杂的应用程序情况,一般在这些两个参数中传递一些数据。
二、 改进的方法 
    尽管前一个示例能够按要求进行工作,但是,我们还可以进一步改进之。不是创建一个字节数组并把它传递给ServletOutputStream类的 write()方法,我们可以把PDF直接“流向”浏览器。为此,我们必须首先通过调用ServletContext中的 getResourceAsStream()方法以流形式得到编译的资源。这个方法返回一个java.io.InputStream的实例—我们可以把它 作为一个参数传递给JasperRunManager类的runReportToPdfStream()方法。下面示例展示了这一技术的使用: 

package net.ensode.jasperreportsbrowserdemo;
//……导入语句(省略)
public class JasperReportsBrowserDemoServlet2 extends HttpServlet
{
protected
void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
ServletOutputStream servletOutputStream
= response.getOutputStream();
InputStream reportStream
= getServletConfig().getServletContext()
.getResourceAsStream(
"/reports/Simple_Report.jasper");
try
{
JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream,
new HashMap(),new JREmptyDataSource());
response.setContentType(
"application/pdf");
servletOutputStream.flush();
servletOutputStream.close();
}
catch (JRException e)
{
//处理异常
}
}
}


    与前一个示例相比,这里的两处主要改动都以加粗显示。当生成PDF报告时,JasperRunManager的runReportToPdfStream ()方法能够把PDF报告“流向”浏览器。通过这种方式,我们不必象前一个示例一样把一个字节数组存储在内存中。注意,当使用这种技术时,不能设置内容的 长度;因此,客户端不能与服务器保持一种持续性连接,但是这通常对于PDF来说并不重要,因为整个PDF本身是自包含的,而客户端一般不要求更多的信息。

三、 小结 

  从本文提供的示例程序可知,把一个JasperReports生成的PDF报告发送到一个浏览器并不是一件困难的事情。类似技术还可以用于导出HTML,RTF,XLS或任何其它由JasperReports所支持的输出格式。 

















本文转自朱先忠老师51CTO博客,原文链接: http://blog.51cto.com/zhuxianzhong/60111,如需转载请自行联系原作者



版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在Ubuntu14.04中配置mysql远程连接教程
上一篇文章,小编带大家学会了在Ubuntu14.04中安装MySQL,没有来得及上课的小伙伴们可以戳这篇文章:如何在Ubuntu14.04中安装mysql,今天给大家分享一下,如何简单的配置MySQL,可以实现远程连接,具体的教程如下。
1418 0
Docker系列教程03-配置镜像加速器
国内访问Docker Hub的速度很不稳定,有时甚至出现连接不上的情况。本节我们来为Docker配置镜像加速器,从而解决这个问题。目前国内很多云服务商都提供了镜像加速的服务。
7769 0
Spring-web源码解析之Initializer2-SpringServletContainerInitializer
基于4.1.7.RELEASE ServletContainerInitializer 前面都是Spring内部WebApplicationInitializer的实现,下面来看一个Servlet包中ServletContainerInitializer的实现。
813 0
Windows Mysql Server重启, log-bin路径配置
Windows Mysql Server重启, log-bin路径配置 分类: mysql数据库2014-03-16 14:49 1313人阅读 评论(0) 收藏 举报 Mysqlmysql servermysql重启windows 下命令重启mysqlmysql日志配置   ...
678 0
报表工具之JasperReports+iReport(2)
报表工具之JasperReports+iReport(2) 三、iReport介绍 1)iReport是为JasperReports设计的强大的,直观的,易于使用的可视化报表设计器,为win32平台编写。
1160 0
报表工具之JasperReports+iReport(4)
 报表工具之JasperReports+iReport(4) Report Structure 报告的结构 本章描述报告的结构,可用的report对象和它们的属性。这基本上是JasperReports的快速参考。
1273 0
Windows下MySQL的主从热备(自动同步)配置
本配置方法适用于5.1之后的版本,个人在5.5上配置成功(5.1之前版本请参考另外的配置说明)   环境说明: Master:192.168.1.200 Slave:192.168.1.210   MySQL 的 Master 配置: 配置my.
656 0
(五)、利用HighCharts 显示饼图
利用HightCharts显示饼图,主要有以下几个主要注意点: 1、百分比格式,精确到小数点几位: Highcharts.
715 0
VB为报表GridReport设定显示时间
       在机房收费系统中,有个“周结账单”,可以提供按日期查询账单功能。但是报表要显示选定的时间。怎么做呢??        首先在报表主对象中插入参数,步骤:右击参数集合->插入->参数,然后改为有意义的名称。
742 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
yqdh_58c12791343...1510407734.pdf
立即下载
yqdh_58c127d28e1...1510401091.pdf
立即下载
yqdh_58089d21034...1508750952.pdf
立即下载