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中使用中文的方法
Feb 19 Python
Python编程中字符串和列表的基本知识讲解
Oct 14 Python
常见的python正则用法实例讲解
Jun 21 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
python 基础教程之Map使用方法
Jan 17 Python
Python学习小技巧之列表项的推导式与过滤操作
May 20 Python
python数据类型判断type与isinstance的区别实例解析
Oct 31 Python
PyCharm 常用快捷键和设置方法
Dec 20 Python
Python实现简单求解给定整数的质因数算法示例
Mar 25 Python
NumPy.npy与pandas DataFrame的实例讲解
Jul 09 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
pycharm2020.2 配置使用的方法详解
Sep 16 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中使用url传递数组的方法
2015/02/11 PHP
深入了解PHP中的Array数组和foreach
2016/11/06 PHP
[原创]PHP正则删除html代码中a标签并保留标签内容的方法
2017/05/23 PHP
PHP示例演示发送邮件给某个邮箱
2019/04/03 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
jQuery验证Checkbox是否选中的代码 推荐
2011/09/04 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
Javascript MVC框架Backbone.js详解
2014/09/18 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
node.js中的fs.futimes方法使用说明
2014/12/17 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
js实现碰撞检测特效代码分享
2016/10/16 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
JS温故而知新之变量提升和时间死区
2019/01/27 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
《javascript设计模式》学习笔记五:Javascript面向对象程序设计工厂模式实例分析
2020/04/08 Javascript
[11:01]2014DOTA2西雅图邀请赛 冷冷带你探秘威斯汀
2014/07/08 DOTA
Python Tkinter基础控件用法
2014/09/03 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
Python列表解析配合if else的方法
2018/06/23 Python
python批量识别图片指定区域文字内容
2019/04/30 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
在Keras中利用np.random.shuffle()打乱数据集实例
2020/06/15 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
浅析HTML5中的 History 模式
2017/06/22 HTML / CSS
项目副经理岗位职责
2013/12/30 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
2014年房产经纪人工作总结
2014/12/08 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书