前言:
之前有粉丝问我,能不能帮忙写个脚本,把PDF文件中的表格转成Excel。我说现在我没那么多时间,你可以去看看《学习Python 不加班》那本书中应该是会有相应的一些案例。然后呢就没有然后了。今天有空我来写一个转换脚本,一共3行代码搞定。
需求:
将PDF文件中的表格转成Excel文件
背景知识:
本次我们使用的转换包是Camelot 。
源码地址:
https://github.com/socialcopsdev/camelot
它自己的slogan是
Camelot is a Python library that makes it easy for anyone to extracttables from PDF files!
翻译一下就是Camelot是一个Python库,任何人都可以轻松地从PDF文件中提取表格!
Camelot特点:
- Camelot允许你通过调整设置项来精确控制数据的提取过程
- 可以根据空白和精度指标来判断坏的表格,并丢弃,而不必手动检查
- 每一个表格数据是一个panda的dataframe,从而可以很方便的集成到ETL和数据分析工作流中
- 可以把数据导出为各种不同的格式比如CSV、JSON、EXCEL、HTML
总结一句话,你可以认为这个库很牛逼就完事了。
在使用Camelot 会有很多的依赖,它可以做到表格的格式不缺失,依赖OPENCV的相关实现,具体的细节不做赘述,感兴趣的自行github。
安装步骤:
1.pip installcamelot-py[cv]
注意:这里需要安装的是camelot-py ,如果安装的camelot,并不是此库。先卸载再安装,否则在import 的时候找不到相应的包。
2.可能需要安装其他的相关依赖库。比如PyPDF2,opencv等,根据自己的环境的需求一个个的安装。
3.安装Ghostscript
Ghostscript是一套建基于Adobe、PostScript及可移植文档格式(PDF)的页面描述语言等而编译成的免费软件。
Camelot 还很依赖这个软件,在window下的安装步骤:
1.官网下载:
https://ghostscript.com/download/gsdnld.html
一般情况下都是用这个版本的
2. 下载安装,过程不多赘述,就是普通的程序安装。
3. ※配置环境变量,在系统环境变量中添加上新安装的ghostscript。
这是我安装的目录
4. 检查是否安装成功,运行命令:gswin64
命令行工具中运行gswin64,如果能启动软件,说明安装OK
5. ※重启电脑,重启电脑是为了Camelot 能找到ghostscript ,如果不重启的话,直接运行Camelot 代码还是不行。但是直接运行gs是没有问题的。
下载测试文件:
一般情况下,演示PDF转换效果,会找一个比较简单的pdf文件,做测试,看下能否跑通。但是我的电脑里一时间竟然没有找到一个合适的pdf文件(包含表格的)。所以呢,我只能去网上下载,索性干脆找一个相对内容丰富一点的。这样才可以看到Camelot 的转换效果。
什么pdf的内容丰富还包含表格呢,那肯定是上市公司的财报了。
所以去巨潮资讯网(http://www.cninfo.com.cn)下载上市公司的财报。
我随意找了一家当下行情比较好的宁德时代的2021的Q1财报。内容比较多,我这里截取第3页的内容。
文件:宁德时代:2021年第一季度报告全文.PDF
完成目标:
读取宁德时代的Q1财报PDF中的主要会计数据和财务指标转成excel表格。
目标是不是很清晰。开始写代码吧。
编写代码:
代码语言:javascript复制import camelot
tables = camelot.read_pdf('宁德时代:2021年第一季度报告全文.PDF', pages="3")
tables[0].to_excel('Q1.xlsx')
运行一下,在根目录下创建出来Q1.xlsx文件,打开看下,是不是跟pdf中内容一样。
文件:Q1.xlsx
功能解析:
1.提取的主要功能是通过camelot中的read_pdf()方法实现的。在read_pdf()方法的参数如下所示:
代码语言:javascript复制def read_pdf(
filepath, # 读取的pdf文件路径,必填
pages="1", #读取页码,多页中间用,隔开,可选
password=None,#pdf密码,可选
flavor="lattice",#解析风格,可选lattice或者stream,默认前者
suppress_stdout=False, #输出所有日志和警告,默认为False
layout_kwargs={},#设置相关解析的其他参数,默认为空
**kwargs)
2.camelot方法有两种解析模式:流解析(stream)、格子解析(lattice),其中格子解析能够保留表格完整的样式,对于复杂表格来说要优于流解析模式。同时,camelot方法默认格子解析(lattice),而采用这种解析方式,需要安装ghostscript。【安装完成注意配置环境变量】
3.pages 参数,默认是"1",也就是解析第一页,如果第一页没有表格,则tables结果为空。如果全文档解析,可配置pages ="all"。
其他问题bug:
在解析某些pdf时候,可能会存在编码错误的问题:
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-9: ordinal not in range(256)
问题原因:
camelot引用的PyPDF2库中的工具类,使用的编码是latin-1,将此改成编码兼容性更高的utf-8编码即可。
总结:
自动化工具的应用场景是多次、重复性、有规则的操作,如果仅仅是单次的任务或需求,最简单的方式就是cv大法。如果想每个月、甚至每个周都有相同的任务,可考虑用代码解决。
我是马拉松程序员,可不止于代码!