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标准库之循环器(itertools)介绍
Nov 25 Python
详解Python中with语句的用法
Apr 15 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
python互斥锁、加锁、同步机制、异步通信知识总结
Feb 11 Python
Python实现聊天机器人的示例代码
Jul 09 Python
VPS CENTOS 上配置python,mysql,nginx,uwsgi,django的方法详解
Jul 01 Python
python 判断linux进程,并杀死进程的实现方法
Jul 01 Python
Python上下文管理器全实例详解
Nov 12 Python
parser.add_argument中的action使用
Apr 20 Python
Eclipse配置python默认头过程图解
Apr 26 Python
在Django中自定义filter并在template中的使用详解
May 19 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中使用PDF文档功能
2006/10/09 PHP
用PHP的ob_start();控制您的浏览器cache!
2006/11/25 PHP
常用简易JavaScript函数
2009/04/09 Javascript
javascript 函数调用规则
2009/08/26 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
原生js配合cookie制作保存路径的拖拽
2015/12/29 Javascript
jQuery插件扩展实例【添加回调函数】
2016/11/26 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
vue webpack打包优化操作技巧
2018/02/22 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
浅谈Vue数据响应
2018/11/05 Javascript
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
解决VUE双向绑定失效的问题
2019/10/29 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
vue 解决provide和inject响应的问题
2020/11/12 Javascript
Python基础知识_浅谈用户交互
2017/05/31 Python
Python使用QRCode模块生成二维码实例详解
2017/06/14 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
Python小进度条显示代码
2019/03/05 Python
Python日志:自定义输出字段 json格式输出方式
2020/04/27 Python
Django中和时区相关的安全问题详解
2020/10/12 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
儿科护士自我鉴定
2013/10/14 职场文书
初三化学教学反思
2014/01/23 职场文书
职位说明书范文
2014/05/07 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
兴趣班停课通知
2015/04/24 职场文书
会议主持人开场白台词
2015/05/28 职场文书
师范生见习总结范文
2015/06/23 职场文书
中学语文教学反思
2016/02/16 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
python删除csv文件的行列
2021/04/06 Python
Java中的随机数Random
2022/03/17 Java/Android