最近在公司一直忙着做exe安装包,以及为程序添加新功能,好久没有继续来写关于Django的东西了….难得这个周末清闲,来了解了解Django的一些小功能也是极好的了~

那今天就来看看在Django的视图中将页面导出为pdf格式的功能吧。那么动态生成pdf的好处是什么呢?你可以为不同目的的用户创建定制的pdf。那么是如何实现的呢?它使用的是Python开源的pdf库---ReportLab

安装ReportLab

你可以从http://www.reportlab.com/software/opensource/rl-toolkit/download/下载安装ReportLab库,有个用户指南来解释如何安装它,或者你也可以使用pip来安装。

sudo pip install reportlab

测试你是否成功安装好了ReportLab

>>> import reportlab

如果这个命令没有报任何错误的话就说明ReportLab已经成功安装好了。

Django动态生成pdf的关键是ReportLab关于文件的API接口,APi接口是文件对象,而Django的HttpResponse对象也是文件对象,这就相通了。

那我们就来一个“Hello World”的例子:

from reportlab.pdfgen import canvas
from django.http import HttpResponse def some_view(request):
# Create the HttpResponse object with the appropriate PDF headers.
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="somefilename.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

这里response得到一个特殊的MIME类型  'application/pdf’这个标示告诉浏览器这是一个PDF文件,而非一个HTML文件,如果你不这样的话浏览器会解释输出为HTML的文件格式,这样会导致在窗口展示十分的丑陋。

同时,response会得到一个额外的内容,这其中包括了PDF文件的名称,当然这个文件名是任意的,你可以使用浏览器的另存为来给它取任何的名字。这这个例子中紧接着会弹出对话框来确认如何处理文档。最后最重要的是使用showPage()方法和save()方法来保存导出的PDf文件了。

注意:ReportLab是非线程安全的。

那现在我们来看看复杂的PDF文件,如果你要用ReportLab创建一个复杂的PDF文档,那就要考虑使用IO类来辅助作为一个临时的中转了,这个库提供了一个十分有效的文件类的对象接口,下面我们就来重写上面那个“Hello World”:

from io import BytesIO
from reportlab.pdfgen import canvas
from django.http import HttpResponse def some_view(request):
# Create the HttpResponse object with the appropriate PDF headers.
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"' buffer = BytesIO() # Create the PDF object, using the BytesIO object 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.
p.showPage()
p.save() # Get the value of the BytesIO buffer and write it to the response.
pdf = buffer.getvalue()
buffer.close()
response.write(pdf)
return response

当然,除了ReportLab库之外还有很多优秀的Python第三方库,例如:

PDFlib:是Django绑定了另外一个Python库,还有诸如“XHTML2PDF”库,还有就是使用“HTMLdoc”,它是一个将HTML转成PDF的命令行,但是它没有接口,只能使用Python的输入输出界面。

Django分析之导出为PDF文件的更多相关文章

  1. 把页面上的图表导出为pdf文件,分享一种请求下载文件的方法

    最近客户提出一个需求,就是把页面上的图表导出为pdf文件. 找了很多资料.终于有了点头绪.最主要是参考了HighCharts的做法.http://www.hcharts.cn/ 实现原理:把页面图表的 ...

  2. Studio for Winforms FlexGrid:导出到 PDF 文件

    本篇文章主要介绍如何导出 FlexGrid 到 PDF 格式文件.本文源于论坛用户,有多个用户提出如何把 FlexGrid 导出到 PDF 文件的需求.在这里共享给大家. 当前,ComponentOn ...

  3. 文本导出到pdf文件

    程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Q ...

  4. 文本导出到pdf文件(使用QPrinter和QPainter和QTextDocument)

    程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Q ...

  5. 页面直接导出为PDF文件,支持分页与页边距

    将WEB页面直接导出为pdf文件是经常会用到的一个功能,尤其是各种报表系统.总结了一下目前几种主流的做法: 在后端用代码生成pdf文件,比如iText一类: 在后端抓取页面并生成pdf文件,比如pha ...

  6. freemarket+itext+springboot将html静态页面渲染后导出为pdf文件

    1.maven依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf& ...

  7. 导出文本pdf文件

    出口手续往往是一些数据需求,学习文本导出到今天pdf文件.主要用于QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Qt: ...

  8. 【php导出pdf文件】php将html 导出成pdf文件(MPDF60),支持完美分页,注意是完美!!

    1.使用 MPDF60 包 2.防止中文乱码:修改MPDF/MPDF60/config.php中 $this->autoLangToFont = true; $this->autoScri ...

  9. Vue 页面导出成PDF文件

    注意事项 如果导出的页面中设计到图片或者其他文件跨域文件,需要后端服务配合 安装依赖 npm install html2Canvas --save npm install jspdf--save 封装 ...

随机推荐

  1. 获取centos6.5系统信息脚本

    最近想尝试做两件比较重要的事情,第一是用python写个cmdb,第二还是用python写个小型监控系统,下面是获取系统信息的脚本: #!/usr/bin/env python # coding:ut ...

  2. Html:form表单

    1:onsubmit 事件:会在表单中的确认按钮被点击时发生. <form action="" method="post" name="form ...

  3. C++项目中的extern "C" {}

    from:http://www.cnblogs.com/skynet/archive/2010/07/10/1774964.html C++项目中的extern "C" {} 20 ...

  4. 清北学堂模拟赛day7 错排问题

    /* 考虑一下已经放回m本书的情况,已经有书的格子不要管他,考虑没有书的格子,不考虑错排有(n-m)!种,在逐步考虑有放回原来位置的情况,已经放出去和已经被占好的格子,不用考虑,剩下全都考虑,设t=x ...

  5. php魔术方法和魔术常量

    1.__construct() 实例化对象时被调用, 当__construct和以类名为函数名的函数同时存在时,__construct将被调用,另一个不被调用. 2.__destruct() 当删除一 ...

  6. Newton's method 分析

    大家都知道对于合理的函数和合理的值域牛顿迭代法是二次收敛(quadratic covergence)的(收敛速度定义见 https://en.wikipedia.org/wiki/Rate_of_co ...

  7. jQuery视差滚动插件,(附原理分析,调用方法)

    演示地址:http://www.jq22.com/jquery-info1799 jquery插件,使用验证过可用. 分析源代码后总结原理:设置background样式为fixed,判断浏览器滚动距离 ...

  8. display_inline-block_table-cell

    1.display:inline-block; 兼容性:兼容到IE7+,Chrome,Firefox html: <ul class="list"> <li> ...

  9. HDU 4859 海岸线(最大流最小割)

    难得的中文题,就不翻译了. 输入第一行为T,表示有T组测试数据.每组数据以两个整数N和M开始,表示地图的规模.接下来的N行,每一行包含一个长度为M的字符串,表示地图,‘.’表示陆地,’E’表示浅海域, ...

  10. HDU 3879 Base Station(最大权闭合子图)

    经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法. 题意:输入n个点,m条边的无向图.点权为负,边权为正,点权为代价,边权为获益,输出最 ...