@Masha_Masha23

Как сгенерировать pdf из кастомного html (Django Templates), чтобы работало стабильно?

Продуктовая задача бытовым языком
Сделать в админке сайта на Django автоматический генератор красивых презентаций в pdf по шаблону с дизайном. Сценарий: юзер руками в админке собирает что-то вроде стратегии (последовательного набора определенных элементов), жмет кнопку "Сгенерировать презентацию" и у него(нее) скачивается файлик pdf с красивой презентацией, где в каждый слайд нужным образом раздаются разнообразные данные: тексты, цифры, даты, заголовки и так далее, а в начале и в конце - красивые слайды со статичным неизменяющимся текстом.

В презентации есть следующие элементы:
1. Нестандартный шрифт (подгружается файлом)
2. Фоновые изображения
3. Сложные css-стили
4. Своеобразная верстка (несколько колонок, выравнивание элементов относительно друг друга, что-то типа инфографики в виде таймлайна/диаграммы Ганнта)
5. Кликабельные ссылки на внешние сайты, которые формируются по определенному макросу.

Пробуем сделать функционал через wkhtmltopdf + pdfkit, но возникают сложности: расходится генерация на локалке и продакшене, иногда генерация ломается. Плюс эти библиотеки не поддерживают все нужные нам css-свойства, т.е. ее возможностей не хватает для наших задач. Хотя дизайн шаблона абсолютно не космический, скорее базовый.

Что пробовали
Отказались от pypdf и xhtml2pdf из-за ограничености стилей.

Есть ли более стабильное решение с поддержкой css3 и html5? И вообще, что посоветуете?

Наш стек - python3.9 + Django 3.
  • Вопрос задан
  • 250 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Everything_is_bad
Генерация pdf боль, а нормального конвертера из html я вообще не видел, в итоге проще всего оказалось сделать генерацию через pdfmake на js, по факту потребуется переделать свои шаблоны в описание на json, а от "Сложные css-стили" скорее придется отказаться. Либо отрисовывайте на более низком уровне тем же ReportLab
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
Selenium
https://copyprogramming.com/howto/python-selenium-...

тоже с сзъянами, ну а как... иначе весь стек под себя - никаких прогеров и денег не хватит
Ответ написан
ThunderCat
@ThunderCat Куратор тега CSS
{PHP, MySql, HTML, JS, CSS} developer
1) Берем хеадлесс хром
2) скармливаем ему хтмл на печать в пдф с сохранением в файл
3) Готовый файл отдаем пользователю
3) Профит, все красиво, зайчики, графики, картинки...

При этом для отладки достаточно в хроме нажать ctrl+p и сразу увидеть где косяки с разметкой, как оно выглядит и вообще...

Нюансы:
1) хтмл должен быть заточен под вывод на печать, цсс для принт медиа специфичен, но не особо сложен
2) Для серверного хорма цсс/жс/картинки должны содержать полный локальный путь до файла
3) Есть некоторый нюанс с яваскриптами, работающими "не мгновенно", иногда надо поиграться с задержкой, там в параметрах оно настраивается.
Пример
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы