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 相关文章推荐
Web服务器框架 Tornado简介
Jul 16 Python
python遍历类中所有成员的方法
Mar 18 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
利用Python实现Windows定时关机功能
Mar 21 Python
python OpenCV学习笔记直方图反向投影的实现
Feb 07 Python
python中将\\uxxxx转换为Unicode字符串的方法
Sep 06 Python
Python3.6+selenium2.53.6自动化测试_读取excel文件的方法
Sep 06 Python
Numpy之reshape()使用详解
Dec 26 Python
django中related_name的用法说明
May 20 Python
Selenium及python实现滚动操作多种方法
Jul 21 Python
python math模块的基本使用教程
Jan 16 Python
python 实现IP子网计算
Feb 18 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
Search File Contents PHP 搜索目录文本内容的代码
2010/02/21 PHP
php select,radio和checkbox默认选择的实现方法
2010/05/15 PHP
smarty中js的调用方法示例
2014/10/27 PHP
在Nginx上部署ThinkPHP项目教程
2015/02/02 PHP
php开发工具有哪五款
2015/11/09 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
thinkPHP3.2.3实现阿里大于短信验证的方法
2018/06/06 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
网页开发中的容易忽略的问题 javascript HTML中的table
2009/04/15 Javascript
js对象数组按属性快速排序
2011/01/31 Javascript
快速排序 php与javascript的不同之处
2011/02/22 Javascript
javascript中的=等号个数问题两个跟三个有什么区别
2013/10/23 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
在vue中解决提示警告 for循环报错的方法
2018/09/28 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
2021/02/05 Javascript
Python实现的tab文件操作类分享
2014/11/20 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
在Python中调用ggplot的三种方法
2015/04/08 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
2018/04/23 Python
python3.5绘制随机漫步图
2018/08/27 Python
浅谈Python traceback的优雅处理
2018/08/31 Python
python实现文本界面网络聊天室
2018/12/12 Python
python利用跳板机ssh远程连接redis的方法
2019/02/19 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
python 双循环遍历list 变量判断代码
2020/05/04 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
领导的自我鉴定
2013/12/28 职场文书
职务说明书范文
2014/05/07 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
企业内部管理控制:银行存款控制制度范本
2020/01/10 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python