Django分析之导出为PDF文件

最近在公司一直忙着做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的输入输出界面。

时间: 2024-08-10 19:16:58

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

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

程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter [cpp] view plain copy TextEditToPdf::TextEditToPdf(QWidget *parent, Qt::WFlags flags) : QDialog(parent, flags) { ui.setupUi(this); int ret = connect(ui.m_pExportBtn,SIGNAL(clicked()),this,SLOT(expo

文本导出到pdf文件

程序中数据导出是经常有的需求,今天学习把文本导出到pdf文件.主要是用QPrinter,QPainter TextEditToPdf::TextEditToPdf(QWidget *parent, Qt::WFlags flags) : QDialog(parent, flags) { ui.setupUi(this); int ret = connect(ui.m_pExportBtn,SIGNAL(clicked()),this,SLOT(exportSlot())); } TextEdit

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

将WEB页面直接导出为pdf文件是经常会用到的一个功能,尤其是各种报表系统.总结了一下目前几种主流的做法: 在后端用代码生成pdf文件,比如iText一类: 在后端抓取页面并生成pdf文件,比如phantomjs一类: 在前端用js直接生成pdf文件: 方案3的优势在于前端直接生成,所见即所得.今天要探索的就是html2canvas和jspdf,前者用于将页面元素render生成canvas,后者用于将canvas生成pdf文档.需要注意的是,这种方法对IE系列支持不好. html2canvas

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

1.maven依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.2</version> </dependency> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifac

集算报表应用开发之直接导出Excel/PDF文件

报表应用中有时报表只需生成指定文件,而无需在页面展现,生成的文件常见于Excel.PDF等.由于报表不展现,也就无需使用报表提供的tag,可以直接通过程序导出.集算报表提供了丰富的API,允许开发人员编写代码实现自己的业务逻辑.这里通过在servlet中导出Excel为例来看一下报表不展现而直接导出的实现方式. 定义导出Excel的servlet(ExportToExcel),主要代码如下:    1.接收参数 String report =request.getParameter("rpx&q

Java将Excel导出成pdf文件

首先下载一个jar包,需要用到这个jar包,这里贴出下载的方法,官网上可以找到. 首先,在pom.xml文件中配置Maven仓库路径. <repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>http://repo.e-iceblue.com/nexus/content/groups/public/</url>

ReportViewer 不预览,直接导出 PDF文件

作为笔记记着,以免以后再到处找资料 1. 在不预览的情况下导出文件 先看一个方法说明,想知道ReportViewer支持导出哪些文件类型,在Render方法说明中就有描述 // // Summary: // Processes the report and renders it in the specified format using a stream // provided by a callback function. // // Parameters: // format: // The

随心所欲导出你的 UI 界面到 PDF 文件

使用 C1PDF 控件可以导出文件到 PDF 文件,结合 .NET 平台特性你可以在任何客户端生成自定义报表.你可以打印任何 UI 界面,例如 DataGrid 导出到 PDF. 在本篇文章中我们将阐述在 XAML 平台中打印 UI 到 PDF 文件的通用方法. 打印 UI 界面到 PDF 文件,需要首先把 UI 界面导出到图片,然后把图片添加到 PDF 文件中.面让我们来进入实战部分. 导出UI到图片 UI导出到 PDF 文件,最简单明了的方法是把 UI 界面作为图片插入到 PDF 文件中.每

Java 实现 FusionCharts 图表导出图片或PDF文件功能

第一步:引入FusionCharts文件,使用的版本为:FusionCharts 3.2.1(额,共享版,你懂的,后续提供下载链接)支持正版,官网地址:http://www.fusioncharts.com/ 第二步:引入fcexporter.jar包(图片导出功能库),并在web.xml文件中配置以下代码 <servlet> <display-name>FCExporter</display-name> <servlet-name>FCExporter&l