下载时空白PDF

Vic*_*cky 2 java pdf struts servlets jasper-reports

我正面临一个非常奇怪的问题,我试图使用下面的代码从我的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());
Run Code Online (Sandbox Code Playgroud)

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

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

File pdf = new File("D:\\sample22.pdf");
JasperExportManager.exportReportToPdfStream(jasperPrint, new FileOutputStream(pdf));
Run Code Online (Sandbox Code Playgroud)

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

我读了一篇文章说它可能是服务器配置的问题,因为我们的服务器可能会破坏输出流.这是我从Servlet创建PDF的文章.

这篇文章说

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

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

Bru*_*gie 6

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

在此输入图像描述

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

在此输入图像描述

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

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

现在假设一个过程所有非ASCII字符转换为ASCII.我已经手动完成了这个操作,你可以在下一个屏幕截图中看到:

在此输入图像描述

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

在此输入图像描述

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

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