Как использовать wkhtmltopdf в веб-приложении Java? - PullRequest
11 голосов
/ 16 апреля 2011

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

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

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

Ответы [ 3 ]

14 голосов
/ 17 апреля 2011

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

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

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

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

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

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

Четвертый подход заключается в том, что wkhtmltopdf может извлекать URL-адреса, чтобы передавать URL-адрес вашей страницы вместо содержимого страницы (который будет работать только в том случае, если запрос был HTTP GET или эквивалентен HTTP GET для тот же URL). Это приводит к небольшим накладным расходам по сравнению с записью ваших собственных выходных ответов, но, вероятно, будет незначительным. При таком подходе вам также, скорее всего, потребуется скопировать cookie-файлы в jar-файл 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 доступен здесь , который объясняет аргументы командной строки.

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

8 голосов
/ 17 января 2012

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

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

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

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

5 голосов
/ 30 ноября 2016

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.

...