将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中的socket模块使用代理实例
May 29 Python
在Python3中使用asyncio库进行快速数据抓取的教程
Apr 02 Python
Python与shell的3种交互方式介绍
Apr 11 Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 Python
python测试mysql写入性能完整实例
Jan 18 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
关于PyTorch 自动求导机制详解
Aug 18 Python
详解Python Opencv和PIL读取图像文件的差别
Dec 27 Python
python两个list[]相加的实现方法
Sep 23 Python
python脚本定时发送邮件
Dec 22 Python
Python之京东商品秒杀的实现示例
Jan 06 Python
浅析Python实现DFA算法
Jun 26 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
YII Framework框架教程之使用YIIC快速创建YII应用详解
2016/03/15 PHP
php制作圆形用户头像的实例_自定义封装类源代码
2017/09/18 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
firefox中用javascript实现鼠标位置的定位
2007/06/17 Javascript
网页中的图片的处理方法与代码
2009/11/26 Javascript
jquery入门—访问DOM对象方法
2013/01/07 Javascript
JS实现QQ图片一闪一闪的效果小例子
2013/07/31 Javascript
JavaScript+canvas实现七色板效果实例
2016/02/18 Javascript
安装使用Mongoose配合Node.js操作MongoDB的基础教程
2016/03/01 Javascript
jQuery排序插件tableSorter使用方法
2017/02/10 Javascript
在vue中获取微信支付code及code被占用问题的解决方法
2019/04/16 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
详解element-ui中表单验证的三种方式
2019/09/18 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
python分析作业提交情况
2017/11/22 Python
教你用Python写安卓游戏外挂
2018/01/11 Python
python批量替换页眉页脚实例代码
2018/01/22 Python
PyTorch读取Cifar数据集并显示图片的实例讲解
2018/07/27 Python
python实现狄克斯特拉算法
2019/01/17 Python
Python画图高斯分布的示例
2019/07/10 Python
对python中的装包与解包实例详解
2019/08/24 Python
详解python itertools功能
2020/02/07 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
html5 分层屏幕适配的方法
2018/03/16 HTML / CSS
html5 兼容IE6结构的实现代码
2012/05/14 HTML / CSS
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
智能家居、吸尘器、滑板车、电动自行车网上购物:Geekmaxi
2021/01/18 全球购物
小学红领巾广播稿(3篇)
2014/09/13 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
大学生英文求职信范文
2015/03/19 职场文书
2015年创先争优工作总结
2015/05/23 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
庭外和解协议书
2016/03/23 职场文书