How to create PDF files
动态生成 PDF 文件的优点是你可以为不同的目的创建不同的自定义 PDF——例如,为不同的用户或内容的不同片段生成 PDF。
例如,kusports.com 用 Django 将自定义的,打印友好的 NCAA 锦标赛树状图生成 PDF 文件,发放给参加三月疯狂竞赛的人。
ReportLab 库可从 获取。也可以下载 用户指南 (一份 PDF 文件,这不是巧合)。你可以用 安装 ReportLab:
Linux/macOS Windows
若该命令未抛出任何错误,安装成功。
利用 Django 动态生成 PDF 的关键是 ReportLab API 作用于类文件对象,而 Django 的 对象接收类文件对象。
这有个 “Hello World” 示例:
代码和注释应该是不言自明的,但是有几件事值得提一下:
- 响应会自动基于文件扩展名将 MIME 类型设置为应用程序 application/pdf。这告诉浏览器该文档是个 PDF 文件,而不是 HTML 文件或普通的应用程序 application/octet-stream 二进制内容。
- When
as_attachment=True
is passed toFileResponse
, it sets the appropriateContent-Disposition
header and that tells web browsers to pop-up a dialog box prompting/confirming how to handle the document even if a default is set on the machine. If the parameter is omitted, browsers will handle the PDF using whatever program/plugin they’ve been configured to use for PDFs. - 你可以作为第一个参数传递给
canvas.Canvas
的缓冲区也能传递给类 FileResponse 类来使用 ReportLab API。 - 注意,所有后续生成 PDF 的方法都是在 PDF 对象上调用的(本例中是
p
)——而不是在 上调用。
ReportLab 不是线程安全的。某些用户已经报告了一些奇怪的 issue,在创建用于生成 PDF 的 Django 视图时,这些视图被多个用户同时访问会出现问题。
注意,这些例子中没有任何 PDF 特有的数据——只有使用 reportlab
的部分。你可以用类似的技巧生成任意格式,只要你能找到对应的 Python 库。也请看看 ,看看另一个例子中,如何用一些技巧输出文本内容。
参见
Django 包提供了一个 包的比较 有助于用 Django 生成 PDF 文件。