Rendern einer ReportLab pdf-gebaut aus SimpleDocTemplate
Habe ich eine bekam eine django-app, die derzeit erzeugt pdfs mit einer Leinwand, die der Benutzer herunterladen kann. Ich erstelle ein StringIO-buffer, tun einige Sachen und senden Sie dann rufen Antwort.schreiben.
# Set up response
response = HttpResponse(mimetype='application/pdf')
response['Content-Disposition'] = 'attachment; filename=menu-%s.pdf' % str(menu_id)
# buffer
buff = StringIO()
# Create the pdf object
p = canvas.Canvas(buff)
# Add some elements... then
p.showPage()
p.save()
# Get the pdf from the buffer and return the response
pdf = buff.getvalue()
buff.close()
response.write(pdf)
Will ich jetzt bauen meine pdf-Datei mit der platypus und SimpleDocTemplate und geschrieben haben, dies
# Set up response
response = HttpResponse(mimetype='application/pdf')
pdf_name = "menu-%s.pdf" % str(menu_id)
response['Content-Disposition'] = 'attachment; filename=%s' % pdf_name
menu_pdf = SimpleDocTemplate(pdf_name, rightMargin=72,
leftMargin=72, topMargin=72, bottomMargin=18)
# container for pdf elements
elements = []
styles=getSampleStyleSheet()
styles.add(ParagraphStyle(name='centered', alignment=TA_CENTER))
# Add the content as before then...
menu_pdf.build(elements)
response.write(menu_pdf)
return response
Aber das funktioniert nicht, es erstellt eine schlechte pdf-Datei, die nicht geöffnet werden kann. Ich nehme an, der line
response.write(menu_pdf)
ist falsch.
Wie kann ich das Rendern der pdf-Datei?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Fehler ist eigentlich ziemlich einfach. Es ist nur eine Frage der versucht, zu schreiben das falsche. In Ihrem code
menu_pdf
ist nicht ein PDF, sondern eineSimpleDocTemplate
, und die PDF-Datei gespeichert wurde inpdf_name
, obwohl ich hier vermutepdf_name
ist ein Pfad-Namen, anstatt einem file-Objekt. Um es zu beheben, ändern Sie Ihren code so verwenden Sie eine gespeicherte Datei wie in deinem ursprünglichen code:Ich bin mir nicht sicher, ob die Verwendung der Datei-Objekte, anstatt die Wege mit Platypus ist in der Dokumentation erwähnt, aber wenn Sie Graben sich in den code sehen Sie, dass es möglich ist.
Für Menschen, die das arbeiten mit Python ist3 und django 1.7+ einige änderungen zu der Antwort, die getan werden müssen.