Ежедневно в процессе деятельности регистратора REG.RU, в котором я работаю программистом, совершаются сотни операций, требующих оформления каких-либо официальных документов. Среди них — различные договоры, счета, сертификаты и т.п., которые необходимо печатать как компании, так и клиентам. Для таких целей хорошо подходит формат PDF, который на сегодняшний день стал де-факто основным для обмена и распространения документации. Основными преимуществами этого формата можно назвать: кроссплатформенность, аппаратную независимость и безопасность. Все вышеперечисленное позволило PDF завоевать популярность среди пользователей и стать одним из самых распространенных.
Как можно создавать документы в формате PDF на лету, из скрипта? Для таких целей существуют различные инструменты. Одним из них является язык разметки LaTeX, позволяющий автоматизировать многие задачи по подготовке статей, включая набор текста на нескольких языках, нумерацию разделов и формул, перекрёстные ссылки, размещение иллюстраций и многие другие. Но у LaTeX есть одна очень серьезная проблема: у него очень крутая кривая обучения. Чтобы выучить его, требуется затратить много времени. И в LaTeX'е очень неудобно работать с таблицами. Потратив много времени на поиск наилучшего решения, я пришел к выводу, что проще всего конвертировать готовую HTML страницу в PDF и передать клиенту. Я сделал обзор программ, которые можно использовать для такой конвертации.
Основное внимание уделялось таким особенностям конвертеров как:
Так странички отображаются в браузере:
wkhtmltopdf. Наверное, самый популярный на сегодняшний день конвертер и, как оказалось, неспроста. Его основа — движок webkit: шрифты берет из системы, умеет делать разрывы страниц, а для работы нужны библиотечные файлы от X-сервера.
Пример работы:
Как видно из примера, wkhtmltopdf хорошо справился. Все блоки на месте, присутствуют картинки, есть разрыв страницы.
webkit2pdf. Аналог wkhtmltopdf. Ему нужен запущенный X-сервер. С результатами его работы можно ознакомиться чуть выше.
pisa(xhtml2pdf). Конвертер написан на python, а, значит, независим от Х-сервера. Умеет делать разрывы, шрифты настраиваются в отдельном CSS файле, путь к которому передается через параметр. Однако, очень привередливый: в случае малейших ошибок или недочетов в HTML коде падает.
Пример работы:
Очень плохо: шрифт определил правильно, с разметкой не справился.
html2pdf. Прост в обращении, шрифты берет из системы, умеет делать разрывы страниц. Для конвертации использует какую-то старую версию браузера Firefox. Но ему нужен запущенный X-сервер. Помимо этого, может заглючить и отказаться работать. Платный.
Пример работы:
Кроме подвала на второй странице, все блоки и картинки на месте.
htmldoc. Простой конвертер без наворотов.
Пример работы:
Не понимает CSS.
html2ps, ps2pdf. По характеристикам похож на htmldoc.
Пример работы:
prince. Платный конвертер, стоит недешево. Использует системные шрифты, умеет делать разрывы, безразличен к X-серверу.
Пример работы:
Все съехало, проблемы с позиционированием.
Как оказалось, с задачами конвертации лучше справились бесплатные конвертеры. Если нужно конвертировать страничку с большим объемом графики, фреймов и javascript, то лучше использовать конвертеры, основанные на webkit. Если же страничка с минимальным количеством HTML-элементов, то со своей задачей хорошо справится htmldoc.
Обзор по PHP конвертерам можно почитать тут. А тут можно почитать обзор по online конвертерам.
UPD: Отключите ваш блокиратор рекламы если картинки не видны.
Как можно создавать документы в формате PDF на лету, из скрипта? Для таких целей существуют различные инструменты. Одним из них является язык разметки LaTeX, позволяющий автоматизировать многие задачи по подготовке статей, включая набор текста на нескольких языках, нумерацию разделов и формул, перекрёстные ссылки, размещение иллюстраций и многие другие. Но у LaTeX есть одна очень серьезная проблема: у него очень крутая кривая обучения. Чтобы выучить его, требуется затратить много времени. И в LaTeX'е очень неудобно работать с таблицами. Потратив много времени на поиск наилучшего решения, я пришел к выводу, что проще всего конвертировать готовую HTML страницу в PDF и передать клиенту. Я сделал обзор программ, которые можно использовать для такой конвертации.
Требования к конвертерам
Основное внимание уделялось таким особенностям конвертеров как:
- Простота настройки шрифтов
- Вставка разрыва страницы
- Безразличие к X серверу
- Поддержка CSS
Так странички отображаются в браузере:
Обзор
wkhtmltopdf. Наверное, самый популярный на сегодняшний день конвертер и, как оказалось, неспроста. Его основа — движок webkit: шрифты берет из системы, умеет делать разрывы страниц, а для работы нужны библиотечные файлы от X-сервера.
Пример работы:
Как видно из примера, wkhtmltopdf хорошо справился. Все блоки на месте, присутствуют картинки, есть разрыв страницы.
webkit2pdf. Аналог wkhtmltopdf. Ему нужен запущенный X-сервер. С результатами его работы можно ознакомиться чуть выше.
pisa(xhtml2pdf). Конвертер написан на python, а, значит, независим от Х-сервера. Умеет делать разрывы, шрифты настраиваются в отдельном CSS файле, путь к которому передается через параметр. Однако, очень привередливый: в случае малейших ошибок или недочетов в HTML коде падает.
Пример работы:
Очень плохо: шрифт определил правильно, с разметкой не справился.
html2pdf. Прост в обращении, шрифты берет из системы, умеет делать разрывы страниц. Для конвертации использует какую-то старую версию браузера Firefox. Но ему нужен запущенный X-сервер. Помимо этого, может заглючить и отказаться работать. Платный.
Пример работы:
Кроме подвала на второй странице, все блоки и картинки на месте.
htmldoc. Простой конвертер без наворотов.
Пример работы:
Не понимает CSS.
html2ps, ps2pdf. По характеристикам похож на htmldoc.
Пример работы:
prince. Платный конвертер, стоит недешево. Использует системные шрифты, умеет делать разрывы, безразличен к X-серверу.
Пример работы:
Все съехало, проблемы с позиционированием.
Результаты в виде таблицы
Наименование | Способ настройки шрифтов | Поддержка разрывов страниц | Независимость от X-сервера | Поддержка CSS | Бесплатный |
wkhtmltopdf | Использует системные | + | + | + | + |
webkit2pdf | Использует системные | + | - | + | + |
html2pdf | Использует системные | + | - | + | - |
htmldoc | Задаются через параметры | - | + | - | + |
pisa(xhtml2pdf) | Нужно указывать пути к шрифтам в CSS файле | + | + | + | + |
Связка html2ps, ps2pdf | ? | - | + | - | + |
prince | Использует системные | + | + | + | - |
Выводы
Как оказалось, с задачами конвертации лучше справились бесплатные конвертеры. Если нужно конвертировать страничку с большим объемом графики, фреймов и javascript, то лучше использовать конвертеры, основанные на webkit. Если же страничка с минимальным количеством HTML-элементов, то со своей задачей хорошо справится htmldoc.
Примечание
Обзор по PHP конвертерам можно почитать тут. А тут можно почитать обзор по online конвертерам.
UPD: Отключите ваш блокиратор рекламы если картинки не видны.