在写系统时,总是会遇见需要给用户提供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相关推荐

  1. Java纯后端生成PDF格式报表的三种方案(包含echarts图表)

    最近做了一个奇葩的需求,研究了一下Java纯后端生成PDF报表的方案,顺便将研究的方案做个总结复盘,分享一下. 需求分析:Java后端定时任务统计汇总成报表数据,并生成PDF格式的报表文件,并通过邮件 ...

  2. 后端生成PDF一些工具

    大致分为以下几种 1.利用PDF模板,读入模板,填充数据,生成带数据的PDF 先要生成自己的PDF模板,然后在模板中定义变量,等待代码填充变量值. 优点:代码简单: 缺点:模板要先提供,表单域的变量只 ...

  3. java后端生成pdf模板合并单元格表格

    这里只放部分片段的代码 java中使用二维数组生成表格非常方便,但是每一维的数组都需要排好序,而且,在java中所谓的二维数组,三维数组等,其实都是多个一维数组组成的 /*** 添加子女教育规划表.* ...

  4. html转换成pdf工具-wkhtmltopdf、Python生成PDF(pdfkit库)

    文章目录 一.html转换成pdf工具-wkhtmltopdf 1. 什么是wkhtmltopdf 2. 如何使用它? 3. 常见问题 error while loading shared libra ...

  5. 利用Django生成PDF文档

    利用Django生成PDF文档 本小节说明如何利用Django视图动态生成PDF文档.此功能是由优秀的开源Python PDF库ReportLab实现的. 动态生成PDF文档的好处在于你可以定制PDF ...

  6. pdfkit生成pdf,可用于notebook

    1.安装pdfkit库 在命令行中输入如下命令 pip install pdfkit 出现上面的Successfully installed pdfkit-0.6.1提示,说明安装成功了 2.安装wk ...

  7. mdbook-pdf: 用于生成 PDF 文件的 mdBook 后端

    简介 mdBook 允许您从 Markdown 文件创建书籍.它与 Gitbook 非常相似,但使用 Rust 实现.但是,与 Gitbook 支持使用 calibre 生成 PDF 不同,长期以来, ...

  8. java调用wkhtmltopdf生成pdf文件,美观,省事

    最近项目需要导出企业风险报告,文件格式为pdf,于是搜了一大批文章都是什么Jasper Report,iText ,flying sauser ,都尝试了一遍,感觉不是我想要的效果, 需要自己调整好多 ...

  9. django生成文件txt、pdf(在生成 PDF 文件之前,需要安装 ReportLab 库)

    from django.http import HttpResponse def download_file(request): # Text file #response = HttpRespons ...

最新文章

  1. Oracle PL/SQL语言入门
  2. 查看wcf服务中方法测试客户端
  3. XP屏幕上下翻转的现象及解决
  4. 技本功丨知否知否,Redux源码竟如此意味深长(下集)
  5. 阿里当初50亿美元收购UC,现在看来是不是亏大了?
  6. Unix/Linux环境C编程入门教程(16) LinuxMint CCPP开发环境搭建
  7. 进程handle获取线程_获取进程中的线程列表
  8. finereport字段显示设置_如何在Excel中显示和编辑中文拼音字段
  9. Windows编程—Windows驱动开发环境搭建
  10. 去Oracle不仅是BAT的事,AWS彻底去O
  11. opengl学习笔记(六)
  12. java object jsonobject_JSONObject简介
  13. 定义CPU阀值(转)
  14. FancyCoverFlow(GalleryView)
  15. Office操作技巧——利用Excel实现文件夹批量重命名
  16. 论语十二章原文及翻译
  17. 几何画板用迭代法作图的技巧
  18. 三八节买什么数码好物?三八女神节实用不吃灰的数码好物推荐
  19. 空格(Space)的ASCII码值是:32
  20. 我为什么要写博客,写博客的意义是什么

热门文章

  1. 知乎高赞:为什么有些大公司技术弱爆了?
  2. mybatis逆向工程的使用,自动生成实体类与基础SQL
  3. 全网最全音视频媒体流
  4. 人性的弱点-读书总结
  5. 经典的soo单点登录实现
  6. 淘宝双主图技术解析(附工具包)
  7. windows内存清理工具
  8. react-store
  9. vb如何设置父窗体与子窗体——MDI窗体
  10. Java PDF转HTML、Word、图片、SVG、XPS、 PDF/A等格式文件