【问题标题】:How to get PDF content (served from a Spring MVC controller method) to appear in a new window如何让 PDF 内容(由 Spring MVC 控制器方法提供)出现在新窗口中
【发布时间】:2012-03-13 04:13:52
【问题描述】:

我是 Spring MVC 的新手,但我对它的功能印象深刻。

我正在使用 3.1.0-RELEASE,我必须显示 PDF 以响应 form:form 提交。

这是我在控制器中编写的(小)代码:

@RequestMapping(value = "new_product", method = RequestMethod.POST, params = "print")
@ResponseBody
public void saveAndShowPDF(ModelMap map, ShippingRequestInfo requestInfo, HttpServletRequest request, HttpServletResponse httpServletResponse) throws IOException {
    saveProductChanges(map, requestInfo, request, httpServletResponse);
    httpServletResponse.setContentType("application/pdf");
    byte[] pdfImage = productService.getPDFImage(requestInfo.getRequestId());
    httpServletResponse.getOutputStream().write(pdfImage);
}

此代码将 PDF 字节 [] 发送回原始窗口。

如何让 PDF 显示在单独的窗口中,以便我仍然可以在原始浏览器窗口中显示其他内容?最好的方法是使用客户端 PDF 视图程序(Adobe Reader、FoxIt 等)显示 PDF,但我可以在单独的浏览器窗口中显示 PDF。

编辑: 我决定设置 Content-Disposition 以便浏览器显示一个保存/打开框,用户可以在其中打开 Adob​​e(丢失主浏览器页面)。

httpServletResponse.setHeader("Content-Disposition","attachment;filename=cool.pdf");

谢谢大家!

【问题讨论】:

    标签: java pdf browser spring-mvc


    【解决方案1】:

    在提交表单的form:form 标记中指定target="_blank"

    【讨论】:

    • target="_blank" 将(希望)在单独的窗口中显示 PDF。如果我让控制器方法返回一个字符串,我可以让原始窗口呈现一个新页面(以及新窗口中的 PDF)吗?
    • 该死...我不能使用 target="__blank" 因为表单有多个 type="submit" 按钮,我只有这个按钮需要在单独的窗口中响应(PDF)。我决定设置 Content-Disposition 以带来一个保存/打开框,用户可以在其中打开 Adob​​e(丢失主浏览器页面) httpServletResponse.setHeader("Content-Disposition","attachment;filename=product.pdf");
    【解决方案2】:

    您可以在客户端使用一些 javascript 来执行此操作,例如:

    <a href="http://www.myWebApp.com/somePdf.pdf" onclick="window.open('http://www.myWebApp.com/somePdf.pdf'); return false;" target="_blank">My Super Awesome Docment</a>
    

    (根据需要用漂亮的 jQuery 替换)如果您希望在主窗口中发生其他事情,请不要从 onClick 事件中返回 false,并让常规单击执行您想要发生的任何事情在主窗口中

    PDF 是否在浏览器窗口或 Adob​​e 中打开取决于用户计算机上的配置。

    --

    另外,就像 Spring 一样,@ResponseBody 上的 void 方法没有任何意义。 @ResponseBody 告诉 spring 使用方法的返回类型作为响应。也就是说,您将从该方法返回byte[],并让spring 处理将其转换为servlet 响应。而不是自己直接在方法内部编写响应

    【讨论】:

    【解决方案3】:

    使用@RequestMapping 产生来定义响应类型。

    @RequestMapping(value = doc/{docId}, method = RequestMethod.GET, produces =  "application/pdf")
    @ResponseBody
    public byte[] getDocument(@PathVariable("docId") String docId) throws Exception
    {
        return service.getDocument(docId);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2019-05-07
      相关资源
      最近更新 更多