JSF / Seam: Как загрузить и распечатать динамически сгенерированный файл PDF без вмешательства пользователя? - PullRequest
4 голосов
/ 15 сентября 2011

У меня есть веб-приложение JSF / Seam, в котором есть страница с формой, которая при отправке (нажатие кнопки) вызывает динамическое создание файла PDF (на Java, на стороне сервера) на основе ввода формы. В настоящее время я работаю над тем, чтобы полученный PDF-файл возвращался в браузер в качестве загружаемого файла, поэтому пользователь может сохранить его или открыть его в Acrobat Reader для последующей печати. ​​

Я хотел бы, чтобы PDF-файл отправлялся в браузер и печатался (на стороне клиента) без дальнейшего вмешательства пользователя (ну, кроме, возможно, появления диалогового окна параметров принтера Windows, о котором я ничего не мог сделать).

Решение, по-видимому, основано на наличии скрытого iframe на странице, в которую загружается PDF, и последующего вызова .contentWindow.print() в iframe. Однако я понятия не имею, как вставить PDF в iframe через HttpServletResponse (в Java), тем более как автоматически вызывать print () в iframe после загрузки pdf.

Ответы [ 2 ]

5 голосов
/ 15 сентября 2011

Однако я понятия не имею, как вставить PDF в iframe с помощью HttpServletResponse (на Java)

Пусть точка <iframe src>на URL-адрес servlet , который получает InputStream PDF-файла и записывает его в OutputStream ответа.При необходимости вы можете передать свойства bean-компонента JSF в качестве дополнительных параметров GET, чтобы можно было управлять генерацией PDF.

<iframe src="pdfServlet?foo=#{bean.foo}&amp;bar=#{bean.bar}"></iframe>

Метод doGet() рассматриваемого сервлета может выглядеть следующим образом:

String foo = request.getParameter("foo");
String bar = request.getParameter("bar");

response.setContentType("application/pdf");

InputStream input = generatePdfSomehowBasedOn(foo, bar);
OutputStream output = response.getOutputStream();
// Now just write input to output.

гораздо меньше, как автоматически вызывать print () для iframe после загрузки pdf.

Подключить функцию к <iframe onload>.Однако вы должны принять во внимание специфическое поведение браузера.Другие подсказки можно найти в этом вопросе: Как распечатать IFrame из javascript в Safari / Chrome

0 голосов
/ 06 июля 2016

Это не ответ на ваш вопрос, но вы можете пропустить диалоговое окно печати в chrome, используя режим "киоск" (пропуская диалоговое окно печати), см.

Как отключить предварительный просмотр печати в GoogleChrome ver 38?

Я надеюсь, что это работает для вас:)

цитата из ответа:

Аргумент командной строки disable-print-preview работает на новейшей версии Chrome, я только что сам ее протестировал.

...