将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连接池实现示例程序
Nov 26 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
python复制文件到指定目录的实例
Apr 27 Python
Python运维开发之psutil库的使用详解
Oct 18 Python
Python跳出多重循环的方法示例
Jul 03 Python
Python中typing模块与类型注解的使用方法
Aug 05 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
python 协程 gevent原理与用法分析
Nov 22 Python
利用Python实现某OA系统的自动定位功能
May 27 Python
Python下载网易云歌单歌曲的示例代码
Aug 12 Python
Django DRF认证组件流程实现原理详解
Aug 17 Python
使用Python开发冰球小游戏
Apr 30 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的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
Jquery从头学起第四讲 jquery入门教程
2010/08/01 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
输入密码检测大写是否锁定js实现代码
2012/12/03 Javascript
JS实现遮罩层效果的简单实例
2013/11/12 Javascript
jQuery的Scrollify插件实现滑动到页面下一节点
2015/07/05 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
小程序Request的另类用法详解
2019/08/09 Javascript
jQuery实现点击滚动到指定元素上的方法分析
2020/03/19 jQuery
js实现有趣的倒计时效果
2021/01/19 Javascript
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
python基础教程之字典操作详解
2014/03/25 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
浅析Python 中整型对象存储的位置
2016/05/16 Python
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
pandas计算最大连续间隔的方法
2019/07/04 Python
python连接PostgreSQL过程解析
2020/02/09 Python
python下对hsv颜色空间进行量化操作
2020/06/04 Python
html5实现的便签特效(实战分享)
2013/11/29 HTML / CSS
Wiggle澳大利亚:自行车、跑步、游泳商店
2020/11/07 全球购物
银行介绍信范文
2014/01/10 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
毕业生评语大全
2015/01/04 职场文书
新闻稿件写作范文
2015/07/18 职场文书
市级三好生竞选稿
2015/11/21 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
Python实现生成bmp图像的方法
2021/06/13 Python
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫