Конвертируем страницу HTML в PDF через PHP с помощью консольной утилиты wkhtmltopdf на примере Ubuntu

Столкнулся с тем, что надо было генерировать счет с заполненными полями и графикой в pdf.

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

Решений на php достаточно много, но у всех есть свои недостатки. Кто-то не учитывает css, кто-то использует только один шрифт и многие другие неприятности.

Т.к. был полный доступ к серверу, решил присмотреться к консольным утилитам и нашел для себя wkhtmltopdf. Насколько я понимаю — данная утилита запускает указанную страницу через движок webkit и снимает слепок. Т.к. webkit это браузерный движок, то можно быть на 99% уверенным, что результат будет таким же, каким мы видим страницу в браузере.

Перейдем к установке.

В консоле (я использую putty, для подключения по ssh) устанавливаем саму утилиту

Утилита запускается такой командой

Где path_html — это адрес страницы, с которой мы хотим сгенерировать pdf. А path_pdf — это путь, куда будет сохранен сам pdf. Пробуем запустить для начала скрипт через консоль

Для того, чтобы в linux ubuntu узнать путь  к текущей директории, достаточно воспользоваться командой pwd. Чтобы в php узнать расположение текущего скрипта на сервере, достаточно обратиться к переменной $_SERVER[‘document_root’]. Т.е. если мы хотим разместить итоговый pdf в подпапке result текущей директории, то достаточно в скрипте cгенерировать такой путь:

Однако, после запуска тестовой команды может возникнуть подобная ошибка:

Что означает, что нет соединения с X server, который отвечает за графическую оболочку. Чаще всего его не ставят на сервера. Но для этого есть тоже решение. Будем использовать утилиту xvfb. Для её установки прописываем

Теперь мы можем использовать wkhtmltopdf через виртуальный дисплей.

Проверим в консоли и посмотрим результат. Я использовал путь для экспорта /var/www/testsite, по нему у меня отвечает сайт localhost/testsite, соответственно результат я проверяю по адресу localhost/testsite/test.pdf.

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

 


  • adga

    sudo apt-get install wkthmltopdf
    ошибочка wkthmltopdf

    • Delfi

      Спасибо за замечание, исправил.