【问题标题】:How to display pdf report on client side如何在客户端显示pdf报告
【发布时间】:2014-09-22 21:07:22
【问题描述】:

我正在将 JasperReports 集成到我的项目中,但我是 Jasper Report 的新手,所以我编写了一个 servlet ,它将编译、填写报告并导出为 pdf。之后我必须将 outputtreem 发送到 jsp 并在客户端显示 pdf。

我已经这样做了。

  <a href="VehicleReports">Vehicle Report</a>

doPost() 方法中我是这样写的。

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Connection con=null;
        try {
          response.setContentType("application/pdf"); 
          con=VehicleDetails.getConnection();
          InputStream inputStream = new FileInputStream ("E:/ReportFld/report4.jrxml");
          Map parameters = new HashMap();
          JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
          JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
          @SuppressWarnings("unchecked")
          JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, con);
          JasperExportManager.exportReportToPdfFile(jasperPrint, "D:/reports/vehicle2_jasper.pdf");
            int len = (int)new File("D:/reports/vehicle2_jasper.pdf").length(); 
            response.setContentLength(len); 
            byte[] buf = new byte[len]; 
            FileInputStream pdfin = new FileInputStream("D:/reports/vehicle2_jasper.pdf"); 
            pdfin.read(buf); 
            pdfin.close(); 
            OutputStream pdfout = response.getOutputStream(); 
            pdfout.write(buf,0,len); 
            pdfout.flush();  
            request.getRequestDispatcher("/vehicleReport.jsp").forward(request, response);

        }catch(Exception e){ 
           e.printStackTrace();
         }finally{
            try {
                con.close();
            }catch (SQLException e) { 
                e.printStackTrace();
            }
        }
    }

但在这里我的感觉是,响应没有发送到 /vehicleReport.jsp 文件,而是下载生成的 pdf。而且我在控制台中遇到错误,

java.lang.IllegalStateException: Cannot forward after response has been committed
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:348)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:338)
at com.reports.VehicleReports.doGet(VehicleReports.java:78)

我该如何解决这个问题,谁能帮我解决这个问题?

【问题讨论】:

标签: java jasper-reports


【解决方案1】:

由于您的方法不起作用,您可以尝试另一种方法。 首先进入您的视图 (JSP),然后调用控制器生成 PDF 并在那里显示。假设你的servlet的URL模式是PdfView,那么你就可以写了。

<a href="PdfView">View Pdf</a>

或者更好地将 pdf 嵌入 iframe 中

<iframe src="PdfView" width="100%" height="600"></iframe>

从您的控制器中删除该行

request.getRequestDispatcher("/vehicleReport.jsp").forward(request, response);

或者,您也可以提供生成文件的完整路径并跳过整个 servlet 部分。但这可能会将您的目录结构暴露给您希望避免的客户。

此外,由于 JasperReport 还可以创建“流”而不在服务器中创建实际文件,因此您也可以使用它。这将在客户端浏览器上创建文件,而不必费心清理服务器。见[这里](http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/JasperExportManager.html#exportToPdfStream(java.io.InputStream, java.io.OutputStream))

JasperExportManager.exportReportToPdfStream(jasperPrint, outputStream);

根据您的最后评论完成任务的 JSP 代码。在这种情况下,一个小 jquery 非常有用。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<script type="text/javascript">

$(document).ready(function(){


    $('#form').submit(function(){

        var action = "VehicleReports?vehicleModel=";
        var input = $('#input').val();

        action = action+input;

        alert(action);

        $('#frame').attr("src",action);

        return false;
    });
});

</script>

</head>
<body>


<form action="" method="get" id="form">

    <input type="text" id="input"/>
    <input type="submit" value="submit" />

</form>


<iframe src="" width="100%" height="600" id="frame"></iframe>

</body>
</html>

【讨论】:

  • 这很好,但在项目中它必须是动态的。
  • 它还有另一个问题,这里它适用于&lt;a href= &gt;标签但它不适用于&lt;form action="PdfView"&gt;
  • 您可以使用隐藏的表单字段来传递您想要的参数以防表单。如果是href,您可以使用PdfView?param=value,您可以在其中传递网页中的值。
  • 是的,我知道exportReportToPdfStream() 方法会产生流。但我的问题是,如何将此流发送到下一个 jsp 文件并使用它如何显示报告。你能用一些代码片段帮助我吗?
  • 我已经提到了如何做到这一点,首先访问您的 JSP,然后从那里调用您的控制器。请参考我之前关于如何将动态值传递给控制器​​的评论
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多