前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用Python提取PDF表格及文本,并保存到Excel

如何使用Python提取PDF表格及文本,并保存到Excel

作者头像
IT阅读排行榜
发布2021-04-20 11:24:13
4.5K0
发布2021-04-20 11:24:13
举报
文章被收录于专栏:华章科技华章科技

导读:介绍一个开源Python工具库——pdfplumber。

作者:朱卫军

来源:Python大数据分析(ID:pydatas)

PDF是一种便携式文档格式,由Adobe公司设计。因为不受平台限制,且方便保存和传输,所以PDF非常受欢迎。

目前市场上有很多PDF工具,大部分是阅读类,也有支持对PDF的修改、转换等功能,但这部分工具不少是收费的。

这次介绍一个开源Python工具库——pdfplumber,可以方便地获取PDF的各种信息,包括文本、表格、图表、尺寸等。

pdfplumber在github上有英文官方文档,后面我们会捡重点讲解,先看下如何用pdfplumber提取PDF表格?

以NBA 2020-2021 常规赛数据作为范例,PDF表格如下:

  • 第一步:使用pdfplumber提取表格文本
代码语言:javascript
复制
# 导入pdfplumber
import pdfplumber

# 读取pdf文件,保存为pdf实例
pdf =  pdfplumber.open("E:\\nba.pdf") 

# 访问第二页
first_page = pdf.pages[1]

# 自动读取表格信息,返回列表
table = first_page.extract_table()

table

输出:

  • 第二步:整理成dataframe格式,保存为excel
代码语言:javascript
复制
import pandas as pd

# 将列表转为df
table_df = pd.DataFrame(table_2[1:],columns=table_2[0])

# 保存excel
table_df.to_excel('test.xlsx')

table_df

输出:

一个小小的脚本,不到十行代码,便将PDF表格提取并转化为dataframe格式,最终保存到excel。

有个初步认知后,接下来详细讲讲pdfplumber的安装、导入、api接口等信息。

01 pdfplumber简介

前面已经介绍过pdfplumber的用途,也用一个小案例展示了如何提取表格,我觉得对于pdfplumber只需要了解三点就可以。

  1. 它是一个纯Python第三方库,适合Python 3.x版本
  2. 它用来查看PDF各类信息,能有效提取文本、表格
  3. 它不支持修改或生成PDF,也不支持对pdf扫描件的处理

Github地址

https://github.com/jsvine/pdfplumber

02 pdfplumber安装和导入

同其他Python库一样,pdfplumber支持使用pip安装,在命令行输入:

代码语言:javascript
复制
pip install pdfplumber

如果遇到安装慢的问题,可以替换镜像源,会快很多。

pdfplumber安装后,用import导入即可使用:

代码语言:javascript
复制
import pdfplumber
....

03 pdfplumber简单使用

pdfplumber中有两个基础类,PDF和Page。看字面意思能猜出,前者是处理整个文档,后者是处理页面。

  • pdfplumber.PDF类
  • .metadata:获取PDF基础信息,返回字典
  • .pages:一个包含pdfplumber.Page实例的列表,每一个实例代表PDF每一页的信息。
  • pdfplumber.Page类

这是pdfplumber的核心功能,对PDF的大部分操作都是基于这个类,包括提取文本、表格、尺寸等。

这里暂不一一列举它的属性和方法。

通过一个简单的案例,就可以明白它们的作用。示例PDF文档,共两页:

1. 读取PDF

代码语言:javascript
复制
# 导入pdfplumber
import pdfplumber

# 读取pdf文件,返回pdfplumber.PDF类的实例
pdf = pdfplumber.open("e:\\nba2.pdf")

2. 获取该PDF文档的信息

代码语言:javascript
复制
# 通过pdfplumber.PDF类的metadata属性获取pdf信息
pdf.metadata

输出:

这些是PDF的基础信息,包括作者、来源、日期等。

3. 总页数

代码语言:javascript
复制
# 通过pdfplumber.PDF类的metadata属性获取pdf页数
len(pdf.pages)

4. 读取第一页的页宽、页高等信息

代码语言:javascript
复制
# 第一页pdfplumber.Page实例
first_page = pdf.pages[0]

# 查看页码
print('页码:',first_page.page_number)

# 查看页宽
print('页宽:'first_page.width)

# 查看页高
print('页高:'first_page.height)

输出:

5. 读取第一页的文本

代码语言:javascript
复制
# 读取文本
text = first_page.extract_text()
print(text)

输出:

6. 读取第二页的表格

代码语言:javascript
复制
import pandas as pd

# 第二页pdfplumber.Page实例
first_page = pdf.pages[1]

# 自动读取表格信息,返回列表
table = first_page.extract_tables()

# 将列表转为df
table_df = pd.DataFrame(table_2[1:],columns=table_2[0])

table_df

pdfplumber提取表格有很多的细节需要处理,这里给到的范例表格线框比较规范,所以能很简单的提取,但对于线框不完全(包含无线框)的表格,其效果就差了不少。

在实际项目所需处理的PDF文档中,线框完全及不完全的表格都比较多,为了能够理解pdfplumber实现表格抽取的原理和方法,我们需要去细究相关参数的设置。

正如案例所示,pdfplumber.Page对象的.extract_table()方法可以提取表格,返回从页面上最大的表中提取的文本,以列表列表的形式显示,结构为row -> cell。

  • 表格抽取参数设置

默认情况下,extract_table使用页面的垂直和水平线(或矩形边缘)作为单元格分隔符。该方法可以通过table_settings参数进行高度自定义。可能的设置及其默认值:

代码语言:javascript
复制
{
    "vertical_strategy": "lines", 
    "horizontal_strategy": "lines",
    "explicit_vertical_lines": [],
    "explicit_horizontal_lines": [],
    "snap_tolerance": 3,
    "join_tolerance": 3,
    "edge_min_length": 3,
    "min_words_vertical": 3,
    "min_words_horizontal": 1,
    "keep_blank_chars": False,
    "text_tolerance": 3,
    "text_x_tolerance": None,
    "text_y_tolerance": None,
    "intersection_tolerance": 3,
    "intersection_x_tolerance": None,
    "intersection_y_tolerance": None,
}

pdfplumber支持对图表进行可视化调试,能输出图像,显示如何提取表。

04 pdfplumber的独特之处

Python中有很多库可以处理PDF,比如PyPDF2、pdfminer等,那pdfplumber的优势在哪呢?

首先,pdfplumber能轻松访问有关PDF对象的所有详细信息,且用于提取文本和表格的方法高级可定制,使用者可根据表格的具体形式来调整参数。

最关键的是pdfplumber作者持续在维护该库,而同样受欢迎的PyPDF2已经不再维护了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据DT 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01 pdfplumber简介
  • 02 pdfplumber安装和导入
  • 03 pdfplumber简单使用
  • 04 pdfplumber的独特之处
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档