java - 下载时显示空白 PDF

标签 java servlets pdf jasper-reports struts

我面临一个非常奇怪的问题,我正在尝试使用下面的代码从我的 struts 应用程序发送 PDF 文件作为附件,

        JasperReport jrReport = (JasperReport) JRLoader.loadObject(jasperReport);
        JasperPrint jasperPrint = JasperFillManager.fillReport(jrReport, parameters, dataSource);
        jasperPrint.setName(fileNameTobeGivenToExportedReport);
        response.reset();
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=\"" + fileNameTobeGivenToExportedReport + ".pdf" + "\"");
        response.setHeader("Cache-Control", "private");
        JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());

但是正在下载的 PDF 没有数据,意味着它显示空白页。

在上面的代码中,我添加了以下行以将 PDF 文件保存在我的 D: 目录中

File pdf = new File("D:\\sample22.pdf");
JasperExportManager.exportReportToPdfStream(jasperPrint, new FileOutputStream(pdf));

生成的文件是正确的,意味着所有数据。我注意到的一件事是,从浏览器下载的文件和“sample22.pdf”具有相同的大小。

我读到一篇文章,说这可能是服务器配置的问题,因为我们的服务器可能会损坏输出流。这是我读过的文章Creating PDF from Servlet .

这篇文章说

This can happen when your server flattens all bytes with a value higher than 127. Consult your web (or application) server manual to find out how to make sure binary data is sent correctly to the browser.

我使用的是struts 1.x、jBoss6、iReport 1.2

最佳答案

假设您有一个简单的“Hello World”PDF 文档:

enter image description here

当您打开此文档时,您会看到文件结构使用 ASCII 字符,但页面的实际内容被压缩为二进制流:

enter image description here

您在任何地方都看不到“Hello World”一词,它们与 PDF 语法一起压缩,其中包含将页面上的这些单词绘制到此流中所需的信息:

xœ+är
á26S°00SIá2PÐ5´ 1ôÝBÒ¸4<RsròÂó‹rR5C²€j@*\C¸¹ Çq°

现在假设一个进程所有非 ASCII 字符转换为 ASCII。我已手动完成此操作,如您在下一个屏幕截图中看到的:

enter image description here

我仍然可以打开该文档,因为我没有对文件结构进行任何更改:仍然有一个 /Pages 三个和一个 /Page 字典。从语法的角度来看,该文件看起来没问题,因此我可以在 Adob​​e Reader 中打开它:

enter image description here

如您所见,“Hello World”一词消失了。包含渲染这些单词的语法的流已损坏(在我的情况下是手动的,在您的情况下是由服务器或 Struts 或您正在使用的任何认为您正在创建纯文本而不是二进制文件的进程)。

你需要做的是找到发生这种情况的地方。也许 Struts 是罪魁祸首。也许您(无意中)像创建纯文本文件一样使用 Struts。远程很难判断。这是由配置问题引起的典型问题。只有有权访问您的配置的人才能解决此问题。

关于java - 下载时显示空白 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27855365/

相关文章:

pdf - JsDoc 到 PDF 渲染器

java - 将参数传递给 REST Web 服务

java - 无状态与有状态微服务

java - 如何从 servlet 运行套接字服务器/客户端以更好地访问项目代码和文件到 Tomcat 服务器?

ios - Safari URL 到 PDF 页面的解决方法?

pdf - 从 github wiki 轻松导出(?)

java - 我必须将 hibernate 设置为 weblogic 吗?

java - Hibernate搜索faceting,如何返回facet查询Spring MVC

java - 在java web应用程序中使用请求对象来识别客户端机器操作系统

java.lang.NoSuchMethodError : javax. servlet.ServletContext.getContextPath()Ljava/lang/String;