django+wkhtmltopdf后端生成pdf
在写系统时,总是会遇见需要给用户提供pdf下载的功能,pdf生成方式多种多样,有通过前端生成pdf,也有使用后端生成pdf的方式。在这篇文章前已经有写过生成pdf的文章,使用的是php调用wkhtmltopdf的方式,部署在windows上,写这篇文章的时候,使用django作为后端,部署在ubuntu上,并且生成的pdf中有echarts绘制的图,所以写了这篇新的文章,有兴趣的可以去看看之前的文章最完美的html转化为pdf的方法
wkhtmltopdf安装
wkhtmltopdf是一个使用 Qt WebKit 引擎做渲染的,能够把html 文档转换成 pdf 文档 或 图片(image) 的命令行工具,支持多个平台,可在win,linux,os x 等系统下运行。
多平台的优势让你可以无痛切换系统使用
可以前往官网下载符合条件的安装包wkhtmltopdf下载官网
我的服务器系统是ubuntu20.04,直接使用命令wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.focal_amd64.deb
下载安装包。(有时候命令行很酷,但是会被网速一棒子打死,请选择你能下载下来的方式)
下载完进行安装sudo dpkg -i wkhtmltox_0.12.6-1.focal_amd64.deb
输入wkhtmltopdf -V
显示版本号即安装成功
这是一个命令行工具,可以简单地拿百度主页尝试一下,输入命令行wkhtmltopdf http://baidu.com test.pdf
发现当前目录下出现一个test.pdf,效果如下。
python调用wkhtmlpdf
现在只需要用python代码来执行该软件就能生成pdf,将pdf提供给用户下载,python控制wkhtmltopdf十分方便,只需要pip安装一个包,命令行执行pip install pdfkit
先简单的写一个html界面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><button>点击我下载</button>
</body>
</html>
控制器views.py代码
from django.shortcuts import render
def test(request):return render(request, 'index/test.html')
路由规则urls.py代码
path('test', views.test),
显示界面
这个时候为点击按钮赋予一个点击事件,向后台请求pdf下载
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><button id="download">点击我下载</button>
</body>
<script src="{% static 'index/js/jquery.min.js' %}"></script>
<script>$('#download').bind('click', function() {location.href = '/pdf_download';})
</script>
</html>
上面需要引入jquery文件,也可以直接改成a标签
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><a href="/pdf_download">点击我下载</a>
</body>
</html>
效果都是一样的,然后需要在views.py里在写一个控制器,来处理前端的请求
import pdfkit
from django.http import FileResponse
def pdf_download(request):root_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))pdf_path = os.path.join(root_path, 'test.pdf')# pdf路径可以自己修改options = {'encoding': "utf-8",# 'javascript-delay': '1000', # 添加页面延时js执行时间段 echarts}url = 'http://baidu.com' # 简单使用百度来实验,可以换成自己需要下载的页面,自己的文档什么的pdfkit.from_url(url, pdf_path, options=options)file = open(pdf_path, 'rb')response = FileResponse(file)response['Content-Type'] = 'application/octet-stream'download_file_name = '嘎嘎嘎.pdf' # 如果取中文名,需要urlquote()编码转换response['Content-Disposition'] = 'attachment;filename="' + urlquote(download_file_name) + '"'return response
上面代码需要注意,如果是自己制作的有echarts的界面,需要加上参数’javascript-delay’,不然图会在还没绘制就被生成pdf,最后点击下载查看效果
上面使用的都是最简单的示例,有其他需求可以自己加入,像生成的pdf会保存在本地,那么需要设置好命名规范,可以使用时间戳来命名,当然时间久了生成的pdf文件会很多,这需要代码定时清理文件。示例中pdf下载是直接返回一个一个fileresponse对象,浏览会直接下载pdf。但如果是异步请求下载,那么返回一个fileresponse对象是无法让浏览器下载的,需要更多的处理。
排版
上述示例都是简单的界面,在实际中需要生成的pdf往往会是页数很多的页面,像这种页数很多的网页需要排版,分页的地方如果会截断内容则需要做特别处理,我们可以使用一些css属性调整这种截断,处理使用最基础的高度设置外,可以利用打印属性来调整分页。最简单的在某一块div加上css属性style="page-break-after:always"
,那么在生成pdf时候后面的内容会出现在下一页。其他属性都可以去尝试使用
属性 | 简介 |
---|---|
page | 检索或指定显示对象容器时使用的页面类型 |
Page-break-before | 检索或设置对象之前出现的页分割符 |
Page-break-after | 检索或设置对象之后出现的页分割符 |
Page-break-inside | 检索或设置对象容器内部出现的页分割符 |
错误
在本地运行没有错误,但是部署到服务器上时会出现一些问题
pdfkit找不到wkhtmltopdf软件路径
使用pdfkit时是默认自己查找软件的路径的,linux中执行which
命令查找,windows使用wkere
命令查找,如果没有配置该软件的环境变量就会出现问题,这个时候可以在代码中指定好软件的路径。
config = pdfkit.configuration(wkhtmltopdf='wkhtmltopdf的路径') # windows是.exe的路径
pdfkit.from_url("目的网址", "输出pdf", configuration=config)
pdf中文是框框
如果中文部分是一个个框框,那是因为系统缺少中文字体,只需要在系统中安装字体就行,中文字体可以去windows系统目录C:\Windows\Fonts
下获取
将下载的字体移动到/usr/share/fonts
下,可以在该文件下载创建一个文件夹。
ubuntu需要先安装一些命令吗, 如果安装失败可以去手动下载安装包进行安装
# 使mkfontscale和mkfontdir命令正常运行
sudo apt-get install ttf-mscorefonts-installer
# 使fc-cache命令正常运行
sudo apt-get install fontconfig
进入到移动过来的字体所在目录下,先修改字体权限,使其他用户也可以使用
sudo chmod 755 *.ttf
然后依次执行
sudo mkfontscale #生成核心字体信息
sudo mkfontdir
sudo fc-cache -fv #刷新系统字体缓存
最后使用命令查看fc-list :lang=zh
安装的中文字体,可以看见你刚刚安装的字体即成功
pdf中文是乱码
如果中文部分是乱码,那么直接中文编码的问题,那么在需要生成的html文件中增加编码格式
<meta http-equiv="content-type" content="text/html;charset=utf-8">
心得
使用wkhtmltopdf生成pdf已经是我优先使用的pdf生成方式,无论是换框架还是换系统,wkhtmltopdf都能适用,该软件使用起来便捷,而且命令行执行,所有的语言都可以轻松的调用该软件,功能上不仅能生成pdf还能生成图片,效果好,功能强大。
django+wkhtmltopdf后端生成pdf相关推荐
- Java纯后端生成PDF格式报表的三种方案(包含echarts图表)
最近做了一个奇葩的需求,研究了一下Java纯后端生成PDF报表的方案,顺便将研究的方案做个总结复盘,分享一下. 需求分析:Java后端定时任务统计汇总成报表数据,并生成PDF格式的报表文件,并通过邮件 ...
- 后端生成PDF一些工具
大致分为以下几种 1.利用PDF模板,读入模板,填充数据,生成带数据的PDF 先要生成自己的PDF模板,然后在模板中定义变量,等待代码填充变量值. 优点:代码简单: 缺点:模板要先提供,表单域的变量只 ...
- java后端生成pdf模板合并单元格表格
这里只放部分片段的代码 java中使用二维数组生成表格非常方便,但是每一维的数组都需要排好序,而且,在java中所谓的二维数组,三维数组等,其实都是多个一维数组组成的 /*** 添加子女教育规划表.* ...
- html转换成pdf工具-wkhtmltopdf、Python生成PDF(pdfkit库)
文章目录 一.html转换成pdf工具-wkhtmltopdf 1. 什么是wkhtmltopdf 2. 如何使用它? 3. 常见问题 error while loading shared libra ...
- 利用Django生成PDF文档
利用Django生成PDF文档 本小节说明如何利用Django视图动态生成PDF文档.此功能是由优秀的开源Python PDF库ReportLab实现的. 动态生成PDF文档的好处在于你可以定制PDF ...
- pdfkit生成pdf,可用于notebook
1.安装pdfkit库 在命令行中输入如下命令 pip install pdfkit 出现上面的Successfully installed pdfkit-0.6.1提示,说明安装成功了 2.安装wk ...
- mdbook-pdf: 用于生成 PDF 文件的 mdBook 后端
简介 mdBook 允许您从 Markdown 文件创建书籍.它与 Gitbook 非常相似,但使用 Rust 实现.但是,与 Gitbook 支持使用 calibre 生成 PDF 不同,长期以来, ...
- java调用wkhtmltopdf生成pdf文件,美观,省事
最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...
- django生成文件txt、pdf(在生成 PDF 文件之前,需要安装 ReportLab 库)
from django.http import HttpResponse def download_file(request): # Text file #response = HttpRespons ...
最新文章
- Oracle PL/SQL语言入门
- 查看wcf服务中方法测试客户端
- XP屏幕上下翻转的现象及解决
- 技本功丨知否知否,Redux源码竟如此意味深长(下集)
- 阿里当初50亿美元收购UC,现在看来是不是亏大了?
- Unix/Linux环境C编程入门教程(16) LinuxMint CCPP开发环境搭建
- 进程handle获取线程_获取进程中的线程列表
- finereport字段显示设置_如何在Excel中显示和编辑中文拼音字段
- Windows编程—Windows驱动开发环境搭建
- 去Oracle不仅是BAT的事,AWS彻底去O
- opengl学习笔记(六)
- java object jsonobject_JSONObject简介
- 定义CPU阀值(转)
- FancyCoverFlow(GalleryView)
- Office操作技巧——利用Excel实现文件夹批量重命名
- 论语十二章原文及翻译
- 几何画板用迭代法作图的技巧
- 三八节买什么数码好物?三八女神节实用不吃灰的数码好物推荐
- 空格(Space)的ASCII码值是:32
- 我为什么要写博客,写博客的意义是什么