查看原文
其他

提取PDF文本信息:入门

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王碧琪
文字编辑:钱梦璇
技术总编:张    邯



Stata暑期线上课程火热招生中~

爬虫俱乐部将于2020年7月11日至14日线上举行为期四天的Stata编程技术定制培训。课程通过案例教学模式,旨在帮助大家在短期内掌握Stata的基本命令、编程、数据处理以及结果输出等技术,并针对最新版Stata中的实用新功能做出详细介绍,包括框架功能(frame:读入多个数据集)等等。同时,此次云端课程提供录播,提供线上答疑。详细培训大纲及报名方式请查看《Stata云端课程来啦》,或点击文末阅读原文直接提交报名信息呦~


PDF格式的文件经常出现在我们的办公生活中,它更像是一张图片,我们没办法进行编辑和复制等操作。所以为了解决这一问题,pdfminer应运而生,今天就来试一下,用pdfminer提取简单文字的pdf文档内容。

一、简介

pdfminer是Python中的一个库,它可以告诉我们某文本在分页上具体的位置和字体信息。可以通过pip安装,注意库的名字在Python3中改为pdfminer3k了:

pip install pdfminer3k
本文使用一个简单文字的PDF文档,内容如下:

二、处理

(一)导入pdfminer

from pdfminer.pdfparser import PDFParser, PDFDocumentfrom pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreterfrom pdfminer.converter import PDFPageAggregatorfrom pdfminer.layout import LAParams, LTTextBox

这些类的功能如下所示:

类名含义
PDFParser从文件中获取数据
PDFDocument存储文档数据结构到内存中
PDFPageInterpreter解析page内容
PDFDevice把解析到的内容转化为你需要的东西
PDFResourceManager存储共享资源,例如字体或图片

(二)读入待处理PDF文档
创建一个PDF文档实例,打开示例文件:

doc = PDFDocument()parser = PDFParser(open(r"G:\simple1.pdf"))
连接分析器与文档对象,这两句不能颠倒:
parser.set_document(doc)doc.set_parser(parser)

我们可以调用doc的get_pages() 方法查看每一页:

print(doc.get_pages())

结果是:

<generator object PDFDocument.get_pages at 0x00000266CEBE4848>

这里是一个生成器,因为pdfminer的解析原则是“用了再干”,而并不会先将整个文档解析,生成器的相关内容可以查看推文《可迭代对象、迭代器、生成器傻傻分不清楚》。可以通过for循环遍历内容:

for page in doc.get_pages(): print(page)

结果是:

<PDFPage: Resources={'ProcSet': <PDFObjRef:6>, 'Font': {'F1': <PDFObjRef:7>}}, MediaBox=[0, 0, 612, 792]>

小编查找官方文档,得知这些是返回的page的一些属性。Resources代表pdf的来源,标注了名称以及字体,mediabox是page的位置坐标。这些不用过分在意,只需要继续进行提取,完成任务即可。

(三)解析页面
创建一个PDF解释器对象:

device = PDFPageAggregator( PDFResourceManager(), laparams = LAParams() )interpreter = PDFPageInterpreter( PDFResourceManager(), device)

pdfminer会通过解释器解析每一页的内容,得到每一页的LTPage对象,其中包括LTTextBox\LTFigure等。他们的关系如下图所示:

(图片源自网络,侵删)

本篇文章仅提取文本,所以只需要提取LTTextBox,接下来的系列文章还会讲到图片、表格等内容,会用到其他的对象。

(四)获取文字内容
使用循环遍历每一页,针对每一页进行解析,提取LTTextBox并输出:

for page in doc.get_pages(): interpreter.process_page(page) layout = device.get_result() for x in layout: if isinstance(x, LTTextBox): print(x.get_text().strip())

运行结果如下:

至此,pdf文档中的文本内容已经成功提取出来了。






对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

毕业季|b站《入海》评论爬取

利用广义线性模型实现的分类——Logistic回归
Requests get爬虫之设置headers
数据分析薪资待遇如何?——跟我来,带你看
Vardistinct一键去重计数
从statsmodels到线性回归
Pandas的GroupBy机制
首行数据如何快速转变量名?
文件太多乱乱的?合并一下吧!
线性回归的正则化 ——岭回归与LASSO回归
Pandas中节约空间的小tip—categorical类型
Ftools命令组之flevelsof命令介绍
疫情下的家庭关系|《请回答1988》影评爬取
教你把Python当美图秀秀用(二)
自己动手进行线性回归计算
personage与年龄
原来这才是查看盲评结果的正确方式

关于我们



微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存