服务器之家

服务器之家 > 正文

Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题

时间:2021-07-31 00:27     来源/作者:Pykk2019

项目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master

这个demo实现了通过用户输入自己的个人信息生成一份简历pdf,来阐述如何使用django的httpresponse生成pdf的文档。

先上效果图:

 

Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
Django生成PDF文档显示在网页上以及解决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响应前

Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题

按照以上大致步骤大家就能够生成pdf文件了,可以在网页中浏览、放大、缩小,也可以下载,非常方便、简单。
大家可以直接clone一份代码试试效果

项目地址:https://github.com/PythonerKK/django-generate-pdf/tree/master
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://www.cnblogs.com/PyKK2019/p/11129471.html

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部