在浏览器中显示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,如需转载请自行联系原作者



相关文章
|
2月前
|
应用服务中间件
使用 Adobe Livecycle Enterprise service 将 word 文档转换成 PDF 格式
使用 Adobe Livecycle Enterprise service 将 word 文档转换成 PDF 格式
28 0
|
3月前
|
Ubuntu Java Linux
在Spring Boot中使用iTextPDF创建动态PDF文档
iTextPDF 是一个用于创建和操作 PDF(Portable Document Format)文档的流行的 Java 库。它提供了一套全面的功能,用于处理 PDF 文件,包括创建新文档、修改现有文档以及提取信息。
84 1
|
5月前
|
Python
python获取pdf和word文档页数
python获取pdf和word文档页数
142 0
|
7月前
|
Python
Python3,2行代码,多种方法,直接把网页内容转换成PDF文档和图片。
Python3,2行代码,多种方法,直接把网页内容转换成PDF文档和图片。
149 0
|
6月前
|
设计模式 架构师 Java
阿里P8架构师都要学习研究的java加强版23种设计模式神级PDF文档
说在前面的话 Java作为老牌纯正的编程语言,在规范性上有着天然优势。因此本版的设计模式讲解全部用Java语言来描述,并针对Java语言的特性对讲解内容做了相当大的改动。 不知道大家是否听过编程界的一段话:掌握设计模式相当于华山派的"气宗",是程序员的内功修为,虽然在同样的学习时间下,类似Python这种"剑宗"的开发模式见效更快,但是长远来看,"气宗"才是走向软件架构师以上级别的必由之路。 所以,掌握气宗就掌握了编程命脉,然而学习设计模式有四大境界: 接下来给大家分享的就是java溢彩加强版大话设计模式包含的内容知识点。 总目录 主要内容 本文是百万销量的经典畅销书《
119 0
|
28天前
|
数据采集 移动开发 前端开发
springboot使用html模版导出pdf文档
springboot使用html模版导出pdf文档
|
2月前
|
Java Linux 数据安全/隐私保护
Java【代码 16】将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
【2月更文挑战第3天】Java 将word、excel文件转换为pdf格式和将pdf文档转换为image格式工具类分享(Gitee源码)aspose转换中文乱码问题处理
86 0
|
2月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
32 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
|
6月前
|
Cloud Native Go 开发者
使用WPS自动化转换办公文档: 将Word, PowerPoint和Excel文件转换为PDF
使用WPS自动化转换办公文档: 将Word, PowerPoint和Excel文件转换为PDF
96 0
|
7月前
|
Windows
阿里云的在线文档中,通常不提供直接导出为PDF或其他文档格式的功能
阿里云的在线文档中,通常不提供直接导出为PDF或其他文档格式的功能
239 1