项目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master
这个demo实现了通过用户输入自己的个人信息生成一份简历pdf,来阐述如何使用django的httpresponse生成pdf的文档。
先上效果图:
安装依赖库
首先安装django最新版2.2.2和pdf依赖包xhtml2pdf
1
2
|
pip install django
pip install xhtml2pdf
|
编写表单验证
为了简单起见,这个demo依赖数据库,只需要表单验证数据即可,小编整理一套python资料和pdf,有需要python学习资料可以加学习群:631441315 ,反正闲着也是闲着呢,不如学点东西啦~~pdf/forms.py
1
2
3
4
5
6
7
8
9
10
|
class messageform(forms.form):
'''
表单验证
'''
name = forms.charfield(required = true)
degree = forms.charfield(required = true)
edu = forms.charfield(required = true)
work = forms.charfield(required = true)
tech = forms.charfield(required = true)
phone = forms.charfield(required = true)
|
编写类视图
pdf/views.py
由于这里我们只需要表单视图,所以只创建了一个类视图,post用来验证表单数据是否都存在,如果存在就把表单数据渲染到pdf模板中,经过处理后返回pdf的响应response。
这里可以使用django的通用类视图formview构建,代码更简洁
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class messageview(view):
def get( self , request):
form = messageform(data = request.get)
return render(request, 'index.html' , {
'form' : form
})
def post( self , request):
form = messageform(data = request.post)
if form.is_valid():
response = generate_pdf_response(context = form.cleaned_data)
return response
return redirect(reverse( 'pdf:message' ))
|
编写生成pdf响应response
view.py
这里为了方便直接把处理函数写到视图函数的文件里
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
def link_callback(uri):
if uri.startswith(settings.media_url):
path = os.path.join(settings.media_root,
uri.replace(settings.media_url, ""))
elif uri.startswith(settings.static_url):
path = os.path.join(settings.static_root,
uri.replace(settings.static_url, ""))
else :
return uri
# 确保本地文件存在
if not os.path.isfile(path):
raise exception(
"media uri 必须以以下格式开头"
f "'{settings.media_url}' or '{settings.static_url}'" )
return path
def generate_pdf_response(context):
response = httpresponse(content_type = "application/pdf" )
response[ "content-disposition" ] = \
f "attachment; filename='{context['name']}.pdf'"
html = render_to_string( "pdf.html" , context = context)
status = pisa.createpdf(html,
dest = response,
link_callback = link_callback)
if status.err:
return httpresponse( "pdf文件生成失败" )
return response
|
解决中文乱码问题
需要下载中文字体msyh.ttf放在static目录下的font目录,用来设置全局字体。这些文件都在github仓库里。
1
2
3
4
5
6
7
|
def font_patch():
from reportlab.pdfbase.ttfonts import ttfont
from reportlab.pdfbase import pdfmetrics
from xhtml2pdf.default import default_font
pdfmetrics.registerfont(ttfont( 'yh' , '{}/font/msyh.ttf' . format (
settings.staticfiles_dirs[ 0 ])))
default_font[ 'helvetica' ] = 'yh'
|
把这个函数放在生成pdf响应前
按照以上大致步骤大家就能够生成pdf文件了,可以在网页中浏览、放大、缩小,也可以下载,非常方便、简单。
大家可以直接clone一份代码试试效果
项目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/PyKK2019/p/11129471.html