如何从servlet中流式传输pdf文档?

3

我正在使用Jasper Report创建PDF文档,需要从Servlet中流式传输该PDF文档。请问有人可以帮助我找出我的错误所在吗?以下是我在应用程序中使用的代码片段。

ServletOutputStream servletOutputStream = response.getOutputStream();

String fileName="test.pdf";

response.setContentType("application/pdf");
response.setHeader("Content-Disposition","attachment; filename=\"" + fileName + "\"");
response.setHeader("Cache-Control", "no-cache");
try
{
        Map parameters = new HashMap();
        parameters.put("SUBREPORT_DIR", JasperReportFilepath);
        parameters.put("TestId", testID);

        JasperPrint jprint=JasperFillManager.fillReport(filePath, parameters, conn);

        byte[] output=JasperExportManager.exportReportToPdf(jprint);            
        System.out.println("Size====>"+output.length);

        servletOutputStream.write(output);
        servletOutputStream.flush();
        servletOutputStream.close();

        System.out.println("===============>Streaming perfectly");


}
catch(Exception e)
{
        System.out.println("===============>+JasperException"+e.getMessage());
}

我没有收到任何错误信息。一切都正常工作,但文档无法流式传输。请帮助我解决这个问题。


Size 是否正确打印?此外,请注意:fileName != filePath。不确定这是否只是另一个愚蠢的复制和粘贴错误 ;) - BalusC
2个回答

2

你最好使用:

JasperExportManager.exportReportToPdfStream(jprint, servletOutputStream);

嗨Bozho,谢谢你的回复,我也尝试过这种方法。但是我没有看到任何流式文档。您能否提供一些代码片段,使用此逻辑来流式传输文档? - Kumar
你理解中的"streamed"是什么意思?文件应该只是开始下载。 - Bozho
我在程序中使用以下两行代码打印文件大小,但是没有遇到任何异常: byte[] output=JasperExportManager.exportReportToPdf(jprint);
System.out.println("Size====>"+output.length); 根据文件大小,它返回的大小为768或其他值。
- Kumar
你可能有一些过滤器阻止这个内容传递给客户端? - Bozho

0

抱歉,有点晚了,但是有人问过他的 HTML 代码中是否有 <OBJECT> 标签吗?


我不明白为什么要将PDF文件显示为图像。 - BalusC
是的,当在寻找相同解决方案时发布问题会有风险。回答已经得到改进。 - Tony Ennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接