使用 Django 输出 PDF — Django 文档

来自菜鸟教程
Django/docs/2.2.x/howto/outputting-pdf
跳转至:导航、​搜索

利用 Django 输出 PDF

本文档解释了如何使用 Django 视图动态输出 PDF 文件。 这是由优秀的开源 ReportLab Python PDF 库实现的。

动态生成 PDF 文件的优势在于您可以为不同的目的创建自定义的 PDF——例如,为不同的用户或不同的内容。

例如,kusports.com 使用 Django 为参加 March Madness 比赛的人们生成定制的、打印友好的 NCAA 锦标赛支架,作为 PDF 文件。

安装 ReportLab

ReportLab 库 在 PyPI 上可用。 还可以下载 用户指南 (并非巧合,PDF 文件)。 您可以使用 pip 安装 ReportLab:

通过在 Python 交互式解释器中导入它来测试您的安装:

>>> import reportlab

如果该命令没有引发任何错误,则安装成功。


编写视图

使用 Django 动态生成 PDF 的关键是 ReportLab API 作用于类文件对象,而 Django 的 FileResponse 对象接受类文件对象。

这是一个“Hello World”示例:

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

def some_view(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)

    # Draw things on the PDF. Here's where the PDF generation happens.
    # See the ReportLab documentation for the full list of functionality.
    p.drawString(100, 100, "Hello world.")

    # Close the PDF object cleanly, and we're done.
    p.showPage()
    p.save()

    # FileResponse sets the Content-Disposition header so that browsers
    # present the option to save the file.
    buffer.seek(0)
    return FileResponse(buffer, as_attachment=True, filename='hello.pdf')

代码和注释应该是不言自明的,但是有几件事值得提一下:

  • 响应将根据文件扩展名自动设置 MIME 类型 application/pdf。 这告诉浏览器该文档是 PDF 文件,而不是 HTML 文件或通用的 application/octet-stream 二进制内容。
  • as_attachment=True 传递给 FileResponse 时,它会设置适当的 Content-Disposition 标头,并告诉 Web 浏览器弹出一个对话框,提示/确认如何处理文档,即使机器上设置了默认值。 如果省略 as_attachment 参数,浏览器将使用它们已配置为用于 PDF 的任何程序/插件处理 PDF。
  • 您可以提供任意 filename 参数。 浏览器将在“另存为...”对话框中使用它。
  • 连接到 ReportLab API 很容易:作为第一个参数传递给 canvas.Canvas 的相同缓冲区可以提供给 FileResponse 类。
  • 请注意,所有后续的 PDF 生成方法都是在 PDF 对象上调用的(在本例中为 p)——而不是在 buffer 上。
  • 最后,在 PDF 文件上调用 showPage()save() 很重要。

笔记

ReportLab 不是线程安全的。 我们的一些用户报告了构建 PDF 生成的 Django 视图的奇怪问题,这些视图可供多人同时访问。


其它格式

请注意,这些示例中没有很多特定于 PDF 的内容——只有使用 reportlab 的位。 您可以使用类似的技术生成任何可以找到 Python 库的任意格式。 另请参阅 使用 Django 输出 CSV 以获取另一个示例以及在生成基于文本的格式时可以使用的一些技术。

也可以看看

Django Packages 提供了包 比较,有助于从 Django 生成 PDF 文件。