Java 如何获取PDF内容(从Spring MVC控制器方法提供)以显示在新窗口中

Java 如何获取PDF内容(从Spring MVC控制器方法提供)以显示在新窗口中,java,pdf,browser,spring-mvc,Java,Pdf,Browser,Spring Mvc,我是SpringMVC的新手,但我对它的功能印象深刻 我正在使用3.1.0-RELEASE,我必须显示一个PDF以响应表单:表单提交 以下是我在控制器中编写的(小)代码: @RequestMapping(value = "new_product", method = RequestMethod.POST, params = "print") @ResponseBody public void saveAndShowPDF(ModelMap map, ShippingRequestInfo req

我是SpringMVC的新手,但我对它的功能印象深刻

我正在使用3.1.0-RELEASE,我必须显示一个PDF以响应表单:表单提交

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

@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视图程序(AdobeReader、FoxIt等)显示PDF,但我可以在单独的浏览器窗口中显示PDF

编辑: 我决定设置内容配置,以便浏览器显示一个保存/打开框,用户可以在其中打开Adobe(同时丢失浏览器主页面)


谢谢大家

在提交表单的
form:form
标记中指定
target=“\u blank”

您可以使用一些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 ness)如果您希望在主窗口中发生其他事情,只需不要从onClick事件返回false,并让常规单击在主窗口中执行您希望发生的任何事情

如果PDF是在浏览器窗口或Adobe中打开的,这并不取决于您,而是用户计算机上的配置

--


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

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

我没有请求PDF的nchor标记…PDF字节[]从MVC控制器响应返回。你是对的,我能做的最好的事情就是使用target“_blank”在单独的窗口中获取响应(即PDF图像)。现在是否可以让原始窗口呈现新页面(以及新窗口中的PDF)!无论是单击链接还是提交表单,在客户端提交响应时,都需要通知浏览器在新窗口中打开响应。如果希望在主窗口中发生其他事情,请不要在onClick事件中返回false,如果你想在主窗口中执行任何操作,请让常规单击执行。该死……我不能使用target=“\u blank”,因为表单有多个type=“submit”按钮,我只需要在单独的窗口中使用该按钮的响应(PDF)。我决定将内容配置设置为带一个保存/打开框,用户可以在其中打开Adobe(丢失主浏览器页面)httpServletResponse.setHeader(“内容配置”、“附件;文件名=_blank”);您仍然可以使用javascript/shrugThe target=“_blank”将(希望)在单独的窗口中显示PDF。如果我让控制器方法返回一个字符串,我可以让原始窗口呈现一个新页面(以及新窗口中的PDF)吗?该死…我不能使用target=“\uu blank”,因为表单有多个type=“submit”按钮,我只需要此按钮在单独的窗口中响应(PDF)。我决定将内容配置设置为带一个保存/打开框,用户可以在其中打开Adobe(丢失主浏览器页面)httpServletResponse.setHeader(“内容配置”、“附件;文件名=product.pdf”);
@RequestMapping(value = doc/{docId}, method = RequestMethod.GET, produces =  "application/pdf")
@ResponseBody
public byte[] getDocument(@PathVariable("docId") String docId) throws Exception
{
    return service.getDocument(docId);
}