更多精彩内容请移步微信公众号:Python for Finance
本文介绍一个开源python工具库-pdfplumber,可以方便地获取pdf的各种信息,包括文本、表格、图表、尺寸等。它不支持修改或生成pdf。
一、pdfplumber安装
由于Anaconda没有集成pdfplumber库,因此需要安装。安装方式:打开Anaconda Prompt,选择开始菜单-Anaconda3-Anaconda Prompt。
命令行中输入
pip install pdfplumber
二、pdfplumber运用步骤
(一)读取pdf
import pdfplumber
pdf=pdfplumber.open(r'C:\Users\chenwei\Downloads\贵州茅台2020年年度报告.pdf')
(二)生成page对象
pdfplumber.Page类是pdfplumber整个的核心。
通过.pages返回包含pdfplumber.Page实例的列表,每一个实例代表pdf每一页的信息,通过列表可访问具体某一页。
pages=pdf.pages #生成pdf所有页面的列表
page01=pdf.pages[0] #返回第一页对象
步骤一、二也可以with open语句,代码如下:
with pdfplumber.open(r'C:\Users\chenwei\Downloads\贵州茅台2020年年度报告.pdf') as pdf:
pages=pdf.pages #生成pdf所有页面的列表
page01=pdf.pages[0] #返回第一页对象
(三)对Page对象进行处理
常用方法:
(1)pdfplumber库提供文本提取函数.extract_text() ,将PDF文档中的文本内容按照原文中的换行格式(并非实际的段落)得到字符串对象。
(2)pdfplumber库提供了两种pdf表格提取函数,分别为.extract_tables( )及.extract_table( ),两种函数提取结果存在差异。
A).extract_tables( )
可输出页面中所有表格,并返回一个嵌套列表,其结构层次为table→row→cell。此时,页面上的整个表格被放入一个大列表中,原表格中的各行组成该大列表中的各个子列表。
B).extract_table( )
返回独立列表,其结构层次为row→cell。若页面中存在多个行数相同的表格,则默认输出顶部表格;否则,仅输出行数最多的一个表格。此时,表格的每一行都作为一个单独的列表,列表中每个元素即为原表格的各个单元格内容。
三、pdfplumber常用实例:
(一)提取单页pdf文字
以读取《贵州茅台2020年年度报告》pdf第28页文本为例,代码如下:
import pdfplumber
with pdfplumber.open(r'C:\Users\chenwei\Downloads\贵州茅台2020年年度报告.pdf') as pdf:
page28 = pdf.pages[27] #指定读取第28页
text = page28.extract_text()#提取文本
print(text)
(二)提取所有页面pdf文字并写入文本
以读取《贵州茅台2020年年度报告》pdf文本并写入txt文件为例,代码如下:
import pdfplumber
with pdfplumber.open(r'C:\Users\chenwei\Downloads\贵州茅台2020年年度报告.pdf') as pdf:
for page in pdf.pages:
text = page.extract_text()#提取文本
txt = open(r'C:\Users\chenwei\Downloads\贵州茅台2020年年度报告.txt',mode='a',encoding='utf-8')
txt.write(text)
(三)提取单页面的单个表格
采用extract_table()方法提取单个表格,若页面中存在多个行数相同的表格,则默认输出顶部表格;否则,仅输出行数最多的一个表格。
以读取《贵州茅台2020年年度报告》pdf第9页单个表格为例,第9页有多个表格,其中,成本分析表是行数最多的一个表格,采用extract_table()方法则默认输出该表格。
import pdfplumber
import pandas as pd
with pdfplumber.open(r'C:\Users\chenwei\Downloads\贵州茅台2020年年度报告.pdf') as pdf:
page09 = pdf.pages[8] # 第九页的信息
table= page09.extract_table() #提取单个表格
table=pd.DataFrame(table[1:],columns=table[0]) #得到的table是嵌套list类型,转化成DataFrame更加方便查看
print(table)
(四)提取所有页面的所有表格,并存到excel的不同sheet中
这涉及pandas将多个dataframe以多个sheet的形式保存到一个excel文件中,需要采用 ExcelWriter方法。代码如下:
import pdfplumber
import pandas as pd
writer=pd.ExcelWriter(r'C:\Users\chenwei\Desktop\贵州茅台2020年年度报告数据.xls')
with pdfplumber.open(r'C:\Users\chenwei\Downloads\贵州茅台2020年年度报告.pdf') as pdf:
for j in range(len(pdf.pages)):
page=pdf.pages[j]
tables = page.extract_tables() #提取多个表格
for i in range(len(tables)):
table=tables[i]
table=pd.DataFrame(table[1:],columns=table[0])
table.to_excel(writer,index=False,sheet_name=f'第{j+1}页表格{i+1}')
writer.save()
writer.close()