13 December 2011

Из html в pdf – легко! Обзор конвертеров

Software
Ежедневно в процессе деятельности регистратора REG.RU, в котором я работаю программистом, совершаются сотни операций, требующих оформления каких-либо официальных документов. Среди них — различные договоры, счета, сертификаты и т.п., которые необходимо печатать как компании, так и клиентам. Для таких целей хорошо подходит формат PDF, который на сегодняшний день стал де-факто основным для обмена и распространения документации. Основными преимуществами этого формата можно назвать: кроссплатформенность, аппаратную независимость и безопасность. Все вышеперечисленное позволило PDF завоевать популярность среди пользователей и стать одним из самых распространенных.

Как можно создавать документы в формате PDF на лету, из скрипта? Для таких целей существуют различные инструменты. Одним из них является язык разметки LaTeX, позволяющий автоматизировать многие задачи по подготовке статей, включая набор текста на нескольких языках, нумерацию разделов и формул, перекрёстные ссылки, размещение иллюстраций и многие другие. Но у LaTeX есть одна очень серьезная проблема: у него очень крутая кривая обучения. Чтобы выучить его, требуется затратить много времени. И в LaTeX'е очень неудобно работать с таблицами. Потратив много времени на поиск наилучшего решения, я пришел к выводу, что проще всего конвертировать готовую HTML страницу в PDF и передать клиенту. Я сделал обзор программ, которые можно использовать для такой конвертации.

Требования к конвертерам

Основное внимание уделялось таким особенностям конвертеров как:
  • Простота настройки шрифтов
  • Вставка разрыва страницы
  • Безразличие к X серверу
  • Поддержка CSS
Желательно, чтобы шрифты и кодировку можно было легко настроить. В идеале, конвертер должен сам распознавать используемую кодировку и шрифт. Чтобы нужные данные помещались на одной странице, а не расползались на две, пользователи делают разрыв на странице. Хотелось бы иметь возможность создавать разрывы простым способом — через CSS свойство. Конвертер должен быть независим от X Windows, поскольку работает на Web-сервере, который и без X Windows'a сильно загружен. Конечно же, можно использовать Xvfb, но это не подходящее решение. Для теста были сделаны две простые HTML-странички, прошедшие валидацию. Первая страница содержит разрыв, сделанный CSS свойством, вторая — содержит сложную таблицу с объединениями ячеек.

Так странички отображаются в браузере:
image

image

Обзор

wkhtmltopdf. Наверное, самый популярный на сегодняшний день конвертер и, как оказалось, неспроста. Его основа — движок webkit: шрифты берет из системы, умеет делать разрывы страниц, а для работы нужны библиотечные файлы от X-сервера.
Пример работы:
image image image
Как видно из примера, wkhtmltopdf хорошо справился. Все блоки на месте, присутствуют картинки, есть разрыв страницы.

webkit2pdf. Аналог wkhtmltopdf. Ему нужен запущенный X-сервер. С результатами его работы можно ознакомиться чуть выше.

pisa(xhtml2pdf). Конвертер написан на python, а, значит, независим от Х-сервера. Умеет делать разрывы, шрифты настраиваются в отдельном CSS файле, путь к которому передается через параметр. Однако, очень привередливый: в случае малейших ошибок или недочетов в HTML коде падает.
Пример работы:
image image
Очень плохо: шрифт определил правильно, с разметкой не справился.

html2pdf. Прост в обращении, шрифты берет из системы, умеет делать разрывы страниц. Для конвертации использует какую-то старую версию браузера Firefox. Но ему нужен запущенный X-сервер. Помимо этого, может заглючить и отказаться работать. Платный.
Пример работы:
image image image
Кроме подвала на второй странице, все блоки и картинки на месте.

htmldoc. Простой конвертер без наворотов.
Пример работы:
image image
Не понимает CSS.

html2ps, ps2pdf. По характеристикам похож на htmldoc.
Пример работы:
image image

prince. Платный конвертер, стоит недешево. Использует системные шрифты, умеет делать разрывы, безразличен к X-серверу.
Пример работы:
image image image
Все съехало, проблемы с позиционированием.

Результаты в виде таблицы
Наименование Способ настройки шрифтов Поддержка разрывов страниц Независимость от X-сервера Поддержка CSS Бесплатный
wkhtmltopdf Использует системные + + + +
webkit2pdf Использует системные + - + +
html2pdf Использует системные + - + -
htmldoc Задаются через параметры - + - +
pisa(xhtml2pdf) Нужно указывать пути к шрифтам в CSS файле + + + +
Связка html2ps, ps2pdf ? - + - +
prince Использует системные + + + -
Выводы

Как оказалось, с задачами конвертации лучше справились бесплатные конвертеры. Если нужно конвертировать страничку с большим объемом графики, фреймов и javascript, то лучше использовать конвертеры, основанные на webkit. Если же страничка с минимальным количеством HTML-элементов, то со своей задачей хорошо справится htmldoc.

Примечание

Обзор по PHP конвертерам можно почитать тут. А тут можно почитать обзор по online конвертерам.

UPD: Отключите ваш блокиратор рекламы если картинки не видны.
Tags:htmlpdfконвертер
Hubs: Software
+61
48.3k 329
Comments 24