【问题标题】:django PDF FileResponse "Failed to load PDF document."django PDF FileResponse“加载 PDF 文档失败。”
【发布时间】:2019-05-31 15:48:55
【问题描述】:

我正在尝试从 django 视图生成和输出 PDF。我按照django documentation using ReportLab 中的示例进行操作,但下载的 PDF 无法在任何 PDF 阅读器中打开。

我使用 Python 3.7.0、Django==2.1.3、reportlab==3.5.12。我尝试将content_type="application/pdf" 添加到“FileResponse”,但仍然遇到同样的问题。

import io
from django.http import FileResponse
from reportlab.pdfgen import canvas

def printPDF(request):
    # Create a file-like buffer to receive PDF data.
    buffer = io.BytesIO()

    # Create the PDF object, using the buffer as its "file."
    p = canvas.Canvas(buffer)


    p.drawString(100, 100, "Hello world.")


    p.showPage()
    p.save()

    return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

生成的 PDF 应该可以在所有 PDF 阅读器中打开。但我收到“无法加载 PDF 文档”。

【问题讨论】:

    标签: django pdf-generation reportlab


    【解决方案1】:

    buffer = BytesIO() 用于代替文件来存储 pdf 文档。在使用 FileResponse 返回之前,您需要将流位置重置为其开始:

    buffer.seek(io.SEEK_SET)
    

    现在 pdf 下载应该可以正常工作了。

    【讨论】:

    • 或者更简单地说,buffer.seek(0)
    【解决方案2】:

    BytesIOFileResponse 的交互似乎有些可疑。以下对我有用。

    def printPDF(request):
        response = HttpResponse(content_type='application/pdf')
        response['Content-Disposition'] = 'attachment; filename=hello.pdf'
        p = canvas.Canvas(response)
        p.drawString(100, 100, "Hello world.")
        p.showPage()
        p.save()
        return response
    

    【讨论】:

    • 似乎是一个错误。我最终使用了xhtml2pdf
    • 我刚刚遇到github.com/unbit/uwsgi/issues/1126,这是一个突出的 uwsgi/Python 3/BytesIO 漏洞近 4 年。
    猜你喜欢
    • 2015-07-09
    • 2014-06-05
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2011-08-05
    • 2018-05-24
    • 2016-04-09
    • 1970-01-01
    相关资源
    最近更新 更多