Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法


Posted in Python onDecember 17, 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一份代码试试效果

以上这篇Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python下进行UDP网络编程的教程
Apr 29 Python
python判断给定的字符串是否是有效日期的方法
May 13 Python
python 与GO中操作slice,list的方式实例代码
Mar 20 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
python中使用正则表达式的后向搜索肯定模式(推荐)
Nov 11 Python
selenium+python 去除启动的黑色cmd窗口方法
May 22 Python
浅析python的优势和不足之处
Nov 20 Python
Pyinstaller打包.py生成.exe的方法和报错总结
Apr 02 Python
python3.6 如何将list存入txt后再读出list的方法
Jul 02 Python
Django中使用session保持用户登陆连接的例子
Aug 06 Python
Python-Flask:动态创建表的示例详解
Nov 22 Python
使用python绘制分组对比柱状图
Apr 21 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 #Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 #Python
Django项目使用ckeditor详解(不使用admin)
Dec 17 #Python
python主线程与子线程的结束顺序实例解析
Dec 17 #Python
Django通用类视图实现忘记密码重置密码功能示例
Dec 17 #Python
Django集成celery发送异步邮件实例
Dec 17 #Python
python学生信息管理系统实现代码
Dec 17 #Python
You might like
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
php防止恶意刷新与刷票的方法
2014/11/21 PHP
Yii2中使用asset压缩js,css文件的方法
2016/11/24 PHP
PHP数组式访问接口ArrayAccess用法分析
2017/12/28 PHP
javascript:以前写的xmlhttp池,代码
2008/05/18 Javascript
JavaScript 和 Java 的区别浅析
2013/07/31 Javascript
PHP+jQuery+Ajax+Mysql如何实现发表心情功能
2015/08/06 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
KnockoutJS 3.X API 第四章之表单textInput、hasFocus、checked绑定
2016/10/11 Javascript
Vuex2.0+Vue2.0构建备忘录应用实践
2016/11/30 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
微信小程序wepy框架笔记小结
2018/08/08 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
[00:57]林俊杰助阵DOTA2亚洲邀请赛
2015/01/28 DOTA
用Python实现协同过滤的教程
2015/04/08 Python
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python daemon守护进程实现
2016/08/27 Python
python difflib模块示例讲解
2017/09/13 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
Python3 + Appium + 安卓模拟器实现APP自动化测试并生成测试报告
2021/01/27 Python
CSS3动画:5种预载动画效果实例
2017/04/05 HTML / CSS
美国单身专业人士在线约会网站:EliteSingles
2019/03/19 全球购物
加拿大著名的奢侈品购物网站:SSENSE(支持中文)
2020/06/25 全球购物
将"引用"作为函数参数有哪些特点
2013/04/05 面试题
c++工程师面试问题
2013/08/04 面试题
幼教毕业生自我鉴定
2014/01/12 职场文书
消防安全责任书范本
2014/04/15 职场文书
超市商业计划书
2014/05/04 职场文书
学生安全承诺书
2014/05/22 职场文书
应届生求职信范文
2014/05/26 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
Mysql 用户权限管理实现
2021/05/25 MySQL