13

我有一个 django 应用程序,该应用程序当前使用用户可以下载的画布生成 pdf。我创建了一个 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?

4

2 回答 2

23

您的错误实际上是一个非常简单的错误。这只是试图写错东西的问题。在您的代码中,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 的路径,但是如果您深入研究代码,您会发现这是可能的。

于 2011-02-22T00:41:53.380 回答
4

对于使用 python3 和 django 1.7+ 的人,需要对答案进行一些更改。

from django.shortcuts import HttpResponse
import io
from reportlab.platypus import SimpleDocTemplate, BaseDocTemplate

def view(request):
    buffer = io.BytesIO()

    doc = # ... create your SimpleDocTemplate / BaseDocTemplate
    # create the usual story
    story = []
    # ...
    doc.build(story)

    response = HttpResponse(content_type='application/pdf')
    response['Content-Disposition'] = 'attachment; filename=your_name.pdf'
    response.write(buffer.getvalue())
    buffer.close()

    return response
于 2019-05-16T08:25:46.110 回答