可以通过开源的Python PDF库ReportLab来实现PDF文件的动态生成。

一、安装ReportLab

ReportLab库在PyPI上提供,可以使用pip来安装:

$ pip install reportlab

在Python交互解释器中导入它来测试安装:

>>> import reportlab

如果没有抛出任何错误,证明已安装成功。

二、编写视图

ReportLab的API可以处理于类似于文件(file-like)的对象。下面是一个 “Hello World”的例子:

from reportlab.pdfgen import canvas
from django.http import HttpResponse def some_view(request):
# 创建带有PDF头部定义的HttpResponse对象
response = HttpResponse(content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename="somefilename.pdf"' # 创建一个PDF对象,并使用响应对象作为它要处理的‘文件’
p = canvas.Canvas(response) # 通过PDF对象的drawString方法,写入一条信息。具体参考模块的官方文档说明。
p.drawString(100, 100, "Hello world.") # 关闭PDF对象
p.showPage()
p.save()
return response

相关说明:

  • 响应对象的MIME类型为application/pdf。 这会告诉浏览器,文档是个PDF文件而不是HTML文件。
  • 响应对象设置了附加的Content-Disposition协议头,含有PDF文件的名称。
  • 文件名可以是任意的,浏览器会在“另存为...”对话框等中使用。
  • Content-Disposition以'attachment'开头,强制让浏览器弹出对话框来提示或者确认。
  • Canvas函数接受一个类似于文件的对象,而HttpResponse对象正好合适。
  • 最后,在PDF文件上调用showPage()和save()方法非常重要。
  • 注意:ReportLab并不是线程安全的。

三、复杂的PDF

使用ReportLab创建复杂的PDF文档时,可以考虑使用io库作为PDF文件的临时保存地点。这个库提供了一个类似于文件的对象接口,非常实用。 下面的例子是上面的“Hello World”示例采用io重写后的样子:

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

django 动态生成PDF文件的更多相关文章

  1. Java 动态生成 PDF 文件

    每片文章前来首小诗:   今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天.  --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...

  2. 第二章:视图层 - 10:动态生成PDF文件

    可以通过开源的Python PDF库ReportLab来实现PDF文件的动态生成. 一.安装ReportLab ReportLab库在PyPI上提供,可以使用pip来安装: $ pip install ...

  3. django 动态生成CSV文件

    CSV (Comma Separated Values),以纯文本形式存储数字和文本数据的存储方式.纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样的数据.CSV文件由任意数目的记录组成,记 ...

  4. django 生成动态的PDF文件

    需要依赖库. WeasyPrint,它是一个Python库可以生成PDF文件从HTML模板中.安装WeasyPrint pip install WeasyPrint 创建一个PDF模板(templat ...

  5. django生成文件txt、pdf(在生成 PDF 文件之前,需要安装 ReportLab 库)

    from django.http import HttpResponse def download_file(request): # Text file #response = HttpRespons ...

  6. 利用Java动态生成 PDF 文档

    利用Java动态生成 PDF 文档,则需要开源的API.首先我们先想象需求,在企业应用中,客户会提出一些复杂的需求,比如会针对具体的业务,构建比较典型的具备文档性质的内容,一般会导出PDF进行存档.那 ...

  7. Django中生成PDF(一)

    Django中生成PDF(一) 需求描述:     某网站与其用户达成一致的协议,每份协议中都有用户相关的独特信息,且还需要生成PDF并存档.PDF文件中需要有企业LOGO.文字描述等信息.其展现形式 ...

  8. Itext生成pdf文件

    来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...

  9. 网页中动态嵌入PDF文件/在线预览PDF内容https://www.cnblogs.com/xgyy/p/6119459.html

    #网页中动态嵌入PDF文件/在线预览PDF内容# 摘要:在web开发时我们有时会需要在线预览PDF内容,在线嵌入pdf文件: 问题1:如何网页中嵌入PDF: 在网页中: 常用的几种PDF预览代码片段如 ...

随机推荐

  1. 281A

    #include <iostream> #include <string> #include <cctype> using namespace std; int m ...

  2. 开发十年,只剩下这套Java开发体系了

    蓦然回首自己做开发已经十年了,这十年中我获得了很多,技术能力.培训.出国.大公司的经历,还有很多很好的朋友.但再仔细一想,这十年中我至少浪费了五年时间,这五年可以足够让自己成长为一个优秀的程序员,可惜 ...

  3. python 调用阿里云云解析api添加记录

    首先安装阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-alidns 可以配合jenkins传递参数 # ...

  4. 移动开发--viewport

    手机浏览器默认做了2件事情: 一.页面渲染在一个980px(ios,安卓可能有640px或1000多不等)的viewport. 二.缩放 为什么渲染时,要有viewport? 为了排版正确(980px ...

  5. python class 1

    //test.py class Employee: 'all employee' empCount = 0 def __init__(self, name, salary): self.name = ...

  6. 好吧,我承认我是爱瞎折腾----利用YDUI改变页面UI

    上周恒丰代付接口上线投产后,我做了一个“恒丰代付检查工具”,用途是,当线上调用恒丰代付出现了问题订单时,可以在这个工具页里做相应的弥补. 我项目里其他一些工具页的UI用的是YDUI.YDUI号称是“一 ...

  7. Struts2第三天

    ## Struts2第三天 ## ---------- **课程回顾:Struts2框架的第二天** 1. Servlet的API * ActionContext对象 * ServletActionC ...

  8. css3d旋转

    一.包裹层添加 -webkit-perspective: 800px; -moz-perspective: 800px; 使子元素获得3D效果支持   二.自持子元素需支持3D效果 -webkit-t ...

  9. python 定义类 简单使用

    在test.py文件里面 #coding=utf-8 #类的定义 class user: #定义私有属性 __name = '' __age = 0 #定义基本属性 sex = '' #定义构造函数 ...

  10. python ---多线程thread

    thread 在数据预处理的时候用处不大,因为有GIL 锁 查看thread信息 import threading print(threading.current_thread()) print(th ...