Как использовать wkhtmltopdf в веб-приложении Java?

Я новичок в wkhtmltopdf. Мне интересно, как использовать wkhtmltopdf с моим динамическим веб-проектом в Eclipse? Как интегрировать wkhtmltopdf с моим динамическим веб-приложением Java?

Есть ли учебники для начинающих wkhtmltopdf?

(В принципе, я хотел бы использовать wkhtmltopdf в своем веб-приложении, чтобы при нажатии пользователем кнопки сохранения текущая страница будет сохранена в файле PDF).

Ответ 1

Во-первых, техническое примечание. Поскольку вы хотите использовать wkhtmltopdf в веб-проекте, если и когда вы развертываете на машине Linux-сервера, к которой вы обращаетесь через ssh (то есть по сети), вам нужно либо использовать исправленную Qt или запустить X-сервер, например фиктивный X-сервер xvfb. (Я не знаю, что произойдет, если вы развернете сервер, на котором установлена ​​операционная система, отличная от Linux.)

Во-вторых, очень просто использовать wkhtmltopdf с любого языка в веб-проекте.

Если вы просто хотите сохранить серверную версию текущей страницы, то есть без каких-либо изменений, которые могли бы быть сделаны как заполнение пользователем форм, или Javascript, добавляющий новые элементы DOM, вам просто нужно иметь дополнительный дополнительный аргумент типа ?generate=pdf в конце вашего URL-адреса, что приведет к созданию этой страницы в виде PDF файла, а затем кнопка PDF будет ссылаться на этот URL-адрес. Это может быть большой проблемой для добавления каждой страницы вручную, если вы просто используете простой JSP или что-то в этом роде, но в зависимости от того, какую веб-инфраструктуру вы используете, веб-инфраструктура может предложить некоторую помощь для реализации того же действия на каждой странице, если вам нужно реализовать это.

Чтобы реализовать этот подход, вы, вероятно, захотите захватить ответ, обернув объект ответа и переопределив его методы getWriter() и getOutputStream().

Другой подход заключается в том, чтобы кнопка "отправить и создать PDF", которая сгенерирует следующую страницу как PDF. Это может иметь смысл, если у вас есть форма, которую пользователь должен заполнить - я не знаю. Это действительно дизайнерское решение.

Третий подход заключается в использовании Javascript для загрузки текущего состояния страницы на сервер и обработки с помощью wkhtmltopdf. Это будет работать на любой странице. (Это может даже использоваться на любом сайте, а не только на вашем, если вы делаете это букмарклет. Просто идея, которая пришла мне в голову - это может быть не очень хорошая идея.)

Четвертый подход заключается в том, что wkhtmltopdf может извлекать URL-адреса, чтобы передавать URL-адрес вашей страницы, а не содержимое страницы (что будет работать только в том случае, если запрос был HTTP GET, или если он эквивалентен HTTP GET on тот же URL). У этого есть небольшое количество накладных расходов над захватом вашего собственного ответа, но это, вероятно, будет незначительным. Скорее всего, вам понадобится скопировать файлы cookie в банку cookie с таким подходом, так как предположительно ваш пользователь может войти в систему или иметь неявный сеанс.

Итак, вы видите, что есть много вариантов!

Теперь остается вопрос: когда на вашем сервере есть необходимый HTML-код, из любого из приведенных выше подходов, как подать его в wkhtmltopdf? Это довольно просто. Вам нужно будет создать внешний процесс, используя Runtime.getRuntime().exec(), или новый API под названием ProcessBuilder - см. http://www.java-tips.org/java-se-tips/java.util/from-runtime.exec-to-processbuilder.html для сравнения. Если вы умны, вы должны сделать это, не создавая временных файлов.

Один из сайтов wkhtmltopdf в настоящее время недоступен, но главная README доступна здесь, в которой объясняются аргументы командной строки.

Это всего лишь контурный ответ, который дает некоторые указатели. Если вам нужна дополнительная информация, сообщите нам, что конкретно вам нужно знать.

Ответ 2

Дополнительная информация:

Если вы пытаетесь вызвать wkhtmltopdf во внешнем процессе из java (или, если на то пошло, любого языка), обратите внимание, что "обычный" вывод, который вы видите при использовании wkhtmltopdf из командной строки (то есть, что вы ожидал бы увидеть в STDOUT) не находится в STDOUT, а в STDERR. Я поднял эту проблему на странице проекта

http://code.google.com/p/wkhtmltopdf/issues/detail?id=825

и ответили, что это по дизайну, потому что wkhtmltopdf поддерживает предоставление фактического вывода в формате pdf в STDOUT. Подробнее см. Ссылку и код Java.

Ответ 3

java-wkhtmltopdf-wrapper предоставляет простой API для использования wkhtmltopdf в Java.

Он также работает на безголовом сервере с xvfb.

Например, на сервере Ubuntu или Debian: aptitude install wkhtmltopdf xvfb

Затем в Java:

Pdf pdf = new Pdf();
pdf.addPage("http://www.google.com", PageType.url);
pdf.saveAs("output.pdf");

Дополнительные сведения см. в примерах на странице Github.