PDF表格信息提取
本文作者:王碧琪
文字编辑:钱梦璇
技术总编:张 邯
Stata暑期线上课程火热招生中~
爬虫俱乐部将于2020年7月11日至14日在线上举行为期四天的Stata编程技术定制培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata的基本命令、编程、数据处理以及结果输出等技术,并针对最新版Stata中的实用新功能做出详细介绍,包括框架功能(frame:读入多个数据集)等等。同时,此次云端课程提供录播,提供线上答疑。详细培训大纲及报名方式请查看《Stata云端课程来啦》,或点击文末阅读原文直接提交报名信息呦~
在《提取PDF文本信息:入门》中,我们介绍了使用pdfminer提取PDF中的信息,其中提取的是文本内容,而对于表格内容,使用pdfminer会输出无格式的文本,不能保留表格格式,而pdfplumber就能很好的解决问题。本文将比较两个方法的差异。
待处理的PDF文档中的表格如下:
一、pdfminer
我们用以下程序使用pdfminer进行提取(具体原理已在《提取PDF文本信息:入门》文章中详述):
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import *
parser = PDFParser(open(r"d: \table.pdf"))
doc = PDFDocument()
parser.set_document(doc)
doc.set_parser(parser)
rsrcmgr = PDFResourceManager() #创建PDF资源管理器来管理共享资源
laparams = LAParams() #创建一个PDF设备对象
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device) #创建一个PDF解释器对象
with open(r"d:\table.txt", 'w') as f:
for page in doc.get_pages(): #循环遍历列表,每次处理一个page的内容
interpreter.process_page(page)
layout = device.get_result()
for x in layout:
if isinstance(x, LTTextBox):
print(x.get_text().strip())
f.write(x.get_text().strip()+"\n")
结果为:
2010
Things
Quantity
Apples
Oranges
Pears
10
20
8
由于只能提取文字,这样的结果已经破坏了最初的表格样式。
二、pdfplumber
首先导入库,生成pdfplumber对象:
import pdfplumber
pdf = pdfplumber.open(r"d: \table.pdf")
print(pdf)
结果如下:
<pdfplumber.pdf.PDF object at 0x000001A536631DC8>
结果表明生成了一个pdfplumber对象,我们可以调用.pages()方法解析得到每一页的内容:
pages=pdf.pages
print(pages)
结果如下:
[<pdfplumber.page.Page object at 0x000001A534FD8348>]
生成的可迭代对象可以通过for遍历:
for p in pages:
table1=p.extract_table()
print(table1)
结果如下:
[['2010', None], ['Things', 'Quantity'], ['Apples', '10'], ['Oranges', '20'], ['Pears', '8']]
table1是一个列表,到这里我们就得到了文档中的表格内容了。列表table1中有若干个小列表,分别表示表格内容中的每一行,每个小列表中有两个元素,虽然原表格内容的第一行只有一个元素,但是这里的结果是补齐成两个元素。我们逐行打印出来。
for unitrow in table1:
print(unitrow)
结果如下:
['2010', None]
['Things', 'Quantity']
['Apples', '10']
['Oranges', '20']
['Pears', '8']
另外,这里为了更清晰明了地展示列表内容,可以引入pandas库。
import pandas as pd
df=pd.DataFrame(table1[1:],columns=table1[0])
print(df)
结果如下:
这样,就得到了比较规整的保留原格式的PDF表格内容了。PDF文档的内容提取比较费工夫,这里提供的表格内容提取方式相对比较成熟。接下来,小编将继续探索PDF文档的内容提取方式,敬请关注~
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。