前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PDF文件信息不会提取怎么办??别急!Python帮你解决

PDF文件信息不会提取怎么办??别急!Python帮你解决

作者头像
DataCharm
发布2021-02-22 15:18:39
1.4K0
发布2021-02-22 15:18:39
举报

(由于昨晚推送后发现问题

,所以就取消了,可能对大家阅读造成不便,望理解

,只为大家能够获得更好的阅读体验,现在及时推送

01. 引言

在大多数常规数据文件中,pdf文件因其特殊的性质导致对其信息进行智能解析、提取、甚至批量化处理造成一定的困难,本期推文就教你如何使用Python第三方库pdfplumber (https://github.com/jsvine/pdfplumber) 对pdf文件进行解析及提取。

02. pdfplumber简介及安装

Pdfplumber是一个可以处理pdf文件格式信息的python第三方库。可以查找关于每个文本字符、矩阵、和行的详细信息,也可以对表格进行提取并进行可视化展示调试。可直接采用pip 进行安装,在命令行中输入:

代码语言:javascript
复制
pip install pdfplumber

但鉴于国内网有时下载巨慢,建议使用清华镜像进行安装,具体方法可自行百度。

03. pdf文件主要信息(表格+文本)提取

具体的属性及基本使用方法大家都可以去官网自己查看,这里仅介绍常用信息(表格+文本)的提取方法,文件也是使用官网提供的。

1)表格信息提取

表格提取方法主要包括find_tables()、extract_tables()、extract_table()以及debug_tablefinder()。我们提取表格信息主要使用extract_tables()、extract_table() 方法,而debug_tablefinder() 则是查看表格信息提取的依据。官网解释如下:

接下来,我们使用extract_table()结合具体的pdf文件进行介绍说明。Pdf文件信息如下(部分):

提取数据:

代码语言:javascript
复制
import pandas as pd
import pdfplumber
pdf = r"pdfplumber-stable\examples\pdfs\ca-warn-report.pdf"
ta_pdf = pdfplumber.open(pdf)
ta_pdf_info = ta_pdf.pages[0] #获取pdf文件第一页信息
tables = ta_pdf_info.extract_table() #获取表格信息
tabes[:3]

结果显示如下:

使用.extract_table从页面上最大的表中获取数据:.extract_table返回一个镶嵌列表,每个内部列表为表中的一行,对比pdf文件可以发现,主要的信息我们已经提取出来,接下来我们对信息进行保存。

信息保存:

代码语言:javascript
复制
table_df = pd.DataFrame(tables[1:],columns=tables[0])
table_df.head()

结果如下:

这样我们就完美的提取pdf第一页表格信息了,可以发现,Effective和Received列由于是直接提取,导致文本之间存在空格,接下来整理下即可,代码如下:

代码语言:javascript
复制
for column in ["Effective", "Received"]:
    table_df[column] = table_df[column].str.replace(" ", "")
table_df.head()

结果如下:

通过pandas的to_excel等文件保存方法即可实现文件另存。到此,我们就实现了pdf第一页表格信息的提取、整理和另存。若想对多页进行批量处理,进行简单的循环处理即可。

此外,我们还可以直接通过 within_bbox()方法直接定位我们需要提取信息的位置进行特定位置信息的提取。within_bbox() 介绍如下:

(2)文本信息提取

文本信息的提取主要使用extract_text()方法,这里使用的pdf文件预览如下(部分):

提取文本信息代码如下:

代码语言:javascript
复制
file = r"pdfplumber-stable\examples\pdfs\san-jose-pd-firearm-sample.pdf"
text_pdf = pdfplumber.open(file)
text_info = text_pdf.pages[0]
text = text_info.extract_text()
print(text)

结果为:

对比pdf可知,文本信息已全部提出。这里我们就可以使用正则表达式对提取信息进行筛选。代码如下:

代码语言:javascript
复制
core_part = re.compile(r"LOCATION[\-\s]+(.*)\n\s+Flags = e", re.DOTALL)
core = re.search(core_part, text).group(1)
print(core)

这里解释下:LOCATION[\-\s]+(.*)\n\s+Flags = e 就是匹配 LOCATION 和 Flags = e 字符串 之间的所有元素,无论换行还是空格等。结果如下:

由于使用print()方法进行输出,结果较为规范,但实际情况如下:

含有多个换行符号(\n),接下来以此为依据进行拆分(split),如下:

再对结果进行提取,代码如下:

代码语言:javascript
复制
line_groups = list(zip(lines[::2], lines[1::2]))
line_groups

结果如下:

最后使用collections模块中的OrderedDict类 进行字典有序排列,构建pandas所需数据,具体代码如下:

代码语言:javascript
复制
from collections import OrderedDict
line_groups = list(zip(lines[::2], lines[1::2]))
def parse_row(first_line, second_line):
    return OrderedDict([
        ("type", first_line[:20].strip()),
        ("item", first_line[21:41].strip()),
        ("make", first_line[44:89].strip()),
        ("model", first_line[90:105].strip()),
        ("calibre", first_line[106:111].strip()),
        ("status", first_line[112:120].strip()),
        ("flags", first_line[124:129].strip()),
        ("serial_number", second_line[0:13].strip()),
        ("report_tag_number", second_line[21:41].strip()),
        ("case_file_number", second_line[44:64].strip()),
        ("storage_location", second_line[68:91].strip())
    ])
parsed = [ parse_row(first_line, second_line)
    for first_line, second_line in line_groups ]
parsed[:2]

结果如下:

可以看出,数据已经过整合并符合pandas 构建数据DataFrame形式。如下:

代码语言:javascript
复制
text_df = pd.DataFrame(parsed)
text_df

结果如下(部分):

通过to_excel等方法即可实现另存。

04. 总结

本期推文简单介绍了如何使用Python第三方库pdfplumber 实现对pdf文件解析及基本信息提取。其目的是为大家提供一个数据解决思路,这里只是简单介绍表格信息和文本信息的提取,其他的方法,大家可以查看官网获取啊。当然,pdf文件的不同可能提取的效果不同,数据处理方式也就不同。鉴于有些小伙伴网速等原因,我已经将pdfplumber 的所有文件进行了下载,后台回复“pdf练习文件”即可获取,感兴趣的小伙伴可以自己进行练习。

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

本文分享自 DataCharm 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 01. 引言
  • 02. pdfplumber简介及安装
  • 03. pdf文件主要信息(表格+文本)提取
  • 04. 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档