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爬虫功能
Dec 31 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
分分钟入门python语言
Mar 20 Python
在pycharm中设置显示行数的方法
Jan 16 Python
Python自动化运维之Ansible定义主机与组规则操作详解
Jun 13 Python
python获取引用对象的个数方式
Dec 20 Python
Python3 main函数使用sys.argv传入多个参数的实现
Dec 25 Python
200行python代码实现贪吃蛇游戏
Apr 24 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
Python实现曲线拟合的最小二乘法
Feb 19 Python
python简单验证码识别的实现过程
Jun 20 Python
利用Python多线程实现图片下载器
Mar 25 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系统流量分析的程序
2006/10/09 PHP
PHP函数rtrim()使用中的怪异现象分析
2017/02/24 PHP
JQuery 应用 JQuery.groupTable.js
2010/12/15 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
解析js如何获取当前url中的参数值并复制给input
2013/06/23 Javascript
js setTimeout 常见问题小结
2013/08/13 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
js和jQuery设置Opacity半透明 兼容IE6
2016/05/24 Javascript
jQuery简单入门示例之用户校验demo示例
2016/07/09 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
2016/12/07 Javascript
JS生成一维码(条形码)功能示例
2017/01/19 Javascript
基于vue2.0+vuex的日期选择组件功能实现
2017/03/13 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
vue指令只能输入正数并且只能输入一个小数点的方法
2018/06/08 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
swiper Scrollbar滚动条组件详解
2019/09/08 Javascript
python之文件的读写和文件目录以及文件夹的操作实现代码
2016/08/28 Python
python调用API实现智能回复机器人
2018/04/10 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
python ChainMap的使用和说明详解
2019/06/11 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
Python 实现网课实时监控自动签到、打卡功能
2020/03/12 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
Jacadi Paris英国官网:法国童装品牌
2019/08/09 全球购物
Fnac西班牙官网:法国文化和电子产品零售商
2021/03/14 全球购物
英文简历中的自我评价用语
2013/12/09 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
高二学生评语大全
2014/04/25 职场文书
内科护士节演讲稿
2014/09/11 职场文书
2015年社区重阳节活动总结
2015/07/30 职场文书
python实现自动清理文件夹旧文件
2021/05/10 Python
用JS实现飞机大战小游戏
2021/06/09 Javascript
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL
如何Python使用re模块实现okenizer
2022/04/30 Python