Python — HTML в PDF
Для одного из проектов мне потребовалось реализовать автоматическое создание отчётов в формате PDF.
Сначала я думал создавать PDF с помощью Python. Но посмотрев, какой это геморрой, решил пойти по более простому пути – сначала генерировать HTML, а потом его конвертировать в PDF.
Оказалось, что это тоже не просто. Во-первых, требуется движок для создания PDF, который устанавливается в систему. Во-вторых, HTML страница должна быть свёрстана старыми добрыми таблицами – никаких тебе гридов и флексов.
В итоге, мне понравилось решение с wkhtmltopdf
и pdfkit
.
wkhtmltopdf
– это приложение с открытым исходным кодом, который преобразует HTML в PDF с помощью движка рендеринга Qt WebKit.
pdfkit
– Python-библиотека для работы с wkhtmltopdf
.
Установка wkhtmltopdf
Windows
Скачать дистрибутив с официального сайта и установить.
Ubuntu
sudo apt-get install wkhtmltopdf
macOS
brew install --cask wkhtmltopdf
Установка pdfkit
Активируем виртуальное окружение проекта на Python и устанавливаем с помощью pip:
pip install pdfkit
Python-скрипт
Так как разрабатываю скрипт я на Windows, а работать он будет на сервере, то добавил настройки для каждой платформы в pdfkit.configuration
. Это требуется для того, чтобы скрипт понимал, откуда брать wkhtmltopdf
.
Также я не стал вставлять стили в текст HTML, как например при вёрстке email-писем, а вынес их в отдельный файл css/style.css и также указал к нему путь.
import pdfkit
import platform
def convert_html_to_pdf(html, css_path, pdf_path):
try:
os_platform = platform.system()
pdfkit_path = r"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe"
if "Linux" == os_platform:
pdfkit_path = "/usr/bin/wkhtmltopdf"
config = pdfkit.configuration(wkhtmltopdf=pdfkit_path)
pdfkit.from_string(html, pdf_path, configuration=config, css=css_path)
print('convert_html_to_pdf: ok')
return pdf_path
except Exception as err:
return err
def main():
with open('report.html', 'r', encoding='utf-8') as file:
html = file.read()
convert_html_to_pdf(html, 'css/style.css', 'report.pdf')
if __name__ == '__main__':
main()
Пример настройки пути для файла на Ubuntu
- Открыть файл с помощью текстового редактора, например: nano ~/.bashrc.
- Добавить в конец файла строку: export PATH=”/usr/bin:$PATH”.
- Сохранить и закрыть файл, затем запустить команду: source ~/.bashrc.
Чтобы проверить настройку, нужно в терминале ввести команду:
wkhtmltopdf --version
Если всё настроено правильно, то отобразится версия установленного wkhtmltopdf.