【问题标题】:Spring MVC to open PDF as the viewSpring MVC 打开 PDF 作为视图
【发布时间】:2012-06-08 15:28:04
【问题描述】:

渲染现有 PDF 的合适视图类是什么?抽象视图?

我正在通过网络服务获取 PDF,所以我不希望继承 AbstractPdfView 来呈现 PDF。

我想继续使用返回 ModelAndView 的 Spring 控制器类,这意味着编写我自己的 AbstractView 子类来将 PDF 写入 ServletOutputStream。 Spring MVC 中还有其他可用的内置支持吗?

谢谢

【问题讨论】:

  • 我的错...我没看到你不想扩展AbstractPdfView :S。我同意@Biju Kunjummen,你可以简单地写在回复中

标签: spring-mvc


【解决方案1】:

我同意@Biju Kunjummen 的回答,但使用 iText 也可以很好地生成 PDF。

这里是控制器方法的代码sn-p。

@RequestMapping(value = "/common/reportgenerator/generatePDF")
    public void generatePdf(HttpServletRequest req,HttpServletResponse res)
    {
        res.setContentType("text/html;charset=UTF-8");
        ServletOutputStream outStream=null;
        try 
        {
            String calledFrom = req.getHeader("referer");
            calledFrom=req.getRequestURL().substring(0,req.getRequestURL().lastIndexOf("/"))+"/ReportGenerator.egp";
            calledFrom += "?isPdf=yes&"+req.getQueryString();
            System.out.println(calledFrom+"?isPdf=yes&"+req.getQueryString());



            InputStream input = new URL(calledFrom).openStream();
            StringWriter writer = new StringWriter();
            CopyUtils.copy(input, writer);

            //System.out.println(writer.toString());

            res.setContentType("application/pdf");
            res.setHeader("Content-Disposition", "attachment;filename=report.pdf");
            outStream = res.getOutputStream();

            ITextRenderer renderer = new ITextRenderer();


            renderer.setDocument(calledFrom);
            renderer.layout();
            renderer.createPDF(outStream);

        } 
        catch (Exception e) 
        {
            new AbcException(e,exceptionHandlerService);
        }
        finally
        {
            try
            {
                outStream.flush();
                outStream.close();
            }
            catch(Exception ex)
            {
                new AbcException(ex,exceptionHandlerService);
            }

        }


    }

希望这对您有所帮助。干杯。

【讨论】:

    【解决方案2】:

    我认为最好的方法是简单地使用 HttpServletResponse 将其流式传输出来:

    OutputStream out = response.getOutputStream();
    
    out.write(..); //buffer and write..
    

    【讨论】:

      【解决方案3】:

      没有这样的课程。

      您必须手动写入该文件。 请在此处查看答案: Display the PDF file stored on the webserver on Browser new window using Spring MVC

      我已将该代码更改为:

       // get absolute path of the application
       ServletContext context = request.getSession().getServletContext();
       String appPath = context.getRealPath("/");
       // construct the complete absolute path of the file
       String fullPath = appPath + "WEB-INF/pdfs/201507.pdf";
      

      另外,请参阅不下载 pdf 的答案 并将 inputStream 放在 finally 块中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多