便携文档格式 (PDF) 是由 Adobe 开发的格式,主要用于呈现可打印的文档,其中包含有 pixel-perfect 格式,嵌入字体以及2D矢量图像。 You can think of a PDF document as the digital equivalent of a printed document; indeed, PDFs are often used in distributing documents for the purpose of printing them.

可以方便的使用 Python 和 Django 生成 PDF 文档需要归功于一个出色的开源库, ReportLab (http://www.reportlab.org/rl_toolkit.html) 。动态生成 PDF 文件的好处是在不同的情况下,如不同的用户或者不同的内容,可以按需生成不同的 PDF 文件。 The advantage of generating PDF files dynamically is that you can create customized PDFs for different purposes say, for different users or different pieces of content.

下面的例子是使用 Django 和 ReportLab 在 KUSports.com 上生成个性化的可打印的 NCAA 赛程表 (tournament brackets) 。

安装 ReportLab

在生成 PDF 文件之前,需要安装 ReportLab 库。这通常是个很简单的过程: Its usually simple: just download and install the library from http://www.reportlab.org/downloads.html.

Note

如果使用的是一些新的 Linux 发行版,则在安装前可以先检查包管理软件。 多数软件包仓库中都加入了 ReportLab 。

比如,如果使用(杰出的) Ubuntu 发行版,只需要简单的 apt-get install python-reportlab 一行命令即可完成安装。

使用手册(原始的只有 PDF 格式)可以从 http://www.reportlab.org/rsrc/userguide.pdf 下载,其中包含有一些其它的安装指南。

在 Python 交互环境中导入这个软件包以检查安装是否成功。

>>> import reportlab

如果刚才那条命令没有出现任何错误,则表明安装成功。

编写视图

和 CSV 类似,由 Django 动态生成 PDF 文件很简单,因为 ReportLab API 同样可以使用类似文件对象。

下面是一个 Hello World 的示例:

from reportlab.pdfgen import canvas

from django.http import HttpResponse

def hello_pdf(request):

# Create the HttpResponse object with the appropriate PDF headers.

response = HttpResponse(mimetype='application/pdf')

response['Content-Disposition'] = 'attachment; filename=hello.pdf'

# Create the PDF object, using the response object as its "file."

p = canvas.Canvas(response)

# 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()

return response

需要注意以下几点:

这里我们使用的 MIME 类型是 application/pdf 。这会告诉浏览器这个文档是一个 PDF 文档,而不是 HTML 文档。 如果忽略了这个参数,浏览器可能会把这个文件看成 HTML 文档,这会使浏览器的窗口中出现很奇怪的文字。 If you leave off this information, browsers will probably interpret the response as HTML, which will result in scary gobbledygook in the browser window.

使用 ReportLab 的 API 很简单: 只需要将 response 对象作为 canvas.Canvas 的第一个参数传入。

所有后续的 PDF 生成方法需要由 PDF 对象调用(在本例中是 p ),而不是 response 对象。

最后需要对 PDF 文件调用 showPage() 和 save() 方法(否则你会得到一个损坏的 PDF 文件)。

复杂的 PDF 文件

如果您在创建一个复杂的 PDF 文档(或者任何较大的数据块),请使用 cStringIO 库存放临时生成的 PDF 文件。 cStringIO 提供了一个用 C 编写的类似文件对象的接口,从而可以使系统的效率最高。

下面是使用 cStringIO 重写的 Hello World 例子:

from cStringIO import StringIO

from reportlab.pdfgen import canvas

from django.http import HttpResponse

def hello_pdf(request):

# Create the HttpResponse object with the appropriate PDF headers.

response = HttpResponse(mimetype='application/pdf')

response['Content-Disposition'] = 'attachment; filename=hello.pdf'

temp = StringIO()

# Create the PDF object, using the StringIO object as its "file."

p = canvas.Canvas(temp)

# 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.

p.showPage()

p.save()

# Get the value of the StringIO buffer and write it to the response.

response.write(temp.getvalue())

return response

其它的可能性

使用 Python 可以生成许多其它类型的内容,下面介绍的是一些其它的想法和一些可以用以实现它们的库。 Here are a few more ideas and some pointers to libraries you could use to implement them:

ZIP 文件 :Python 标准库中包含有 zipfile 模块,它可以读和写压缩的 ZIP 文件。 它可以用于按需生成一些文件的压缩包,或者在需要时压缩大的文档。 如果是 TAR 文件则可以使用标准库 tarfile 模块。

动态图片 : Python 图片处理库 (PIL; http://www.pythonware.com/products/pil/) 是极好的生成图片(PNG, JPEG, GIF 以及其它许多格式)的工具。 它可以用于自动为图片生成缩略图,将多张图片压缩到单独的框架中,或者是做基于 Web 的图片处理。

图表 : Python 有许多出色并且强大的图表库用以绘制图表,按需地图,表格等。 我们不可能将它们全部列出,所以下面列出的是个中的翘楚。

matplotlib (http://matplotlib.sourceforge.net/) 可以用于生成通常是由 matlab 或者 Mathematica 生成的高质量图表。

pygraphviz (https://networkx.lanl.gov/wiki/pygraphviz) 是一个 Graphviz 图形布局的工具 (http://graphviz.org/) 的 Python 接口,可以用于生成结构化的图表和网络。

总之,所有可以写文件的库都可以与 Django 同时使用。 The possibilities are immense.

我们已经了解了生成“非HTML”内容的基本知识,让我们进一步总结一下。 Django拥有很多用以生成各类“非HTML”内容的内置工具。

本文标题: 利用Python的Django框架生成PDF文件的教程

本文地址: http://www.cppcns.com/jiaoben/python/128483.html

python数据生成pdf_利用Python的Django框架生成PDF文件的教程相关推荐

  1. 用python做数据分析pdf_利用python进行数据分析pdf

    利用python进行数据分析pdf微盘下载!<利用python进行数据分析>利用Python实现数据密集型应用由浅入深帮助读者解决数据分析问题~适合刚刚接触Python的分析人员以及刚刚接 ...

  2. python数据预测_利用Python编写一个数据预测工具

    利用Python编写一个数据预测工具 发布时间:2020-11-07 17:12:20 来源:亿速云 阅读:96 这篇文章运用简单易懂的例子给大家介绍利用Python编写一个数据预测工具,内容非常详细 ...

  3. python的setting怎么找_Python的Django框架中settings文件的部署建议

    django在一个项目的目录结构划分方面缺乏必要的规范,因此不同人的项目组织形式也千奇百怪,而且也很难说谁的做法就比较好.我根据自己的项目组织习惯,发布了一个项目dj-scaffold. 前些天在re ...

  4. 数据可视化:利用Python和Echarts制作“用户消费行为分析”可视化大屏

    数据可视化:利用Python和Echarts制作"用户消费行为分析"可视化大屏 前言 实验目的: 准备工作: 一.创建项目: 二.建立数据库连接获取数据: 三.页面布局: 四.下载 ...

  5. 基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据

    基于BC95的数据转发,利用Python实现UDP接收数据,TCP转发数据 文章信息 环境信息 系统概览 基于Python的UDP(服务端)数据接收 1. UDP接受的数据如何读取 文章信息 撰写日期 ...

  6. Python数据分析学习系列 十三 Python建模库介绍

    Python数据分析学习系列 十三 Python建模库介绍 资料转自(GitHub地址):https://github.com/wesm/pydata-book 有需要的朋友可以自行去github下载 ...

  7. python新手怎么兼职-利用python兼职

    广告关闭 2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品.未来,我们一起乘风破浪,创造无限可能. 类似这种需求也在很多ppt兼职群(qq群搜索就可以查到)里能遇到,如果会 ...

  8. Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名、合并两个不同路径下图片文件名等目录/路径案例、正确加载图片路径)之详细攻略

    Python语言学习:利用python获取当前/上级/上上级目录路径(获取路径下的最后叶目录的文件名.合并两个不同路径下图片文件名等目录/路径案例.正确加载图片路径)之详细攻略 目录 利用python ...

  9. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法

    Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)-命令提示符cmd的几种方法 目录 利用python语言实现调用内部命令-命令提示符cmd的几种方法 T1. ...

  10. Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件

    Python之ffmpeg:利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 目录 利用python编程基于ffmpeg将m4a格式音频文件转为mp3格式文件 1.先下载ff ...

最新文章

  1. Scala 深入浅出实战经典 第88讲:Scala中使用For表达式实现map、flatMap、filter
  2. ssh免密登录配置(两行命令搞定)
  3. 构造函数的初始化列表
  4. java页面弹出窗口输出语句_jsp %%程序段里的catch语句里怎么弹出提示框?
  5. linux虚拟机上不了王,虚拟机上安装Linux时出现的问题及解决方法
  6. 《spring揭秘》读书笔记二
  7. boost::fusion::traits::is_view用法的测试程序
  8. zend framework1.12 没找到php.exe,请加一个zend framework的有关问题
  9. XAML 布局StackPanel
  10. 51nod 1414 冰雕 思路:暴力模拟题
  11. 31岁负债59万(房贷27万,私人借款32万),该怎么办?
  12. C++ vector使用的一些注意事项
  13. Elasticsearch修改字段之别名,扩展数据迁移
  14. MFC笔记(2)OnCtrlColor
  15. 500并发相当于多少人_linux开发技术之线程池accept处理高并发connect(含源码)
  16. IT 接口对接:足迹第十二步接口对接的定义(接口对接分三种:中间库方式的接口对接,Rest格式URL对接和HTTP格式URL对接;)
  17. php收银系统如何连接pos机,收银pos机怎么连接?
  18. Ubuntu18.04安装搜狗输入法不能 用的问题20211221
  19. 九宫格图片怎么操作?这里有你想要的方法
  20. Python中的arg,*args,**kwargs用法

热门文章

  1. 运用软件配置管理加强风险管理
  2. 关于数字签名驱动解决方法
  3. 电商数据分析的4大思维和8类指标
  4. 最新服务器处理器天梯,服务器cpu天梯图2020 至强处理器天梯排名
  5. 产品经理学习——卡诺模型
  6. spring整合kaptcha验证码
  7. c语言数组回文数编写字符串,回文数C语言(示例代码)
  8. 金蝶专业版怎么反过账当月_金蝶KIS专业版没有反过账功能,怎么反过账
  9. java sdk qq登录授权,springboot开发qq第三方授权登录(示例代码)
  10. Linux查看日志命令(汇总)