将Python字符串生成PDF的实例代码详解


Posted in Python onMay 17, 2019

笔者在今天的工作中,遇到了一个需求,那就是如何将Python字符串生成PDF。比如,需要把Python字符串‘这是测试文件'生成为PDF, 该PDF中含有文字‘这是测试文件'。

  经过一番检索,笔者决定采用wkhtmltopdf这个软件,它可以将HTML转化为PDF。wkhtmltopdf的访问网址为:https://wkhtmltopdf.org/downloads.html ,读者可根据自己的系统下载对应的文件并安装。安装好wkhtmltopdf,我们再安装这个软件的Python第三方模块——pdfkit,安装方式如下:

pip install pdfkit

  我们再讨论如下问题:

•如何将Python字符串生成PDF;
•如何生成PDF中的表格;
•解决PDF生成速度慢的问题。

如何将Python字符串生成PDF

  该问题的解决思路还是利用将Python字符串嵌入到HTML代码中解决,注意换行需要用<br>标签,示例代码如下:

import pdfkit
# PDF中包含的文字
content = '这是一个测试文件。' + '<br>' + 'Hello from Python!'
html = '<html><head><meta charset="UTF-8"></head>' \
 '<body><div align="center"><p>%s</p></div></body></html>'%content
# 转换为PDF
pdfkit.from_string(html, './test.pdf')

输出的结果如下:

Loading pages (1/6)
 Counting pages (2/6)
 Resolving links (4/6)
 Loading headers and footers (5/6)
 Printing pages (6/6)
 Done

生成的test.pdf如下:

将Python字符串生成PDF的实例代码详解

如何生成PDF中的表格

  接下来我们考虑如何将csv文件转换为PDF中的表格,思路还是利用HTML代码。示例的iris.csv文件(部分)如下:

将Python字符串生成PDF的实例代码详解

 将csv文件转换为PDF中的表格的Python代码如下:

import pdfkit
# 读取csv文件
with open('iris.csv', 'r') as f:
 lines = [_.strip() for _ in f.readlines()]
# 转化为html中的表格样式
td_width = 100
content = '<table width="%s" border="1" cellspacing="0px" style="border-collapse:collapse">' % (td_width*len(lines[0].split(',')))
for i in range(len(lines)):
 tr = '<tr>'+''.join(['<td width="%d">%s</td>'%(td_width, _) for _ in lines[i].split(',')])+'</tr>'
 content += tr
content += '</table>'
html = '<html><head><meta charset="UTF-8"></head>' \
 '<body><div align="center">%s</div></body></html>' % content
# 转换为PDF
pdfkit.from_string(html, './iris.pdf')

  生成的PDF文件为iris.pdf,部分内容如下:

将Python字符串生成PDF的实例代码详解

解决PDF生成速度慢的问题

  用pdfkit生成PDF文件虽然方便,但有一个比较大的缺点,那就是生成PDF的速度比较慢,这里我们可以做个简单的测试,比如生成100份PDF文件,里面的文字为“这是第*份测试文件!”。Python代码如下:

import pdfkit
import time
start_time = time.time()
for i in range(100):
 content = '这是第%d份测试文件!'%(i+1)
 html = '<html><head><meta charset="UTF-8"></head>' \
  '<body><div align="center">%s</div></body></html>' % content
 # 转换为PDF
 pdfkit.from_string(html, './test/%s.pdf'%(i+1))
end_time = time.time()
print('一共耗时:%s 秒.' %(end_time-start_time))

在这个程序中,生成100份PDF文件一共耗时约192秒。输出结果如下:

......
Loading pages (1/6)
Counting pages (2/6)                                              
Resolving links (4/6)                                                      
Loading headers and footers (5/6)                                          
Printing pages (6/6)
Done                                                                     
一共耗时:191.9226369857788 秒.

  如果想要加快生成的速度,我们可以使用多线程来实现,主要使用concurrent.futures模块,完整的Python代码如下:

import pdfkit
import time
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED
start_time = time.time()
# 函数: 生成PDF
def convert_2_pdf(i):
 content = '这是第%d份测试文件!'%(i+1)
 html = '<html><head><meta charset="UTF-8"></head>' \
  '<body><div align="center">%s</div></body></html>' % content
 # 转换为PDF
 pdfkit.from_string(html, './test/%s.pdf'%(i+1))
# 利用多线程生成PDF
executor = ThreadPoolExecutor(max_workers=10) # 可以自己调整max_workers,即线程的个数
# submit()的参数: 第一个为函数, 之后为该函数的传入参数,允许有多个
future_tasks = [executor.submit(convert_2_pdf, i) for i in range(100)]
# 等待所有的线程完成,才进入后续的执行
wait(future_tasks, return_when=ALL_COMPLETED)
end_time = time.time()
print('一共耗时:%s 秒.' %(end_time-start_time))

在这个程序中,生成100份PDF文件一共耗时约41秒,明显快了很多~

总结

以上所述是小编给大家介绍的将Python字符串生成PDF的相关知识,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
实例讲解Python中函数的调用与定义
Mar 14 Python
Python tkinter模块中类继承的三种方式分析
Aug 08 Python
Python可变参数*args和**kwargs用法实例小结
Apr 27 Python
基于python实现名片管理系统
Nov 30 Python
对python读写文件去重、RE、set的使用详解
Dec 11 Python
由面试题加深对Django的认识理解
Jul 19 Python
Python时间序列缺失值的处理方法(日期缺失填充)
Aug 11 Python
Python爬虫实现“盗取”微信好友信息的方法分析
Sep 16 Python
python之yield和Generator深入解析
Sep 18 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
python3.8下载及安装步骤详解
Jan 15 Python
Python requests上传文件实现步骤
Sep 15 Python
Python Django框架单元测试之文件上传测试示例
May 17 #Python
Python django框架应用中实现获取访问者ip地址示例
May 17 #Python
Python Django框架实现应用添加logging日志操作示例
May 17 #Python
Python实现通过解析域名获取ip地址的方法分析
May 17 #Python
如何用C代码给Python写扩展库(Cython)
May 17 #Python
python实现坦克大战游戏 附详细注释
Mar 27 #Python
六行python代码的爱心曲线详解
May 17 #Python
You might like
坏狼的PHP学习教程之第1天
2008/06/15 PHP
php数据库抽象层 PDO
2011/05/07 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
php中jpgraph类库的使用介绍
2013/08/08 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
javascript编程起步(第六课)
2007/02/27 Javascript
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
JS操作Cookies的小例子
2013/10/15 Javascript
js完美解决IE6不支持position:fixed的bug
2015/04/24 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
JavaScript中函数声明与函数表达式的区别详解
2016/08/18 Javascript
ES6模块化的import和export用法方法总结
2017/08/08 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
2017/09/10 Javascript
微信小程序实现全局搜索代码高亮的示例
2018/03/30 Javascript
nodejs多版本管理总结
2018/04/03 NodeJs
浅谈React之状态(State)
2018/09/19 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
2019/01/18 jQuery
JS中数据结构与算法---排序算法(Sort Algorithm)实例详解
2019/06/17 Javascript
Vue实现背景更换颜色操作
2020/07/17 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
python利用matplotlib库绘制饼图的方法示例
2016/12/18 Python
Python中enumerate函数代码解析
2017/10/31 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
python实现websocket的客户端压力测试
2019/06/25 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
python中os包的用法
2020/06/01 Python
Python collections.defaultdict模块用法详解
2020/06/18 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
印刷技术专业自荐信
2014/09/18 职场文书
新郎接新娘保证书
2015/05/08 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript