下载时空白PDF

时间:2015-01-09 06:57:08

标签: 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的文章。

这篇文章说

  

当您的服务器将所有字节的值大于127时,可能会发生这种情况。请参阅您的Web(或应用程序)服务器手册,了解如何确保将二进制数据正确发送到浏览器。

我正在使用struts 1.x,jBoss6,iReport 1.2

1 个答案:

答案 0 :(得分:6)

假设你有一个简单的" 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字典。从语法的角度来看,该文件看起来没问题,所以我可以在Adobe Reader中打开它:

enter image description here

正如你所看到的那样,&#34; Hello World&#34;消失了。包含呈现这些单词的语法的流已损坏(在我的情况下,在您的情况下由服务器,或由Struts,或您使用的任何进程认为您正在创建纯文本而不是二进制文件)。< / p>

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