2014-11-18 4 views
6

Es gibt viele verschiedene Möglichkeiten PDFs von einer Django Webseite in Python2 zu erzeugen. Am saubersten ist wahrscheinlich Pisa und Reportlab. Diese funktionieren jedoch nicht für python3.Python3 Django -> HTML zu PDF

Bisher war die einzige Methode, mit der ich Erfolg hatte, die Vorlage zu rendern, in eine Datei zu schreiben und dann wkhtmltopdf über subprocess.popen zu verwenden. Das funktioniert zwar, aber es lädt keine statischen Dateien wie CSS und Bilder.

Gibt es geeignete Lösungen? Kann wkhtmltopdf meine statischen Dateien von der Kommandozeile lesen, oder gibt es eine Bibliothek wie pisa/reportlab, die python3 unterstützt?

Ich habe nicht in der Lage gewesen finde eine solche Bibliothek

Antwort

9

Sie Weasyprint nutzen könnten. Sie könnten einfach direkt rendern.

Man könnte so etwas tun:

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

Um Ihren Django Blick auf HTML zu machen, könnten Sie einfach die Tastenkombination render_to_string(self.template_name, context, context_instance=RequestContext(self.request))

bewusst sein, bei der Verwendung von diesem mit einem Synchron-Webserver/WSGI Server ALLE Anfragen werden blockiert, bis die PDF gerendert wird. Ziehen Sie in Betracht, einen ASYNC Worker zu verwenden.

+0

Vielen Dank dafür! Es ist in keiner meiner Suchen aufgetaucht, aber es funktioniert perfekt. Die Installation erforderte ein wenig Aufwand, da es eine Handvoll von Nicht-Python-Bibliotheken benötigt, aber ich habe es geschafft. Thanks a bundle – Eldamir

+0

Ich habe versucht, Weasyprint zu verwenden, und es funktioniert mit Python3, aber es verbraucht viel Speicher - es dauert 500M, um PDF aus weniger als 1M HTML zu generieren. – asafm

-1

wkhtmltopdf erfordert

  • CSS
  • statische Dateien inlined werden lokal auf dem Server
  • statische Datei Urls sein os Wege zu sein, zum Beispiel: /home/ubuntu/project/project/static/file_name
1

Ich sah in Weasyprint, wkhtmltopdf und sogar LaTeX, aber alle haben externe binäre Abhängigkeiten, die schwer zu Diensten wie Heroku zu implementieren sind.

Die beste Kombination, die ich bisher gefunden habe und die in Django auf Python 3 funktioniert, ist Reportlab (funktioniert jetzt auf Python 3) + xhtml2pdf. xhtml2pdf erst vor kurzem Beta Python 3-Unterstützung hinzugefügt, so dass Sie es mit installieren müssen:

pip install --pre xhtml2pdf 

Wenn Sie diese beiden installiert haben, können Sie entweder xhtml2pdf direkt oder installieren Sie das django-easy-pdf-Paket, das eine TemplateView von erben bietet und eine Beispiel Basisvorlage & Styling für den schnellen Einstieg. Folgen Sie ihren Schnellstartanleitung und Sie können schnell so etwas wie eine Detailansicht vorbereiten, die in PDF macht wie:

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 

Und in Ihrem urls.py Sie so etwas wie hinzufügen würde:

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