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获取豆瓣电影简介代码分享
Jan 16 Python
在python下读取并展示raw格式的图片实例
Jan 24 Python
对Python3 * 和 ** 运算符详解
Feb 16 Python
Python Django的安装配置教程图文详解
Jul 17 Python
pandas中read_csv的缺失值处理方式
Dec 19 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 Python
在django admin中配置搜索域是一个外键时的处理方法
May 20 Python
如何利用Python识别图片中的文字
May 31 Python
利用scikitlearn画ROC曲线实例
Jul 02 Python
通过实例简单了解python yield使用方法
Aug 06 Python
python音频处理的示例详解
Dec 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
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
Yii全局函数用法示例
2017/01/22 PHP
PHP CURL使用详解
2019/03/21 PHP
PhpStorm+xdebug+postman调试技巧分享
2020/09/15 PHP
js类定义函数时用prototype与不用的区别示例介绍
2014/06/10 Javascript
js控制文本框只输入数字和小数点的方法
2015/03/10 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
微信小程序实现YDUI的ScrollTab组件
2018/02/02 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
JS中的算法与数据结构之常见排序(Sort)算法详解
2019/08/16 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
JavaScript 生成唯一ID的几种方式
2021/02/19 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
Python实现批量读取word中表格信息的方法
2015/07/30 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
在交互式环境中执行Python程序过程详解
2019/07/12 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
2020/05/23 Python
HTML5之SVG 2D入门1—SVG(可缩放矢量图形)概述
2013/01/30 HTML / CSS
北美大型运动类产品商城:Champs Sports
2017/01/12 全球购物
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
会计专业自我鉴定范文
2013/12/29 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
社会实践活动报告
2015/02/05 职场文书
碧霞祠导游词
2015/02/09 职场文书
法制教育讲座心得体会
2016/01/14 职场文书
浅谈Python基础之列表那些事儿
2021/05/11 Python
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android