Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法


Posted in Python onDecember 17, 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一份代码试试效果

以上这篇Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中cPickle用法例子分享
Jan 03 Python
使用pdb模块调试Python程序实例
Jun 02 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
一条命令解决mac版本python IDLE不能输入中文问题
May 15 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
OpenCV中VideoCapture类的使用详解
Feb 14 Python
Python数据库封装实现代码示例解析
Sep 05 Python
python 深度学习中的4种激活函数
Sep 18 Python
python如何实现word批量转HTML
Sep 30 Python
正确的理解和使用Django信号(Signals)
Apr 14 Python
微信小程序调用python模型
Apr 21 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 #Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 #Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 #Python
python主线程与子线程的结束顺序实例解析
Dec 17 #Python
Django通用类视图实现忘记密码重置密码功能示例
Dec 17 #Python
Django集成celery发送异步邮件实例
Dec 17 #Python
python学生信息管理系统实现代码
Dec 17 #Python
You might like
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
解析php入库和出库
2013/06/25 PHP
php合并数组中相同元素的方法
2014/11/13 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
详解PHP中的Traits
2015/07/29 PHP
php遍历、读取文件夹中图片并分页显示图片的方法
2016/11/15 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
jQuery图片播放8款精美插件分享
2013/02/17 Javascript
jQuery表格排序组件-tablesorter使用示例
2014/05/26 Javascript
详解Backbone.js框架中的模型Model与其集合collection
2016/05/05 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
详解照片瀑布流效果(js,jquery分别实现与知识点总结)
2017/01/01 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
Node.js文件编码格式的转换的方法
2018/04/27 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
vue.js实现二级菜单效果
2019/10/19 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
[06:04]DOTA2国际邀请赛纪录片:Just For LGD
2013/08/11 DOTA
[45:50]完美世界DOTA2联赛PWL S3 CPG vs Forest 第二场 12.16
2020/12/17 DOTA
python3使用tkinter实现ui界面简单实例
2014/01/10 Python
python发送HTTP请求的方法小结
2015/07/08 Python
python操作mysql数据库
2017/03/05 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
python实现爬山算法的思路详解
2019/04/09 Python
python3中sys.argv的实例用法
2020/04/24 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
2020/06/04 Python
python实现定时发送邮件
2020/12/23 Python
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
电气专业推荐信范文
2013/11/18 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
行政处罚告知书
2015/07/01 职场文书
中学教师读书笔记
2015/07/01 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
详解Python描述符的工作原理
2021/06/11 Python
用php如何解决大文件分片上传问题
2021/07/07 PHP