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 文件。现在我想知道为什么会这样。
我正在使用 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 文件。现在我想知道为什么会这样。