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实现k均值算法示例(k均值聚类算法)
Mar 16 Python
Python下rrdtool模块的基本使用方法
Nov 13 Python
Python的Django应用程序解决AJAX跨域访问问题的方法
May 31 Python
Flask框架使用DBUtils模块连接数据库操作示例
Jul 20 Python
python将txt文件读入为np.array的方法
Oct 30 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
Django中的FBV和CBV用法详解
Sep 15 Python
详解基于python-django框架的支付宝支付案例
Sep 23 Python
python做接口测试的必要性
Nov 20 Python
python高阶函数map()和reduce()实例解析
Mar 16 Python
Python的scikit-image模块实例讲解
Dec 30 Python
写一个Python脚本下载哔哩哔哩舞蹈区的所有视频
May 31 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编程与应用
2006/10/09 PHP
对Session和Cookie的区分与解释
2007/03/16 PHP
php抓取https的内容的代码
2010/04/06 PHP
php微信支付接口开发程序
2016/08/02 PHP
extjs grid设置某列背景颜色和字体颜色的方法
2010/09/03 Javascript
jQuery学习笔记[1] jQuery中的DOM操作
2010/12/03 Javascript
基于jQuery实现下拉收缩(展开与折叠)特效
2012/12/25 Javascript
DWR实现模拟Google搜索效果实现原理及代码
2013/01/30 Javascript
JavaSript中变量的作用域闭包的深入理解
2014/05/12 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
基于javascript实现精确到毫秒的倒计时限时抢购
2016/04/17 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
2017/05/12 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
js html实现计算器功能
2018/11/13 Javascript
详解Vue项目中实现锚点定位
2019/04/24 Javascript
JS实现放大镜效果
2020/09/21 Javascript
python 根据正则表达式提取指定的内容实例详解
2016/12/04 Python
python excel转换csv代码实例
2019/08/26 Python
使用批处理脚本自动生成并上传NuGet包(操作方法)
2019/11/19 Python
python实现扫雷游戏的示例
2020/10/20 Python
Python页面加载的等待方式总结
2021/02/28 Python
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
英国网上电器商店:Electricshop
2020/03/15 全球购物
程序员跳槽必看面试题总结
2013/06/28 面试题
物流管理专业应届生求职信
2013/11/21 职场文书
卫校中专生的自我评价
2014/01/15 职场文书
竞聘演讲稿精彩开头和结尾
2014/05/14 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
服务承诺书
2015/01/19 职场文书
毕业生对母校寄语
2015/02/26 职场文书
禁毒心得体会范文
2016/01/15 职场文书
MySQL读取JSON转换的方式
2022/03/18 MySQL
JS前端轻量fabric.js系列之画布初始化
2022/08/05 Javascript