Конвертируем страницу HTML в PDF через PHP с помощью консольной утилиты wkhtmltopdf на примере Ubuntu
Столкнулся с тем, что надо было генерировать счет с заполненными полями и графикой в pdf.
Данная статья будет полезна только если у вас есть доступ к серверу и возможность ставить свои программы, либо есть возможность попросить сделать это у своего хостинг провайдера.
Решений на php достаточно много, но у всех есть свои недостатки. Кто-то не учитывает css, кто-то использует только один шрифт и многие другие неприятности.
Т.к. был полный доступ к серверу, решил присмотреться к консольным утилитам и нашел для себя wkhtmltopdf. Насколько я понимаю — данная утилита запускает указанную страницу через движок webkit и снимает слепок. Т.к. webkit это браузерный движок, то можно быть на 99% уверенным, что результат будет таким же, каким мы видим страницу в браузере.
Перейдем к установке.
В консоле (я использую putty, для подключения по ssh) устанавливаем саму утилиту
1 | sudo apt-get install wkhtmltopdf |
Утилита запускается такой командой
1 | wkhtmltopdf path_html path_pdf |
Где path_html — это адрес страницы, с которой мы хотим сгенерировать pdf. А path_pdf — это путь, куда будет сохранен сам pdf. Пробуем запустить для начала скрипт через консоль
1 | wkhtmltopdf http://google.com /var/www/testsite/test.pdf |
Для того, чтобы в linux ubuntu узнать путь к текущей директории, достаточно воспользоваться командой pwd. Чтобы в php узнать расположение текущего скрипта на сервере, достаточно обратиться к переменной $_SERVER[‘document_root’]. Т.е. если мы хотим разместить итоговый pdf в подпапке result текущей директории, то достаточно в скрипте cгенерировать такой путь:
1 | $reslink = $_SERVER['document_root'].'/result/res.pdf'; |
Однако, после запуска тестовой команды может возникнуть подобная ошибка:
1 | Cannot connect to X server |
Что означает, что нет соединения с X server, который отвечает за графическую оболочку. Чаще всего его не ставят на сервера. Но для этого есть тоже решение. Будем использовать утилиту xvfb. Для её установки прописываем
1 | sudo apt-get install xvfb |
Теперь мы можем использовать wkhtmltopdf через виртуальный дисплей.
1 | xvfb-run -a -s "-screen 0 1024x768x16" wkhtmltopdf http://google.com /var/www/testsite/test.pdf |
Проверим в консоли и посмотрим результат. Я использовал путь для экспорта /var/www/testsite, по нему у меня отвечает сайт localhost/testsite, соответственно результат я проверяю по адресу localhost/testsite/test.pdf.
Для использования утилиты в php, мы просто пишем в нужном места подобный код.
1 2 3 4 5 6 7 8 9 10 11 12 | <?php //ссылка источника для снятия снимка $srclink = "http://google.com" //куда будет сохранен pdf. Итоговое имя pdf можно генерировать самостоятельно // и делать уникальным. В данном примере укажем статическое имя $reslink = $_SERVER['document_root'].'/result/res.pdf'; //отправляем команду в консоль. Так же можно записать ответ в переменную //и распарсить результат shell_exec('xvfb-run -a -s "-screen 0 1024x768x16" wkhtmltopdf "'.$srclink.'" $reslink); ?> |
Комментарии к Конвертируем страницу HTML в PDF через PHP с помощью консольной утилиты wkhtmltopdf на примере Ubuntu (2)
adga
sudo apt-get install wkthmltopdf
ошибочка wkthmltopdf
Delfi Post author
Спасибо за замечание, исправил.