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 采集中文乱码问题的完美解决方法
Sep 27 Python
python查看模块,对象的函数方法
Oct 16 Python
BP神经网络原理及Python实现代码
Dec 18 Python
python3.6下Numpy库下载与安装图文教程
Apr 02 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 Python
Python二元赋值实用技巧解析
Oct 25 Python
python如何判断IP地址合法性
Apr 05 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
Pymysql实现往表中插入数据过程解析
Jun 02 Python
python 从list中随机取值的方法
Nov 16 Python
pycharm最新激活码有效期至2100年(亲测可用)
Feb 05 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
javascript时间自动刷新实现原理与步骤
2013/01/06 Javascript
浅析jquery某一元素重复绑定的问题
2014/01/03 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JQuery选中checkbox方法代码实例(全选、反选、全不选)
2015/04/27 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
jQuery插件ImageDrawer.js实现动态绘制图片动画(附源码下载)
2016/02/25 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
在vue项目中引入highcharts图表的方法
2019/01/21 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
微信小程序项目总结之记账小程序功能的实现(包括后端)
2019/08/20 Javascript
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
使用Python构建Hopfield网络的教程
2015/04/14 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
Sanic框架基于类的视图用法示例
2018/07/18 Python
Python判断一个三位数是否为水仙花数的示例
2018/11/13 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
HTML5实现移动端点击翻牌功能
2020/10/23 HTML / CSS
Reformation官网:美国女装品牌
2018/09/14 全球购物
Java程序员面试题
2013/07/15 面试题
青年文明号创建承诺
2014/03/31 职场文书
《她是我的朋友》教学反思
2014/04/26 职场文书
现实表现材料范文
2014/12/23 职场文书
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers