将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任务调度实例分析
May 19 Python
在Python的Django框架中创建和使用模版
Jul 15 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
浅析Python函数式编程
Oct 06 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
python用for循环求和的方法总结
Jul 08 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
python3.x中安装web.py步骤方法
Jun 23 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
Jun 28 Python
Python 如何操作 SQLite 数据库
Aug 17 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
建站常用13种PHP开源CMS比较
2009/08/23 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
2015/12/18 PHP
PHP版本升级到7.x后wordpress的一些修改及wordpress技巧
2015/12/25 PHP
PHP设计模式之观察者模式实例
2016/02/22 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
javascript 一些用法小结
2009/09/11 Javascript
JavaScript的变量作用域深入理解
2009/10/25 Javascript
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
删除节点的jquery代码
2014/01/13 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
Bootstrap进度条实现代码解析
2017/03/07 Javascript
Dropify.js图片宽高自适应的方法
2017/11/27 Javascript
基于vue2实现左滑删除功能
2017/11/28 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
[42:56]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
基于Python的身份证号码自动生成程序
2014/08/15 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
python实现图片文件批量重命名
2020/03/23 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
Python使用pyexecjs代码案例解析
2020/07/13 Python
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
毕业生动漫设计求职信
2013/10/11 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
学习之星事迹材料
2014/05/17 职场文书
租房协议书范文
2014/08/20 职场文书
坎儿井导游词
2015/02/09 职场文书
狂人日记读书笔记
2015/06/30 职场文书