2014-11-18 1 views
6

Существует много разных способов генерации PDF-файлов с веб-страницы django в python2. Самым чистым, наверное, является пиза и reportlab. Это не работает для python3.Python3 Django -> HTML to PDF

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

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

Я не был в состоянии Finde такую ​​библиотеку

ответ

9

Вы можете использовать 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.

+0

Благодарим Вас за это! Он не отображался ни в одном из моих поисков, но он отлично работает. Для его установки потребовалось немало усилий, так как ему нужно несколько библиотек, отличных от python, но мне это удалось. Спасибо, куча – Eldamir

+0

Я попытался использовать Weasyprint, и он работает с Python3, но он потребляет много памяти - требуется 500 М для создания PDF-файлов с менее 1M html. – asafm

-1

wkhtmltopdf требует

  • CSS быть встраиваемыми
  • статические файлы локально присутствуют на сервере
  • статические адреса файлов быть OS пути, например: /home/ubuntu/project/project/static/file_name
1

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

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

pip install --pre xhtml2pdf 

Если эти две установки, вы можете использовать либо xhtml2pdf непосредственно или установить django-easy-pdf пакет, который обеспечивает TemplateView наследовать и пример базового шаблона & стилизации, чтобы вы начали быстро. Следуйте их указаниям QuickStart, и вы можете быстро приготовить что-то вроде точки зрения детализации, что делает в формате 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')