将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 文件与目录操作
Dec 24 Python
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
Jul 11 Python
使用python编写批量卸载手机中安装的android应用脚本
Jul 21 Python
Python中类型关系和继承关系实例详解
May 25 Python
python入门基础之用户输入与模块初认识
Nov 14 Python
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
Apr 09 Python
Python中GIL的使用详解
Oct 03 Python
解决Pycharm下面出现No R interpreter defined的问题
Oct 29 Python
python中logging模块的一些简单用法的使用
Feb 22 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
python 删除系统中的文件(按时间,大小,扩展名)
Nov 19 Python
python用tkinter开发的扫雷游戏
Jun 01 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
建立动态的WML站点(一)
2006/10/09 PHP
php中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
简单的php文件上传(实例)
2013/10/27 PHP
php实现mysql数据库分表分段备份
2015/06/18 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
jquery中的 $(&quot;#jb51&quot;)与document.getElementById(&quot;jb51&quot;) 的区别
2011/07/26 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
jQuery实现炫酷的鼠标轨迹特效
2015/02/01 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
微信小程序 scroll-view隐藏滚动条详解
2017/01/16 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
[02:19]DOTA2女子战队FOX视频专访:希望更多美眉一起加入
2013/10/15 DOTA
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
Python+pyplot绘制带文本标注的柱状图方法
2019/07/08 Python
Python txt文件如何转换成字典
2020/11/03 Python
python模块内置属性概念及实例
2021/02/18 Python
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
简历中自我评价范文3则
2013/12/14 职场文书
高一生物教学反思
2014/01/17 职场文书
单位提档介绍信
2014/01/17 职场文书
办公室主任岗位承诺书
2014/05/29 职场文书
关爱残疾人标语
2014/06/25 职场文书
联谊活动总结范文
2015/05/09 职场文书
复兴之路观后感
2015/06/02 职场文书
MATLAB 全景图切割及盒图显示的实现步骤
2021/05/14 Python
C3 线性化算法与 MRO之Python中的多继承
2021/10/05 Python