Django 实现HTML转PDF 用通用视图编写PDF 并且让PDF支持中文

  • 如何使用django-easy-pdf
    • django-easy-pdf的依赖
    • 安装django-easy-pdf
  • 使用过程中遇到的问题总结
    • 关于django-easy-pdf 中文支持问题汇总[xhtml2pdf]
    • 相关代码下载[我穷,如果可以请支持一下]
    • 当你使用table绘制表格的时候,如果表格太大会报错
    • 当你遇到list index out of range错误时
    • 什么,字体不换行?如何解?
  • 好了,是我骗了你,其实还有个更好的实现方法,我们用WeasyPrint后端作为PDF的渲染
    • 这里给出django-easy-pdf和WeasyPrint的安装方法

如何使用django-easy-pdf

你好! 这是我第一次使用 CSDN 发布文章,django工作有半年了,今天有个需求就是使用django视图来编写可浏览的PDF,但是研究许久未果。后来在度娘上找到了django-easy-pdf,也实现了我的需求,但是使用的过程中遇到了好多问题,接下来教你如何使用django-easy-pdf,并且分享我遇到的问题解决方案。 如果你想学习或了解更多关于django的知识,可以加Q群哦[828816138]。

django-easy-pdf的依赖

这个应用程序使Django中的PDF文件变得非常容易。它可用于从简单的HTML标记和CSS样式创建发票,账单和其他文档。您甚至可以嵌入图像并使用自定义字体。

该库提供了基于类的视图,只需要继承它 PDFTemplateView或 PDFTemplateResponseMixin 便可以呈现PDF

django-easy-pdf 依赖于取决于:

  1. django>=1.10
  2. xhtml2pdf>=0.2b1
  3. reportlab

安装django-easy-pdf

// An highlighted block
pip3.6 install xhtml2pdf> = 0.2b1

添加easy_pdf到INSTALLED_APPS
然后您就可以这样去使用了

{% extends "easy_pdf/base.html" %}{% block content %}<div id="content"><h1>Hi there!</h1></div>
{% endblock %}

编写CBV视图

from easy_pdf.views import PDFTemplateViewclass PDFContract(PDFTemplateView):template_name = 'PDFContract.html'def get_context_data(self, **kwargs):return super(PDFContract, self).get_context_data(pagesize='A4',title='XXXX采购协议供货合同',**kwargs)

from easy_pdf.views import PDFTemplateResponseMixinclass HelloPDFView(PDFTemplateResponseMixin, TemplateView):template_name = 'hello.html'def get_context_data(self, **kwargs):return super(PDFContract, self).get_context_data(pagesize='A4',title='XXXX采购协议供货合同',**kwargs)

使用过程中遇到的问题总结

按照上面编写完成视图后,写一个简单的html相信你是没问题的,但是当你使用table绘制表格的时候,当你使用中文开始编写PDF的时候,你会遇到麻烦

关于django-easy-pdf 中文支持问题汇总[xhtml2pdf]

度娘参考了一些解决方案,发现行不通,关于字体,其实每个系统,应该都有一个黑体吧,为了兼容大部分系统,我们就添加一个系统字体 黑体 SimHei

很简单,只需要修改一个文件,添加一个文件,共2处位置,就可以实现中文喽!
先来看看效果吧

安装 django-easy-pdf 后,找到它的位置 [Python36\Lib\site-packages\xhtml2pdf]
我们修改的是 xhtml2pdf 所以是这个路径,因为安装django-easy-pdf 的时候会安装上他

然后我们找到这个路径
Python36\Lib\site-packages\xhtml2pdf\default.py

......DEFAULT_FONT = { "courier": "Courier","courier-bold": "Courier-Bold","courier-boldoblique": "Courier-BoldOblique","courier-oblique": "Courier-Oblique",# 修改这一行为 ["helvetica": "SimHei"]"helvetica": "helvetica", # SimHei 为黑体,是系统的自带字体大部分系统都有这个字体,所以就用了它"helvetica": "SimHei"........
}......

然后在这里添加并注册字体
Python36\Lib\site-packages_init_,py

......from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont# 只要你系统中存在这个字体,就可以这样写,这里的SimHei.ttf我没有添加如何路径哦,它会从系统字库里面找
pdfmetrics.registerFont(TTFont('SimHei', 'SimHei.ttf'))# 这一个方法,只有这个字体xhtml2pdf内部存在时可用
# from reportlab.pdfbase.cidfonts import UnicodeCIDFont
# pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))

完整的例子:
Python36\Lib\site-packages\xhtml2pdf\default.py

......
DEFAULT_FONT = { "courier": "Courier","courier-bold": "Courier-Bold","courier-boldoblique": "Courier-BoldOblique","courier-oblique": "Courier-Oblique","helvetica": "SimHei"........
}
......

Python36\Lib\site-packages_init_,py

......from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFontpdfmetrics.registerFont(TTFont('SimHei', 'SimHei.ttf'))

至此,中文支持的问题已经解决了,注册字体的时候要格外注意这里
TTFont(‘SimHei’, ‘SimHei.ttf’)
SimHei.ttf 为系统字体,是不需要添加路径的,他会从系统字体里面找

相关代码下载[我穷,如果可以请支持一下]

https://download.csdn.net/download/qq_17776977/10755249

当你使用table绘制表格的时候,如果表格太大会报错

当你的Table表格撑满一个页面的时候,通常会报如下错误

解决方案:
适当拆分大表格为小表格,可以将一个表格拆分为若干个

当你遇到list index out of range错误时

这是由于你表格 行或列[rowspan,colspan]的索引大于或者小于实际的表格 行或列时会报错

可以看出,它的列是一行,然而是错误的

实际展示效果是,看到了吧,他是1列的

解决方案:
请认真设置行或列

什么,字体不换行?如何解?

是不是崩溃了?是不是看到这里感觉很麻烦,其实我也觉得

解决方案:
很简单,手动换行,或者字体里面添加空格,就会自动换行
如果怕麻烦,可以直接看下面的方法

好了,是我骗了你,其实还有个更好的实现方法,我们用WeasyPrint后端作为PDF的渲染

嘿嘿,真正的干货,永远是献给坚持的人,如果你不想做了,可以离开。关于前面的方法是可以实现的,但是也会面临诸多问题。我都快把PDF的模板做完了,才发现这种方法。但是我没有尝试,因为之前尝试过,报错。偶然间看到了官方文档的解决方法。特此记录一下 [并未实践]

参考:
WeasyPrint安装方法 https://weasyprint.readthedocs.io/en/latest/install.html
django-easy-pdf安装方法 https://django-easy-pdf.readthedocs.io/en/v0.2.0-dev1/installation.html

关于WeasyPrint的报错

后来我知道了这是因为没有安装某些依赖所导致,这些依赖并不是py的某些库,而是一些GTK +库。。。

这里给出django-easy-pdf和WeasyPrint的安装方法

安装前请先卸载之前安装的django-easy-pdf,也要卸载所安装的依赖

  1. django>=1.10
  2. xhtml2pdf>=0.2b1
  3. reportlab

然后就是安装了,一条指令的事情

pip3.6 install -U django-easy-pdf WeasyPrint

有关WeasyPrint依赖的安装说明,请参阅http://weasyprint.readthedocs.io/en/latest/install.html

待续…

Django 实现HTML转PDF 用通用视图编写PDF 并且让PDF支持中文相关推荐

  1. django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图

    基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...

  2. Python Django CBV下的通用视图函数

    ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request):retur ...

  3. 深入Django(1): 通用视图 (generic views)

    如果对Django的基础部分尚不熟悉,请参考<Django实战>系列. 内容提要 1. 回顾Django的视图函数(view function) 2. 在视图函数中使用模板 3. 简化视图 ...

  4. Django笔记7(通用视图)

    1. 一个呈现静态"关于"页面的URLconf from django.conf.urls.defaults import * from django.views.generic. ...

  5. django通用视图(CBV)

    1. 介绍 Django提供了很多通用的基于类的视图(Class Based View),来帮我们简化视图的编写.这些View与上述操作的对应关系如下: 展示对象列表(比如所有用户,所有文章)- Li ...

  6. Django 学习小组:基于类的通用视图详解(一)

    通过三周的时间我们开发了一个简单的个人 Blog,教程地址: 第一周:Django 学习小组:博客开发实战第一周教程 -- 编写博客的 Model 和首页面 第二周:Django 学习小组:博客开发实 ...

  7. Django 基于类的通用视图详解

    原文出处:https://segmentfault.com/a/1190000005685454 Django 学习小组:基于类的通用视图详解(一) 通过三周的时间我们开发了一个简单的个人 Blog, ...

  8. django通用视图(视图类)的login登陆、权限限定

    django的登陆限定和权限限定是view设计中很重要的一个组成.网上的教程大部分都是通过使用view函数的装饰器来实现,比如: @login_required(login_url='/') @per ...

  9. django.views.generic通用视图的CreateView, ListView, UpdateView, DetailView, DeleteView用法

    导入: from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView 入坑指南 用 ...

最新文章

  1. 根据网页地址获取页面内容
  2. 《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍
  3. java 平均分配算法_java 分配算法
  4. h264解码延迟优化_OPPO Enco Free真无线双发耳机提速120ms,延迟优于苹果华为
  5. 苹果 macOS Monterey 桌面抽象风格不好看,如何换成自己喜欢的照片?
  6. linux内核装载vfs过程
  7. 计算机辅助设计autocad2005(建筑)四级考试,计算机辅助设计(AutoCAD平台)
  8. python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理意识.jpg)...
  9. 记事本代码在命令行运行时出现的中文乱码问题
  10. 提高软件开发工作效率的几种方法
  11. Python 中 ‘unicodeescape’ codec can’t decode bytes in position XXX: trun错误原因分析及解决方案
  12. 项目2抽象基类与派生类
  13. 基于OpenCV的视频场景切割神器
  14. sketch插件开发_适用于Web开发人员的10个免费Sketch插件
  15. 进行大数据测试需要关注那些测试点?
  16. 后台指标计算返回数据格式说明5 - DRAWTEXT_FIX格式
  17. C 语言时间函数 秒 毫秒 微秒
  18. 协议h2怎么php,net::ERR_SPDY_PROTOCOL_ERROR 错误 h2 协议,这个具体是什么引起的?
  19. 全国优秀计算机动画作品,分享創意——全国中小学优秀电脑作品分析.ppt
  20. Pascal VOC数据集 下载 百度云

热门文章

  1. 使用tshark对pcap报文进行批量切流
  2. JAVA计算机毕业设计网上投稿管理系统(附源码、数据库)
  3. 寻路算法--深度寻路算法
  4. Java删除list中指定的元素的方法
  5. windows@启用休眠@关闭休眠@删除休眠文件@查看休眠文件@命令行休眠powercfg
  6. 如何保护swf文件不被反编译软件破解?
  7. 项目安装 git cz commitizen
  8. QT学习之QPainter
  9. 雅思口语备考:part3部分的一些万能句型结构
  10. 公共WiFi有风险,使用请注意。