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



相关文章
|
存储 JSON API
如何将 Swagger 文档导出为 PDF 文件
你会发现自己可能需要将 Swagger 文档导出为 PDF 或文件,以便于共享和存档。在这篇博文中,我们将指导你完成将 Swagger 文档导出为 PDF 格式的过程。
|
数据挖掘 程序员 数据安全/隐私保护
解锁PDF潜力:9个Python库让你的文档处理更高效
程序员晚枫分享了Python处理PDF的9个第三方库,包括PyPDF2、pdfrw、ReportLab、pikepdf、pdfplumber、pdfminer.six、PyMuPDF、popdf和borb,各具优缺点。选择时需考虑应用场景、功能需求、库的维护状态和开源协议。例如,pdfplumber擅长内容提取,而ReportLab和PyMuPDF适用于创建和修改内容。
4225 7
|
小程序
公众号如何添加附传Word、Excel、Pdf、PPT文档
公众号里添加一些文档给公众号粉丝下载,比如课件PPT、申请表Word文档、岗位需求Excel表、大赛入围/获奖名单等。公众号本身是不支持直接上传文件的,但我们可以通过附件小程序“间接”上传文件。
1975 0
|
人工智能 编解码 文字识别
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
OCRmyPDF 是一款开源命令行工具,专为将扫描的 PDF 文件转换为可搜索、可复制的文档。支持多语言、图像优化和多核处理。
1891 17
OCRmyPDF:16.5K Star!快速将 PDF 文件转换为可搜索、可复制的文档的命令行工具
|
XML 编解码 JavaScript
DOM(文档对象模型)和 BOM(浏览器对象模型)
【10月更文挑战第19天】在前端开发中,理解 DOM(文档对象模型)和 BOM(浏览器对象模型)是至关重要的。它们是 Web 开发的基础,为我们提供了与网页文档和浏览器进行交互的能力。
2335 62
DeepSeek + Xmind,1分钟自动把pdf/word文档转成思维导图
DeepSeek与Xmind结合,1分钟将PDF、Word文档转换为思维导图。只需四步:上传文档至DeepSeek,请求转换为Markdown格式,保存文件并修改后缀为.md,最后导入Xmind生成思维导图。轻松驾驭复杂文档,适用于学习笔记、工作报告、项目规划等场景,大幅提升效率!
|
人工智能 文字识别 自然语言处理
1.6K star!这个开源文本提取神器,5分钟搞定PDF/图片/Office文档!
Kreuzberg 是一个基于 Python 的文本提取库,支持从 PDF、图像、Office 文档等 20+ 格式中提取文本内容。采用 MIT 开源协议,具备本地处理、异步架构、智能 OCR 等特性,特别适合需要隐私保护的文档处理场景。
2127 1
|
存储 运维 安全
《VERICUT 9.X电脑配置要求与安装说明(官方)》—— PDF文档
本文档详细介绍了 CGTech Vericut 9.X 的安装指南,涵盖安装前准备、安装流程、系统要求、故障排除、许可证配置及多种接口配置等内容,为用户提供全面的软件安装与配置指导。
1231 3
|
数据采集 移动开发 前端开发
springboot使用html模版导出pdf文档
springboot使用html模版导出pdf文档
|
JavaScript Java
Java 将Markdown文件转换为Word和PDF文档
【7月更文挑战第5天】Java中使用`Spire.Doc for Java`库可方便地将Markdown转换为Word或PDF。基本步骤包括导入模块,创建`Document`对象,加载Markdown文件,然后保存为目标格式(`.docx`或`.pdf`)。若遇到`Invalid UTF-8 stream`错误,需确保Markdown文件是UTF-8无BOM编码。页面设置可通过`PageSetup`类调整。注意,实际应用会依据具体需求和环境有所调整。
3055 6