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实现360皮肤按钮控件示例
Feb 21 Python
Python continue语句用法实例
Mar 11 Python
Python中的异常处理学习笔记
Jan 28 Python
Python利用多进程将大量数据放入有限内存的教程
Apr 01 Python
Python实现的数据结构与算法之快速排序详解
Apr 22 Python
详解Python if-elif-else知识点
Jun 11 Python
Windows 64位下python3安装nltk模块
Sep 19 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
pycharm 更改创建文件默认路径的操作
Feb 15 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
May 10 Python
如何使用pycharm连接Databricks的步骤详解
Sep 23 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支持页面回退的两种方法[转]
2007/02/14 PHP
php之Memcache学习笔记
2013/06/17 PHP
php循环table实现一行两列显示的方法
2015/06/04 PHP
PHP图像裁剪缩略裁切类源码及使用方法
2016/01/07 PHP
PHP简单实现解析xml为数组的方法
2018/05/02 PHP
用js 让图片在 div或dl里 居中,底部对齐
2008/01/21 Javascript
在IE,Firefox,Safari,Chrome,Opera浏览器上调试javascript
2008/12/02 Javascript
javaScript同意等待代码实现心得
2011/01/01 Javascript
js取滚动条的尺寸的函数代码
2011/11/30 Javascript
IE8下String的Trim()方法失效的解决方法
2013/11/08 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
javascript实现鼠标放上后下边对应内容变换的效果
2015/08/06 Javascript
jQuery+CSS3实现3D立方体旋转效果
2015/11/10 Javascript
bootstrap-wysiwyg结合ajax实现图片上传实时刷新功能
2016/05/27 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
node.js多个异步过程中判断执行是否完成的解决方案
2017/12/10 Javascript
Vue全局分页组件的实现代码
2018/08/10 Javascript
微信小程序仿知乎实现评论留言功能
2018/11/28 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
python 字符串格式化代码
2013/03/17 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
解决python opencv无法显示图片的问题
2018/10/28 Python
启动Atom并运行python文件的步骤
2018/11/09 Python
python利用小波分析进行特征提取的实例
2019/01/09 Python
Django中的cookie和session
2019/08/27 Python
Python生成词云的实现代码
2020/01/14 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
python实现学生管理系统开发
2020/07/24 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
大学应届生求职简历的自我评价
2013/10/08 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
初中差生评语
2014/12/29 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python