8

在我的@ActionMapping我为用户创建了一个 PDF 文件。现在我想知道如何以保存/打开文件对话框的形式将此 pdf 返回给用户?如果生成成功,我更喜欢显示下载链接。

我将 spring-mvc 3.0.5 与 portlet 结合使用。但是,如果有人对普通应用程序有一些指示,那么我可能会从那里弄清楚。对于 2.0,我读到了一些关于扩展 pdfgenerator 类和在 web.xml 中旋转的内容,但现在我们只需要 POJO 的......


编辑:根据 Adeel 的建议编写代码:

File file = new File("C:\\test.pdf");
        response.setContentType("application/pdf");

        try {
            byte[] b = new byte[(int) file.length()];
            OutputStream out = response.getPortletOutputStream();
            out.write(new FileInputStream(file).read(b));
            out.flush();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "users/main";
4

4 回答 4

8

您可以将该文件直接写入您response writercontentType. 例如,

response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment;filename=something.pdf");
OutputStream out = response.getOutputStream();
out.write(pdfFileContentInBytes);
out.flush();                   

好吧,我认为它HttpServletResponse是你所拥有的,但事实并非如此。当您使用 Portlet 时,它是一个RenderResponse对象。在互联网上搜索后,我发现在这方面可能对您有所帮助的链接很少。

另一个想法是将参数更改为ActionResponse response,而不是RenderResponse response。我在这里有点模糊,不确定你的超级类是什么?它是什么方法?ETC....

对我来说,问题似乎是 portlet 响应的允许/不允许 mime 类型。

于 2011-01-04T10:45:33.600 回答
4

在 spring mvc 中,ResourceResponse 响应

response.reset();
response.setContentType("application/pdf");
response.setProperty("Content-disposition", "attachment; filename=\"" +"example.pdf" +"\"");

InputStream fontInputStream = request.getPortletSession()
                .getPortletContext()
                .getResourceAsStream("/WEB-INF/classes/arial.ttf");
Document document = new Document(PageSize.A4, 40, 40, 40, 50);
PdfWriter writer = PdfWriter.getInstance(document,
response.getPortletOutputStream());
document.addAuthor("XYZ");
document.addTitle("ASDF");
document.open();
于 2011-06-21T12:06:08.137 回答
1

这是我一段时间后的答案: 在 Spring Portlet MVC 架构中服务 PDF - Liferay 6.0.6

解决方案是使用 JSR 286 中的资源服务机制。它ResourceResponse res有一个res.setContentType("application/pdf");方法,因此您可以使用它来服务任何类型的资源。如果您需要将其作为附件下载,请使用以下命令:

res.addProperty(HttpHeaders.CONTENT_DISPOSITION,"attachment");

于 2012-01-24T19:51:51.367 回答
0

我的代码:

资源映射(“getPDF”)

public void descargarRecibo(ResourceRequest request,
        ResourceResponse response, PortletSession session,
        ModelMap modelMap) {
    FileInputStream fileInputStream = null;
    BufferedInputStream bufferedInputStream = null;

    String fileURL = "c:/intranetdoc/PDetalleLlamadas/file.pdf";

    try {
        fileInputStream = new java.io.FileInputStream(fileURL);
        OutputStream outputStream = response.getPortletOutputStream();
        response.setContentType("application/pdf");
        response.addProperty("Content-Disposition", "attachment; filename="
                + fileName);
        bufferedInputStream = new java.io.BufferedInputStream(
                fileInputStream);
        byte[] bytes = new byte[bufferedInputStream.available()];
        response.setContentLength(bytes.length);
        int aByte = 0;
        while ((aByte = bufferedInputStream.read()) != -1) {
            outputStream.write(aByte);
        }
        outputStream.flush();
        bufferedInputStream.close();
        response.flushBuffer();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
于 2013-01-24T22:11:20.870 回答