Python3 Django -> HTML для PDF

Существует много разных способов генерации PDF-файлов с веб-страницы django в python2. Самым чистым, наверное, является пиза и reportlab. Однако они не работают для python3.

До сих пор единственным способом, с которым я имел успех, является рендеринг шаблона, запись его в файл, а затем использование wkhtmltopdf через subprocess.popen. Это работает хорошо, но он не загружает ни один из моих статических файлов, таких как css и изображения.

Есть ли правильные решения? Может ли wkhtmltopdf читать мои статические файлы из командной строки, в некотором роде, или есть библиотека, такая как pisa / reportlab, которая поддерживает python3?

Мне не удалось найти такую ​​библиотеку

Вы можете использовать Weasyprint . Вы можете легко визуализировать напрямую.

Вы могли бы сделать что-то вроде этого:

html = HTML(string=htmlstring) main_doc = html.render() pdf = main_doc.write_pdf() return HttpResponse(pdf, content_type='application/pdf') 

Чтобы отобразить представление Django в HTML, вы можете просто использовать ярлык render_to_string(self.template_name, context, context_instance=RequestContext(self.request))

Помните, что при использовании этого с сервером синхронного веб-сервера / WSGI ВСЕ запросы будут заблокированы до тех пор, пока не будет рендеринга PDF. Поэтому рассмотрите возможность использования ASYNC Worker.

Я просмотрел Weasyprint, wkhtmltopdf и даже LaTeX, но у всех есть внешние двоичные зависимости, которые трудно развернуть для таких сервисов, как Heroku.

Лучшая комбинация, которую я нашел до сих пор, которая работает в Django на Python 3, использует Reportlab (теперь работает на Python 3) + xhtml2pdf . xhtml2pdf только недавно добавила поддержку бета-версии Python 3, поэтому вам нужно установить ее с помощью:

 pip install --pre xhtml2pdf 

Если у вас установлены эти два, вы можете напрямую использовать xhtml2pdf или установить пакет django-easy-pdf , который предоставляет наследование шаблона TemplateView и примерный шаблон шаблона и стиль, чтобы вы начали быстро. Следуйте их инструкциям быстрого запуска, и вы можете быстро подготовить что-то вроде подробного представления, которое отображает PDF так:

 class InvoicePDFView(PDFTemplateView): template_name = "invoice_pdf.html" def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) myinstance = get_object_or_404(MyModel, pk=context['pk']) context['myinstance'] = myinstance return context 

И в вашем urls.py вы добавите что-то вроде:

 url(r'invoice/(?P<pk>[^/]+)/$', InvoicePDFView.as_view(), name='invoice') 

Требуется wkhtmltopdf

  • CSS должен быть встроен
  • статические файлы для локального присутствия на сервере
  • статические URL-адреса файлов – это пути os, например: /home/ubuntu/project/project/static/file_name