如何使用python抽取pdf表格及文本,并保存到excel

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

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

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

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

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


第一步:使用pdfplumber提取表格文本

# 导入pdfplumber
import pdfplumber

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

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

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

table

输出:


第二步:整理成dataframe格式,保存为excel

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接口等信息。

pdfplumber简介

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

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

Github地址https://github.com/jsvine/pdfplumber

pdfplumber安装和导入

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

pip install pdfplumber

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

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

import pdfplumber
....

pdfplumber简单使用

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

pdfplumber.PDF类

属性 描述
.metadata 获取pdf基础信息,返回字典
.pages 一个包含pdfplumber.Page实例的列表,每一个实例代表pdf每一页的信息。

pdfplumber.Page类
这是pdfplumber的核心功能,对pdf的大部分操作都是基于这个类,包括提取文本、表格、尺寸等。
这里暂不一一列举它的属性和方法。

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


  1. 读取pdf
# 导入pdfplumber
import pdfplumber

# 读取pdf文件,返回pdfplumber.PDF类的实例
pdf = pdfplumber.open("e:\\nba2.pdf")
  1. 获取该pdf文档的信息
# 通过pdfplumber.PDF类的metadata属性获取pdf信息
pdf.metadata

输出:


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

  1. 总页数
# 通过pdfplumber.PDF类的metadata属性获取pdf页数
len(pdf.pages)
  1. 读取第一页的页宽、页高等信息
# 第一页pdfplumber.Page实例
first_page = pdf.pages[0]

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

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

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

输出:


  1. 读取第一页的文本
# 读取文本
text = first_page.extract_text()
print(text)

输出:


  1. 读取第二页的表格
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参数进行高度自定义。可能的设置及其默认值:

{
    "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支持对图表进行可视化调试,能输出图像,显示如何提取表。


pdfplumber的独特之处

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

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容