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 dataframe 输出结果整行显示的方法
Jun 14 Python
使用11行Python代码盗取了室友的U盘内容
Oct 23 Python
python 实现在tkinter中动态显示label图片的方法
Jun 13 Python
图文详解Django使用Pycharm连接MySQL数据库
Aug 09 Python
Python shelve模块实现解析
Aug 28 Python
使用Python进行防病毒免杀解析
Dec 13 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
Python使用Numpy模块读取文件并绘制图片
May 13 Python
简单了解python列表和元组的区别
May 14 Python
Python竟然能剪辑视频
May 25 Python
Python 语言实现六大查找算法
Jun 30 Python
详解Golang如何实现支持随机删除元素的堆
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 面向对象 PHP5 中的常量
2010/05/05 PHP
基于Snoopy的PHP近似完美获取网站编码的代码
2011/10/23 PHP
PHP运行环境配置与开发环境的配置(图文教程)
2013/06/04 PHP
关于php循环跳出的问题
2013/07/01 PHP
php实现映射操作实例详解
2019/10/02 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
javascript之更有效率的字符串替换
2008/08/02 Javascript
javascript 鼠标悬浮图片显示原图 移出鼠标后原图消失(多图)
2009/12/28 Javascript
探寻Javascript执行效率问题
2014/11/12 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
javascript实现数字配对游戏的实例讲解
2017/12/14 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
Python Requests安装与简单运用
2016/04/07 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
wxPython实现画图板
2020/08/27 Python
python实现udp聊天窗口
2020/03/31 Python
使用Python构造hive insert语句说明
2020/06/06 Python
python如何删除文件、目录
2020/06/23 Python
python 实现Harris角点检测算法
2020/12/11 Python
美国男装连锁零售商:Men’s Wearhouse
2016/10/14 全球购物
中国最大隐形眼镜网上商城:视客眼镜网
2016/10/30 全球购物
复古服装:RetroStage
2019/05/10 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
机电一体化求职信
2014/03/10 职场文书
党员承诺书内容
2014/03/26 职场文书
小学校园文化建设汇报材料
2014/08/19 职场文书
委托书怎样写
2014/08/30 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
红色经典观后感
2015/06/18 职场文书
村主任当选感言
2015/08/01 职场文书
物业管理交接协议书
2016/03/24 职场文书
threejs太阳光与阴影效果实例代码
2022/04/05 Javascript