Django 实现HTML转PDF 用通用视图编写PDF 并且让PDF支持中文
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 依赖于取决于:
- django>=1.10
- xhtml2pdf>=0.2b1
- 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,也要卸载所安装的依赖
- django>=1.10
- xhtml2pdf>=0.2b1
- reportlab
然后就是安装了,一条指令的事情
pip3.6 install -U django-easy-pdf WeasyPrint
有关WeasyPrint依赖的安装说明,请参阅http://weasyprint.readthedocs.io/en/latest/install.html
待续…
Django 实现HTML转PDF 用通用视图编写PDF 并且让PDF支持中文相关推荐
- django 1.8 官方文档翻译: 3-4-2 基于类的内建通用视图
基于类的内建通用视图 编写Web应用可能是单调的,因为你需要不断的重复某一种模式. Django尝试从model和 template层移除一些单调的情况,但是Web开发者依然会在view(视图)层经历 ...
- Python Django CBV下的通用视图函数
ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request):retur ...
- 深入Django(1): 通用视图 (generic views)
如果对Django的基础部分尚不熟悉,请参考<Django实战>系列. 内容提要 1. 回顾Django的视图函数(view function) 2. 在视图函数中使用模板 3. 简化视图 ...
- Django笔记7(通用视图)
1. 一个呈现静态"关于"页面的URLconf from django.conf.urls.defaults import * from django.views.generic. ...
- django通用视图(CBV)
1. 介绍 Django提供了很多通用的基于类的视图(Class Based View),来帮我们简化视图的编写.这些View与上述操作的对应关系如下: 展示对象列表(比如所有用户,所有文章)- Li ...
- Django 学习小组:基于类的通用视图详解(一)
通过三周的时间我们开发了一个简单的个人 Blog,教程地址: 第一周:Django 学习小组:博客开发实战第一周教程 -- 编写博客的 Model 和首页面 第二周:Django 学习小组:博客开发实 ...
- Django 基于类的通用视图详解
原文出处:https://segmentfault.com/a/1190000005685454 Django 学习小组:基于类的通用视图详解(一) 通过三周的时间我们开发了一个简单的个人 Blog, ...
- django通用视图(视图类)的login登陆、权限限定
django的登陆限定和权限限定是view设计中很重要的一个组成.网上的教程大部分都是通过使用view函数的装饰器来实现,比如: @login_required(login_url='/') @per ...
- django.views.generic通用视图的CreateView, ListView, UpdateView, DetailView, DeleteView用法
导入: from django.views.generic import CreateView, ListView, UpdateView, DetailView, DeleteView 入坑指南 用 ...
最新文章
- 根据网页地址获取页面内容
- 《玩转D语言系列》二、D语言现状、基本规定和相关资源介绍
- java 平均分配算法_java 分配算法
- h264解码延迟优化_OPPO Enco Free真无线双发耳机提速120ms,延迟优于苹果华为
- 苹果 macOS Monterey 桌面抽象风格不好看,如何换成自己喜欢的照片?
- linux内核装载vfs过程
- 计算机辅助设计autocad2005(建筑)四级考试,计算机辅助设计(AutoCAD平台)
- python背景怎么自定义铃声_Python 上课铃声的定时播放(具有较强的自我管理意识.jpg)...
- 记事本代码在命令行运行时出现的中文乱码问题
- 提高软件开发工作效率的几种方法
- Python 中 ‘unicodeescape’ codec can’t decode bytes in position XXX: trun错误原因分析及解决方案
- 项目2抽象基类与派生类
- 基于OpenCV的视频场景切割神器
- sketch插件开发_适用于Web开发人员的10个免费Sketch插件
- 进行大数据测试需要关注那些测试点?
- 后台指标计算返回数据格式说明5 - DRAWTEXT_FIX格式
- C 语言时间函数 秒 毫秒 微秒
- 协议h2怎么php,net::ERR_SPDY_PROTOCOL_ERROR 错误 h2 协议,这个具体是什么引起的?
- 全国优秀计算机动画作品,分享創意——全国中小学优秀电脑作品分析.ppt
- Pascal VOC数据集 下载 百度云