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. php self this parent
  3. 去除字符串中的指定字符
  4. 天翼云从业认证(1.8)了解软件开发的环境、软件基础架构和常用软件开发工具
  5. 学号20145209《信息安全系统设计基础》第11周学习总结
  6. 【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层
  7. mysql 阿里云 版本_关于阿里云centos版本,mysql5.7的一些注意事项
  8. [转]VisualStudio如何组织解决方案的目录结构
  9. email邮件中 内嵌iframe_Python+Selenium执行结果,封装函数,用Python自动发送SMTP邮件...
  10. mysql全套基础知识_mysql系列--基础知识
  11. ios中mvc的FormsAuthentication.SetAuthCookie(cookieUserName, false)失败
  12. C#操作明华澳汉读写器读写M1卡往扇区块写入读取值小结
  13. HTML+CSS简单应用实例——购物网站的制作(一)
  14. python遥感图像处理_遥感数字图像处理
  15. 幻想三国android官方版,幻想三国ol官方版下载
  16. C++使用curl下载文件(post请求)
  17. BUCT-2021年ACM竞赛班训练(一)2021.3.25-问题 A: 大佬的高级IDLE-题解
  18. 服装设计_服装设计网_服装设计图_服装款式图-POP服饰流行前线
  19. PCB电路板3D渲染电路板3D效果图制作方法的一点思路
  20. 微信小程序 页面传值文本解密问题

热门文章

  1. 3种PHP连接MYSQL数据库的常用方法
  2. 第三方软件测试z5x电池,三款手游开黑一天不充电 vivo Z5x续航测试
  3. 数据结构——哈夫曼(Huffman)树+哈夫曼编码
  4. checkedlistbox添加object的方式
  5. python中isalnum函数的用法_python isinstance、isalnum函数用法
  6. java毕业设计晨曦文学社在线投稿系统的设计与实现(附源码、数据库)
  7. KMeans算法实现步骤介绍及Python代码
  8. cmake 学习笔记之相对路径编译动态链接库
  9. [转载]我失业了!亲历创业失败全过程
  10. jspxcms 4.0 mysql 5.0_Jspxcms4.0文件及源码目录结构说明