PDF信息提取
PDF文件读取
1.PDF概述
PDF概述
可移植文档格式(PDF)是一种用独立于应用程序、硬件、操作系统的方式呈现文档的文件格式。每个PDF文件包含固定布局的平面文档的完整描述,包括文本、字形、图形及其他需要显示的信息。PDF文件格式在1990年代早期开发,用于分享包括文本格式和内置视频的文档,能跨平台操作,即使计算机平台完全不同,收件者亦无需适配相关或合用的应用软件接口。
解析PDF文件的python库主要有两个,PDFMiner库和pyPDF库,在这里主要讲解PDFMiner库来提取PDF文件内容。
2.环境配置
PDFMiner
PDFMiner是一种从PDF文档中提取信息的工具。与其他PDF相关工具不同,它完全专注于获取和分析文本数据。允许人们获取页面中文本的确切位置,以及字体或线条等其他信息。PDFMiner包括一个PDF转换器,可以将PDF文件转换为其他文本格式(如HTML)。它具有可扩展的PDF解析器,可用于除文本分析之外的其他目的。
适用于配合StringIO转出PDF文件中的文字类信息,对于图像的提取较弱,目前只支持JPEG图像。
pyPDF
pyPDF一样也是是一种从PDF文档中提取信息的工具。
PyPDF是一个纯python PDF库,能够分割,合并,裁剪和转换PDF文件的页面。它还可以向PDF文件添加自定义数据,查看选项和密码。它可以从PDF中检索文本和元数据,以及将整个文件合并在一起。
当前pyPDF库已经停止更新,最新的库是pyPDF2库。
安装PDFMiner
如果电脑里的python版本是python 2,则在命令行键入
pip install pdfminer
如果电脑里的python版本是python3,则在命令行键入
pip install pdfminer3k
3.PDFMiner解析
PDFMiner库的类
- PDFParser 从文件中获取数据
- PDFDocument 存储文档数据结构到内存中
- PDFPageInterpreter 解析page内容
- PDFDevice 把解析到的内容转化为你需要的格式
- PDFResourceManager存储共享资源,例如字体或图片
PDFMiner库类之间的关系
由于PDF文件具有如此庞大而复杂的结构,因此整体解析PDF文件会消耗时间和内存。但是,大多数PDF处理任务并不需要每个部分。因此,PDFMiner采用延迟解析策略,即仅在必要时解析内容。
要解析PDF文件,需要至少使用两个类:PDFParser和PDFDocument。这两个对象彼此相关联。 PDFParser从文件中提取数据并PDFDocument存储它。我们还需要 PDFPageInterpreter处理页面内容并将PDFDevice其翻译为需要的任何内容。 PDFResourceManager用于存储共享资源,如字体或图像。

4.PDF文件提取
基本用法
首先我们用用文件对象来创建一个PDF文档分析器,提取出PDF数据;
praser = PDFParser(fp)
然后我们创建一个存储文档结构的PDF文档对象;
doc = PDFDocument()
然后我们连接分析器与文档对象;
praser.set_document(doc)
doc.set_parser(praser)
然后提供初始化密码,如果没有密码则创建一个空的字符串;
doc.initialize()
接下来我们判断文档是否可以进行txt转换;
doc.is_extractable
接下来我们创建一个PDF资源管理器来管理共享资源;
rsrcmgr = PDFResourceManager()
接下来创建一个PDF设备对象;
device = PDFDevice(rsrcmgr)
接下来创建一个PDF解释器对象;
interpreter = PDFPageInterpreter(rsrcmgr,device)
循环遍历列表,每次处理一个page的内容。
for page in PDFPage.create_pages(doc):
interpreter.process_page(page)
布局分析
如果我们要进行布局分析,我们需要对上面的代码进行修改和增加;
首先我们设定参数进行分析;
laparams = LAParams()
然后创建一个PDF页面聚合对象;
device = PDFPageAggregator(rsrcmgr, laparams=laparams)
interpreter = PDFPageInterpreter(rsrcmgr, device)
最后我们在每个page页面接收该页面的LTPage对象;
layout = device.get_result()
这里layout是一个LTPage对象 里面存放着 这个page解析出的各种对象 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等,想要获取文本就要获得对象的text属性。
