Java - 带有 HttpServlet 的空白 PDF

Java - Blank PDF with HttpServlet

我正在使用 JasperReports 生成 PDF,并使用 HttpServlet 将二进制数据发送到浏览器。问题是从客户端下载的生成的 PDF 最终成为损坏的 pdf,因此 PDF 查看器显示空白 PDF。

起初,我认为这可能是 JasperReports 的问题,但我将 PDF 保存到一个文件中,效果非常好。

JasperExportManager.exportReportToPdfFile(jasperPrint, "/home/user/Desktop/Example.pdf");
// jasperPrint is the rendered JasperReport

所以这可能是与 HttpServlet 相关的问题。我发送数据的方式如下:

    HttpServletResponse response;
    byte[] out = JasperExportManager.exportReportToPdf(jasperPrint); 
    // jasperPrint is the rendered JasperReport

    response.reset();

    response.setHeader("Content-disposition", "attachment;filename=\"Example.pdf\"");
    response.setContentType("application/pdf");
    response.setHeader("Cache-Control", "max-age=0");
    response.setContentLength(out.length);
    response.setHeader("Content-Length", String.valueOf(out.length));
    response.getOutputStream().write(out, 0, out.length);
    response.getOutputStream().flush();
    response.getOutputStream().close();
    // Right after that, the browser asks me to download the file
    // and this is the moment when I got a blank PDF

最重要的是,我在问这个问题之前已经检查了这个答案 Blank PDF while downloading

还有一件事:在 QA 环境下下载 PDF 非常好(没有空白 PDF),运行 JBoss 服务器在 Windows 机器上。在我的本地环境中,我得到一个空白的 PDF,正如我之前提到的,运行 JBoss 服务器在 Linux 机器上。

所以我想知道:如何检查我的 Jboss 设置来解决问题?根据上一个问题,服务器可能忽略或压缩了二进制数据,我不太确定。

我是否也应该检查我的 web.xml 文件?

感谢您的帮助!

我终于找到了解决办法!我的代码与此无关,这一直是 Grunt 的问题。出于某种原因,Grunt 将发送到浏览器的 PDF 转换为错误的编码。我不得不改变

"grunt-contrib-connect": "^0.8.0""grunt-contrib-connect": "~0.5.0" .

那我运行

npm 安装

这解决了我的问题。在此处找到解决方案

https://github.com/drewzboto/grunt-connect-proxy/issues/73#issuecomment-59532082

我无法解释为什么最新版本的 grunt-contrib-connect 以错误的方式编码 PDF 文件。现在我想知道为什么会这样。