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


Posted in Python onJuly 04, 2019

项目地址: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

pip install django
pip install xhtml2pdf

编写表单验证

为了简单起见,这个demo依赖数据库,只需要表单验证数据即可
pdf/forms.py

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构建,代码更简洁

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这里为了方便直接把处理函数写到视图函数的文件里

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仓库里。

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
使用70行Python代码实现一个递归下降解析器的教程
Apr 17 Python
Django中几种重定向方法
Apr 28 Python
对Python中的@classmethod用法详解
Apr 21 Python
基于python实现KNN分类算法
Apr 23 Python
Django之路由层的实现
Sep 09 Python
Python基于jieba, wordcloud库生成中文词云
May 13 Python
VSCode配合pipenv搞定虚拟环境的实现方法
May 17 Python
Python常用数据分析模块原理解析
Jul 20 Python
python 批量将中文名转换为拼音
Feb 07 Python
Python如何识别银行卡卡号?
Jun 10 Python
python数据可视化JupyterLab实用扩展程序Mito
Nov 20 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 Python
python批量修改图片尺寸,并保存指定路径的实现方法
Jul 04 #Python
python代理工具mitmproxy使用指南
Jul 04 #Python
Python批量修改图片分辨率的实例代码
Jul 04 #Python
Django 中自定义 Admin 样式与功能的实现方法
Jul 04 #Python
python3用PIL把图片转换为RGB图片的实例
Jul 04 #Python
python中比较两个列表的实例方法
Jul 04 #Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 #Python
You might like
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
如何使用脚本模仿登陆过程
2006/11/22 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
Laravel 5+ .env环境配置文件详解
2020/04/06 PHP
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
js中的this关键字详解
2013/09/25 Javascript
js charAt的使用示例
2014/02/18 Javascript
javascript中的Function.prototye.bind
2015/06/25 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
不使用script导入js文件的几种方法
2016/10/27 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
jQuery zTree树插件的使用教程
2019/08/16 jQuery
解决Vue调用springboot接口403跨域问题
2019/09/02 Javascript
python网络编程学习笔记(七):HTML和XHTML解析(HTMLParser、BeautifulSoup)
2014/06/09 Python
Python提取网页中超链接的方法
2016/09/18 Python
python中正则的使用指南
2016/12/04 Python
Python中datetime模块参考手册
2017/01/13 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
python解析命令行参数的三种方法详解
2019/11/29 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
No module named ‘win32gui‘ 的解决方法(踩坑之旅)
2021/02/18 Python
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
英国轻奢珠宝品牌:Astley Clarke
2016/12/18 全球购物
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
英国厨房与餐具用品为主的设计品牌:Joseph Joseph
2018/04/26 全球购物
如何提高MySql的安全性
2014/06/19 面试题
一份婚庆公司创业计划书
2014/01/11 职场文书
村委会贫困证明范本
2014/09/17 职场文书
辩论会主持词
2015/07/03 职场文书
教师节表彰会主持词
2015/07/06 职场文书
golang中的并发和并行
2021/05/08 Golang
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS