3行代码将PDF中表格转成Excel文件

2022-04-26 19:07:40 浏览数 (1)

前言:

之前有粉丝问我,能不能帮忙写个脚本,把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大法。如果想每个月、甚至每个周都有相同的任务,可考虑用代码解决。

我是马拉松程序员,可不止于代码!

0 人点赞