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 相关文章推荐
使用python Django做网页
Nov 04 Python
Python学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
python 将字符串转换成字典dict的各种方式总结
Mar 23 Python
在Python运行时动态查看进程内部信息的方法
Feb 22 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
浅析Python与Mongodb数据库之间的操作方法
Jul 01 Python
Python PO设计模式的具体使用
Aug 16 Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 Python
ubuntu 安装pyqt5和卸载pyQt5的方法
Mar 24 Python
python如何从键盘获取输入实例
Jun 18 Python
Python异常处理机制结构实例解析
Jul 23 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 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
PHP将DateTime对象转化为友好时间显示的实现代码
2011/09/20 PHP
PHP定时执行计划任务的多种方法小结
2011/12/19 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
img标签中onerror用法
2009/08/13 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
javascript preload&lazy load
2010/05/13 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
2011/03/17 Javascript
js给dropdownlist添加选项的小例子
2013/03/04 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
react native仿微信PopupWindow效果的实例代码
2017/08/07 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
简单说说angular.json文件的使用
2018/10/29 Javascript
Vue加载json文件的方法简单示例
2019/01/28 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
vue中用 async/await 来处理异步操作
2020/07/18 Javascript
通过滑动翻页效果实现和移动端click事件问题
2021/01/26 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python list操作用法总结
2015/11/10 Python
python实现汉诺塔算法
2021/03/01 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
Python3开发实例之非关系型图数据库Neo4j安装方法及Python3连接操作Neo4j方法实例
2020/03/18 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
致100米运动员广播稿
2014/02/14 职场文书
《乌塔》教学反思
2014/02/17 职场文书
《花木兰》教学反思
2014/04/09 职场文书
工作说明书格式
2014/07/29 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
出国留学英文自荐信
2015/03/25 职场文书
公司表扬稿范文
2015/05/05 职场文书
人事任命书范本
2015/09/21 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python