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文件读写并使用mysql批量插入示例分享(python操作mysql)
Feb 17 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
Django 添加静态文件的两种实现方法(必看篇)
Jul 14 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
Python实现多条件筛选目标数据功能【测试可用】
Jun 13 Python
python人民币小写转大写辅助工具
Jun 20 Python
python使用threading.Condition交替打印两个字符
May 07 Python
Python实现字符串中某个字母的替代功能
Oct 21 Python
Python如何使用argparse模块处理命令行参数
Dec 11 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
Python实现区域填充的示例代码
Feb 03 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 mysql数据库操作分页类
2008/06/04 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php基于表单密码验证与HTTP验证用法实例
2015/01/06 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
php实现的XML操作(读取)封装类完整实例
2017/02/23 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
php实现session共享的实例方法
2019/09/19 PHP
JS 事件绑定函数代码
2010/04/28 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
详解动画插件wow.js的使用方法
2017/09/13 Javascript
egg.js的基本使用和调用数据库的方法示例
2019/05/18 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
2017/09/25 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
python 模拟贷款卡号生成规则过程解析
2019/08/30 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
python创建n行m列数组示例
2019/12/02 Python
Python类如何定义私有变量
2020/02/03 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
python实现KNN近邻算法
2020/12/30 Python
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
金融学专科生自我鉴定
2014/02/21 职场文书
应届毕业生自荐信例文
2014/02/26 职场文书
网站美工岗位职责
2014/04/02 职场文书
小学生综合素质评语
2014/04/23 职场文书
房屋租赁意向书范本
2015/05/09 职场文书
学校隐患排查制度
2015/08/05 职场文书
Pillow图像处理库安装及使用
2022/04/12 Python