将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 11 Python
浅谈python多线程和队列管理shell程序
Aug 04 Python
Python中死锁的形成示例及死锁情况的防止
Jun 14 Python
Python字符编码判断方法分析
Jul 01 Python
python 排序算法总结及实例详解
Sep 28 Python
利用Python破解验证码实例详解
Dec 08 Python
python接口自动化测试之接口数据依赖的实现方法
Apr 26 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
python语言线程标准库threading.local解读总结
Nov 10 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
全面介绍python中很常用的单元测试框架unitest
Dec 14 Python
用python修改excel表某一列内容的操作方法
Jun 11 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常用字符串比较函数实例汇总
2014/11/24 PHP
PHP对象相关知识总结
2017/04/09 PHP
Javascript里使用Dom操作Xml
2007/01/22 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
jQuery实现鼠标经过弹出提示信息的地图热点效果
2015/08/07 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
jQGrid Table操作列中点击【操作】按钮弹出按钮层的实现代码
2016/12/05 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
详解JS数值Number类型
2018/02/07 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
nodejs实现范围请求的实现代码
2018/10/12 NodeJs
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
Python写的Tkinter程序屏幕居中方法
2015/03/10 Python
Python去除字符串两端空格的方法
2015/05/21 Python
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
使用python实现链表操作
2018/01/26 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
Flask配置Cors跨域的实现
2019/07/12 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
Python实现序列化及csv文件读取
2020/01/19 Python
python如何判断IP地址合法性
2020/04/05 Python
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
2014年学生工作总结
2014/11/20 职场文书
西柏坡导游词
2015/02/05 职场文书
2015年个人思想总结
2015/03/09 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
JS + HTML 罗盘式时钟的实现
2021/05/21 Javascript
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL