вторник, 17 мая 2011 г.

Конвертируем HTML в PDF

Предыстория
Есть некое веб-приложение(на Perl), в котором нужно было добавить определенный набор отчетов. Отчеты должны иметь два представления - HTML и PDF.

Для решения этой задачи, естественно, можно было бы воспользоваться модулями типа PDF::Reuse, PDF::API2, PDF::API2::Simple, но:
1. Это лишние временные затраты (изучение API, написания дополнительного кода)
2. Это усложнение сопровождения отчетов. Необходимо дублировать логику HTML-шаблонов в PDF и постоянно поддерживать это в актуальном состоянии.

Поэтому, было выбрано другое решение - использовать конвертор HTML в PDF. Сразу оговорюсь, что было это года 3-4 назад. Для PHP, вроде как, на то время уже существовал dompdf(рендеринг написан на php), а для Perl ничего такого не было.

Провал HTMLDOC
После долгих поисков нашел такую тулзень как HTMLDOC. Но она была далеко не идеальна:
1. В HTMLDOC нет поддержки Unicode, поэтому приходилось предварительно перекодировать HTML в cp1251.
2. Шрифты, которые идут с HTMLDOC не поддерживают кириллических символов. Но в интернетах был найдет комплект шрифтов с поддержкой кириллицы. Главное после установки HTMLDOC не забыть заменить шрифты :)
3. Поддержка только базового HTML(про CSS забудьте). Пришлось довольствоваться чем было.

В добавок на прошлой неделе мне пришли жалобы, что в отчетах съедаются диактрические символы(типа всякие умляуты в немецком и так далее) и я начал искать решение.

Первой попыткой было использовать  HTMLDOC 1.9 (нестабильный релиз),  там добавили базовую поддержку Unicode. После 8-го segfault с 10 попыток конвертации, было решено вернуться к предыдущей версии(без поддержки  Unicode)

Вторая попытка была заменять не CP1251 символы на escape-последовательности вида "&#xxxx;", но после 3-4 последовательностей в файле, HTMLDOC их просто переставал преобразовывать в нужные символы.

Триумф WKHTMLTOPDF
Я начал искать новый конвертор. И каково было ж мое удивление, когда я нашел такого зверя, как  WKHTMLTOPDF :)

WKHTMLTOPDF - это консольный конвертор, который использует Webkit для рендеринга HTML, следовательно PDF документы будут максимально приближены к оригинальному HTML. И это реально так, можете смело использовать CSS-стили. WKHTMLTOPDF сконвертит HTML практически любой сложности!!!


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

WKHTMLTOPDF умеет не только конвертить локальные файлы, но может  тянуть страничку с  веба. Попробуйте:

wkhtmltopdf http://kanobu.ru kanobu.pdf
Результат можно посмотреть здесь.

4 коммент.:

antonfin комментирует...

При работе ты пользовался перловым модулем WKHTMLTOPDF (см. http://search.cpan.org/~tbr/WKHTMLTOPDF-0.02/lib/WKHTMLTOPDF.pm)?
Если да, то стоит ли его использовать?

koorchik комментирует...

2antonfin:
Я реализовал через обычный вызов system.

А модуль я видел, но решил его не использовать по следующим причинам:
Во-первых, он все равно сам вызывает консольный wkhtmltopdf.
Во-вторых, я не хотел лишних зависимостей, в особенности от Moose :).
В-третьих, он 2009 года, за это время были добавлены новые опции, которые модуль не поддерживает.

ROM комментирует...

Только сегодня искал и разочаровался в htmldoc. Решил забросить и делать картинку, но покался Ваш пост. Спасибо!

koorchik комментирует...

> Только сегодня искал и разочаровался в htmldoc. Решил забросить и делать картинку, но покался Ваш пост. Спасибо!
Всегда пожалуйста! )

Отправить комментарий

Не забудьте добавить себя в постоянные читатели и включить уведомления о новых комментариях, либо воспользуйтесь RSS каналом ;)