Как получить PDF-содержимое (подается из метода контроллера Spring MVC) для отображения в новом окне - PullRequest
6 голосов
/ 22 февраля 2012

Я новичок в Spring MVC, но впечатлен его возможностями.

Я использую 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-файл с помощью клиентской программы просмотра PDF (Adobe Reader, FoxIt и т. Д.), Но мне было бы хорошо, если бы PDF-файл отображался в отдельном окне браузера.

EDIT: Я решил установить Content-Disposition таким образом, чтобы браузер отображал окно сохранения / открытия, где пользователь может открыть Adobe (с потерей главной страницы браузера).

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

Спасибо всем!

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

Укажите target="_blank" в теге form:form, который отправляет вашу форму.

1 голос
/ 02 января 2015

Используйте производимые @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);
}
0 голосов
/ 22 февраля 2012

Вы можете сделать это на стороне клиента с помощью некоторого 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). Если вы хотите, чтобы в главном окне происходило что-то еще, просто не возвращайте false из события onClick, и позвольте обычному клику делать то, что вы хотите, чтобы это происходило в главном окне

Это не ваше дело, если PDF-файлы открываются в окне браузера или в Adobe, это конфигурация на компьютере пользователя.

-

Также, как и в Spring, @ResponseBody в методе void не имеет никакого смысла. @ResponseBody указывает пружине использовать тип возврата метода в качестве Ответа. То есть вы должны вернуть byte[] из метода и позволить Spring разобраться с превращением его в ответ сервлета. Вместо того, чтобы писать ответ непосредственно внутри метода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...