我有一个django应用程序,目前使用用户可以下载的画布生成pdfs。我创建一个StringIO缓冲区,做一些事情,然后发送调用response.write。
# 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)
我现在想用platypus和SimpleDocTemplate构建我的pdf并编写了这个
# 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
但这不起作用,它会创建一个无法打开的错误pdf。我认为这行
response.write(menu_pdf)
不正确。
如何呈现pdf?
答案 0 :(得分:20)
您的错误实际上非常简单。这只是试图写出错误的事情。在您的代码中,menu_pdf
不是PDF,而是SimpleDocTemplate
,PDF已存储在pdf_name
中,虽然我怀疑pdf_name
是路径名而不是一个文件对象。要修复它,请更改代码以使用原始代码中的内存文件:
# Set up response
response = HttpResponse(mimetype='application/pdf')
pdf_name = "menu-%s.pdf" % str(menu_id)
response['Content-Disposition'] = 'attachment; filename=%s' % pdf_name
buff = StringIO()
menu_pdf = SimpleDocTemplate(buff, 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(buff.getvalue())
buff.close()
return response
我不确定在文档中是否提到使用文件对象而不是使用Platypus的路径,但是如果你深入研究代码,你会发现它是可能的。
答案 1 :(得分:0)
对于使用python3和django 1.7+的人,需要对答案进行一些更改。
{run_time}