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中实现php的var_dump函数功能
Jan 21 Python
在RedHat系Linux上部署Python的Celery框架的教程
Apr 07 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
python中计算一个列表中连续相同的元素个数方法
Jun 29 Python
Python 忽略warning的输出方法
Oct 18 Python
python 使用正则表达式按照多个空格分割字符的实例
Dec 20 Python
python射线法判断检测点是否位于区域外接矩形内
Jun 28 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
Python 面向对象之类class和对象基本用法示例
Feb 02 Python
详解django使用include无法跳转的解决方法
Mar 19 Python
PIP和conda 更换国内安装源的方法步骤
Sep 21 Python
Python - 10行代码集2000张美女图
May 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
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
php打包网站并在线压缩为zip
2016/02/13 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
thinkPHP3.2.3结合Laypage实现的分页功能示例
2018/05/28 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
encode脚本和normal脚本混用的问题与解决方法
2007/03/08 Javascript
JavaScript入门教程(5) js Screen屏幕对象
2009/01/31 Javascript
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
javascript HTMLEncode HTMLDecode的完整实例(兼容ie和火狐)
2009/06/02 Javascript
JavaScript中使用ActiveXObject操作本地文件夹的方法
2014/03/28 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
javascript每日必学之多态
2016/02/23 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
在Create React App中启用Sass和Less的方法示例
2019/01/16 Javascript
jQuery轮播图功能制作方法详解
2019/12/03 jQuery
webpack安装配置与常见使用过程详解(结合vue)
2020/06/01 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
在Python中使用异步Socket编程性能测试
2014/06/25 Python
python文件操作整理汇总
2014/10/21 Python
在Python操作时间和日期之asctime()方法的使用
2015/05/22 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
python多进程和多线程究竟谁更快(详解)
2017/05/29 Python
Python中协程用法代码详解
2018/02/10 Python
pip安装py_zipkin时提示的SSL问题对应
2018/12/29 Python
django 中QuerySet特性功能详解
2019/07/25 Python
keras 权重保存和权重载入方式
2020/05/21 Python
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
巴西Bo.Bô官方在线商店:经营奢侈品时尚业务
2020/03/16 全球购物
平面设计师工作职责范文
2013/12/03 职场文书
公司廉洁自律承诺书
2014/03/27 职场文书
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技
德生2P3收音机开箱评测
2022/04/30 无线电