13

ユーザーがダウンロードできるキャンバスを使用して現在pdfを生成するdjangoアプリがあります。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)

カモノハシと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 に答える