Меню Закрыть

Wkhtmltopdf php пример использования

Нашел замечательный инструмент для конвертирования HTML страниц в PDF И IMG. Использую эту утилиту в PHP. Раньше, чем только не пытался работать. Это и TcPDF (Долгий и тормознутый) и JASPER REPORTS (тяжело ставить и юзать).

Называется эта находка wkhtmltopdf.

Сразу опишу достоинства:

  • Open source (LGPL), т.е. бесплатный
  • Работает ОЧЕНЬ быстро
  • Рендер основан на движке WebKit, а значит выполняет JS и всё прочее, как браузер
  • Имеет кучу настроек, которые можно передавать параметрами при вызове программы
  • Есть версии для Windows, Linux, Mac OS, а так же исходники
  • Умеет тянуть страницы прям из Интернет по URL
  • Умеет делать из страницы изображение, а не только PDF

Скачать wkhtmltopdf можно тут

Как видите, конвертер сделал полноценную копию внешнего вида, с рекламой и социальными кнопками под статьеё. JS работает.

Вы можете выделить текст статьи в PDF версии, что говорит о том, что это реальный PDF документ, а не картинка вставленная в PDF.

Например в консоли Винды

]# wkhtmltopdf http://linux26.ru linux.pdf

Как я его юзаю в одном из своих Yii проектов

Алгоритм таков: создаю html страницу, сохраняю её в файл. с помощью exec() вызываю утилиту с параметрами, где указываю путь к этому html файлу и куда сохранить результат. После генерации PDF файл html страницы удаляется.

Я сейчас пользуюсь wkhtmltopdf где я пытаюсь сгенерировать .pdf файл после того, как пользователь отправляет форму на нашем сайте. Данные формы отправляются в post.php где он отображается красиво, как отформатированная веб-страница. Я хочу сгенерировать .pdf файл именно этой страницы.

Но проблема начинается при попытке выполнить wkhtmltopdf , Я получаю непрерывный цикл, потому что я пытаюсь сгенерировать .pdf изнутри этого post.php файл, который также является целью.

Я также пытался include() отдельный PHP файл для обработки exec() функция, но я все еще получаю непрерывный цикл.

Читайте также:  Kyocera 3140 добавьте тонер

Может быть, визуальный ниже поможет:

form.php который содержит что-то вроде ниже …

post.php который содержит опубликованные данные и содержит HTML вот так…

Мой код работает, когда exec() Функция запускается отдельно от этих файлов, но как бы я exec() в этом же процессе, автоматически?

Любое понимание очень ценится.

Решение

призвание wkhtmltopdf http://example.com/post.php ecard.pdf потеряет почтовые данные, поэтому, даже если это сработало, PDF будет пустым.

Скорее сгенерируйте pdf как html, а затем передайте его в wkhtmltopdf. Например: (Непроверенные)


К написанию данной статьи меня сподвиг следующий пост.
Пришлось мне как-то столкнуться с задачей генерирования pdf файла из имеющейся страницы сайта. Заказчик хотел, что бы у посетителя была возможность получить в pdf текущую страницу его интернет-магазина. Причем получить именно в том виде, который лицезреет клиент, только без заголовка и шапки сайта. Пример буду описывать для сайта на системе управления Битрикс, поскольку именно на нем был сайт, для которого создавался функционал.

Порывшись по интернету и поискав различные библиотеки генерации pdf на базе php понял, что дело дрянь. Все варианты, что я пробовал, имели существенные ограничения по поддержке CSS. Упомяну, что хотелось сделать «кроссерверно», то есть, что бы, при переносе сайта на другой хостинг, функциональность сайта не пострадала. Как выяснилось впоследствии, этого было не достичь. Поломав голову, решил использовать программные решения. Поскольку сайт крутился на арендованном сервере, у меня был полный доступ к системе. Еще немного порыскав по интернету, нашел практически единственное решение, идеально подошедшее мне и, думаю, которое подойдет многим другим пользователям. Имя этому решению wkhtmltopdf. Это утилитка генерации pdf из html, которая использует возможности WebKit’а, веб-рендера на котором основан, в частности, Apple Safari. Утилитка работает из командной строки, что нам и требуется.

Родная страница проекта.
Последняя доступная версия 0.10.0 beta4.
Работает практически на любой ОС. Я проверял работу на базе CentOS 5.5.
Скрипт требует для работы X11, gcc и openssl. Так же для правильного компилирования требуется наличие Qt. В примечаниях к установке указывается, что Qt желательно ставить путем компиляции, если ставить из дистрибутива, не все опции будут доступны. Я ставил Qt из дистрибутива и использовал готовый бинарник, никаких проблем в работе конвертера замечено не было.
Подробная инструкция по установке здесь.

Читайте также:  Из параметрического в общее уравнение прямой

После установки естественно сразу не заработало так, как надо. Проблема была в том, что русские шрифты отображались квадратиками. Проблема решилась установкой руских шрифтов.

Итак, конвертер установлен. Надо его проверить. Для проверки достаточно из консоли дать команду:

В текущем каталоге будет создан фаил с указанным именем. Проверяем, смотрим на ошибки, если есть. Ищем способы устранения и устраняем.

Далее нам надо интегрировать утилитку с нашим сайтом. Для этого требуется, что бы были разрешения на выполнение php команды exec.

Итак, разрешения есть, конвертер установлен и протестирован. Начинаем собственно интеграцию в наш сайт. У меня был сайт на системе управления Битрикс. Поскольку нужно выводить только содержимое страницы без шапки, подвала и всех менюшек, был создан скрипт, в котором подключалось только АПИ Битрикса и нужный мне компонент вывода каталога.

Строка подключения АПИ Битрикс без вывода шаблона:

Далее подключаем нужный нам компонент с требуемыми параметрами. Параметры можно передавать методом GET, то есть в строке запроса страницы.

Подготовив страницу вывода контента, готовим скрипт вызова нашего конвертера.
Конвертеру можно напрямую передавать адрес веб страницы из котрой будет генерится пдф. Так же есть множество различных параметров вызова для управления отображением страницы. В частности можно задать отступы от краев, содержание колонитулов и множество других параметров. Получить список всех параметров можно, вызвав конвертер из консоли с параметрами:
—manpage Выводит страницу мануала
—htmldoc Выводит страницу мануала в html формате
—readme Выводит readme

Мне нужно было использовать нижний колонтитул. Содержание колонтитула можно передавать в html виде.
Параметр ответственный за нижний колонтитул —footer-html. Значением этого параметра может быть адрес страницы с html содержимым.
Итого имеем примерно следующий php скрипт, который генерирует pdf фаил и отдает его браузеру на скачивание:

Читайте также:  Полное прохождение варкрафт 3

$cd = "cd ";
exec($cd);
$comand = "wkhtmltopdf —footer-html "http:// /catalog/$cat_ ;
exec($comand);
if (file_exists(" /catalog.pdf")) <
header(‘Content-type: application/pdf’);
header(‘Content-Disposition: attachment; filename="catalog.pdf"’);
readfile(‘ /catalog.pdf’);
>
unlink(" /catalog.pdf");

Описание скрипта по порядку:
1) задаем корневой каталог, куда свалится pdf. Делается на всякий случай, что бы потом не думать, почему не отдается фаил.
2) Формируем команду с различными параметрами. Параметры передаются методом GET. Получение параметров не описано, но оно так же сделано методом GET с фильтрацией входящих переменных, дабы не дать нехорошим людям реализовать их злые или не очень намерения.
3) Исполняем сформированную команду.
4) Проверяем, создался ли файлик и, выставив нужные заголовки, отдаем фаил браузеру.
5) Удаляем фаил.

Вот собственно простенький пример как генерировать pdf фаил из html, с полной поддержкой CSS. Да, у WebKit’a есть свои нюансы отображения, но о них известно и их можно легко учесть, чего не сделать, используя библиотеки генерации на базе php. В заметке была описана интеграция в сайт на системе управления Битрикс, точно таким же способом утилитка может использоваться на любом другом сайте, отличия будут заключаться только в скрипте вывода контента.

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.