将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 运算符 供重载参考
Jun 11 Python
Python的for和break循环结构中使用else语句的技巧
May 24 Python
Python利用Beautiful Soup模块创建对象详解
Mar 27 Python
python实现发送邮件功能代码
Dec 14 Python
Jupyter notebook远程访问服务器的方法
May 24 Python
解析PyCharm Python运行权限问题
Jan 08 Python
通过python实现windows桌面截图代码实例
Jan 17 Python
Django展示可视化图表的多种方式
Apr 08 Python
安装pytorch时报sslerror错误的解决方案
May 17 Python
Python基础之元编程知识总结
May 23 Python
python实现自定义日志的具体方法
May 28 Python
python神经网络学习 使用Keras进行回归运算
May 04 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随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
PHP实现APP微信支付的实例讲解
2018/02/10 PHP
laravel 解决路由除了根目录其他都404的问题
2019/10/18 PHP
高性能web开发 如何加载JS,JS应该放在什么位置?
2010/05/14 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
浅析js中的浮点型运算问题
2014/01/06 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
jQuery通过ajax方法获取json数据不执行success的原因及解决方法
2016/10/15 Javascript
利用imgareaselect辅助后台实现图片上传裁剪
2017/03/02 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
mint-ui的search组件在键盘显示搜索按钮的实现方法
2017/10/27 Javascript
微信小程序使用video组件播放视频功能示例【附源码下载】
2017/12/08 Javascript
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
node.js域名解析实现方法详解
2019/11/05 Javascript
Node.JS发送http请求批量检查文件中的网页地址、服务是否有效可用
2019/11/20 Javascript
es6函数之尾递归用法实例分析
2020/04/25 Javascript
跟老齐学Python之正规地说一句话
2014/09/28 Python
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
python删除列表内容
2015/08/04 Python
Python开发如何在ubuntu 15.10 上配置vim
2016/01/25 Python
python机器学习之神经网络(三)
2017/12/20 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
python  Django中的apps.py的目的是什么
2018/10/15 Python
对Matlab中共轭、转置和共轭装置的区别说明
2020/05/11 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
解决pip安装的第三方包在PyCharm无法导入的问题
2020/10/15 Python
德国宠物用品、宠物食品及水族馆网上商店:ZooRoyal
2017/07/09 全球购物
关键字throw与throws的用法差异
2016/11/22 面试题
2014年公司迎新年活动方案
2014/02/24 职场文书
工作保证书范文
2014/04/29 职场文书
医院护士见习期自我鉴定
2014/09/15 职场文书
党的群众路线教育实践活动个人对照检查剖析材料
2014/09/23 职场文书
感动中国何玥观后感
2015/06/02 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript