Конвертировать HTML в PDF Python / Django на платформе Unix - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над функционалом, в котором мне нужно конвертировать огромный HTML-файл (размером более 1 МБ) в PDF. Я попробовал ниже две библиотеки Python с открытым исходным кодом. 1. Xhtml2pdf (Пиза) 2. Weasyprint

Но ни одна из них не решает мою проблему, поскольку на создание файла PDF размером 1 МБ (около 500 страниц) уходит около 4-5 минут, в результате чего рабочий процесс моего сервера приложений (Gunicorn и Nginx) отключается и выдает сообщение «ОШИБКА ВРЕМЕННОГО ВРЕМЕНИ» в браузере. Загрузка ЦП также увеличивается до 100% во время преобразования PDF.

Если у кого-то есть идеи, какой API / библиотека лучше всего подойдет для больших HTML-файлов.

Ответы [ 2 ]

0 голосов
/ 29 июня 2018

Создание PDF-файла на 500 страниц займет время, независимо от используемой вами технологии, поэтому решение состоит в том, чтобы отправить задание в очередь асинхронных задач (celery, huey, django-queue, ...), в конечном итоге с некоторым опросом, чтобы показать индикатор. Даже если вам удастся оптимизировать дерьмо из процесса генерации, ВСЕ ЕЩЕ займет слишком много времени, чтобы вписаться в цикл запроса / ответа HTTP (из POV пользователя по крайней мере даже одна минута уже слишком длинная)

Примечание: нет ничего удивительного в том, что максимальная загрузка вашего ЦП - генерация огромного PDF-файла не только требует времени, но и требует больших вычислительных ресурсов и легко потребляет вашу память. Это само по себе является еще одной причиной для использования распределенной очереди задач, чтобы вы могли запустить процесс на отдельном узле и избежать уничтожения вашего переднего сервера).

0 голосов
/ 29 июня 2018

Это всего лишь предположение, я никогда не использовал его, но нашел ответ: C ++ Библиотека для преобразования HTML в PDF? И, насколько я знаю, есть Cython, который можно использовать для объединения C / C ++ и Python. Возможно, это ускорит процесс.

В противном случае вам нужно будет либо разбить его на маленькие кусочки и объединить их, либо сделать что-то с параметром timeout внутри классов, которые за это отвечают, но это нужно сделать с обеих сторон - сервера и клиента. Но я думаю, вам нужно будет рассчитать его динамически в зависимости от размера файла и необходимого времени, и это не будет для меня лучшим решением, но на всякий случай ...

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