从PDF中提取信息----PDFMiner
今天由于某种原因需要将pdf中的文本提取出来,就去搜了下资料,发现PDFMiner是针对
内容提取的,虽然最后发现pdf里面的文本全都是图片,就没整成功,不过试了个文本可复制的
那种pdf文件,发现还是蛮好用的。
PDFMiner----python的PDF解析器和分析器
1.官方文档:http://www.unixuser.org/~euske/python/pdfminer/index.html
2.特征
- 完全使用python编写。 (适用于2.4或更新版本)
- 解析,分析,并转换成PDF文档。
- PDF-1.7规范的支持。 (几乎)
- 中日韩语言和垂直书写脚本支持。
- 各种字体类型(Type1、TrueType、Type3,和CID)的支持。
- 基本加密(RC4)的支持。
- PDF与HTML转换。
- 纲要(TOC)的提取。
- 标签内容提取。
- 通过分组文本块重建原始的布局。
3.安装
注:使用源码安装,并且处理中日韩语言的时候还需要一个额外的安装步骤
4.用法
4.1解析pdf文件用到的类:
- PDFParser:从一个文件中获取数据
- PDFDocument:保存获取的数据,和PDFParser是相互关联的
- PDFPageInterpreter处理页面内容
- PDFDevice将其翻译成你需要的格式
- PDFResourceManager用于存储共享资源,如字体或图像。
PDFMiner的类之间的关系图:
4.2基本用法
4.2.1解析pdf文件
1 from pdfminer.pdfparser import PDFParser 2 from pdfminer.pdfdocument import PDFDocument 3 from pdfminer.pdfpage import PDFPage 4 from pdfminer.pdfpage import PDFTextExtractionNotAllowed 5 from pdfminer.pdfinterp import PDFResourceManager 6 from pdfminer.pdfinterp import PDFPageInterpreter 7 from pdfminer.pdfdevice import PDFDevice 8 9 10 fp = open('mypdf.pdf', 'rb') 11 #创建一个PDF文档解析器对象 12 parser = PDFParser(fp) 13 #创建一个PDF文档对象存储文档结构 14 #提供密码初始化,没有就不用传该参数 15 document = PDFDocument(parser, password) 16 #检查文件是否允许文本提取 17 if not document.is_extractable: 18 raise PDFTextExtractionNotAllowed 19 #创建一个PDF资源管理器对象来存储共享资源 20 rsrcmgr = PDFResourceManager() 21 #创建一个pdf设备对象 22 device = PDFDevice(rsrcmgr) 23 #创建一个PDF解析器对象 24 interpreter = PDFPageInterpreter(rsrcmgr, device) 25 #处理文档当中的每个页面 26 for page in PDFPage.create_pages(document): 27 interpreter.process_page(page)
当然这只是进行解析,还可进行布局分析,我的数据就是从这一步的到的
4.2.2布局分析
首先对第一步的代码进行修改和增加
1 from pdfminer.layout import LAParams 2 from pdfminer.converter import PDFPageAggregator 3 4 # 设定参数进行分析 5 laparams = LAParams() 6 # 创建一个PDF页面聚合对象 7 device = PDFPageAggregator(rsrcmgr, laparams=laparams) 8 interpreter = PDFPageInterpreter(rsrcmgr, device) 9 for page in PDFPage.create_pages(document): 10 interpreter.process_page(page) 11 # 接收该页面的LTPage对象 12 layout = device.get_result()
布局分析返回的PDF文档中的每个页面LTPage对象。这个对象和页内包含的子对象,形成一个树结构
如图所示:
- LTPage :表示整个页。可能会含有LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine子对象。
- LTTextBox:表示一组文本块可能包含在一个矩形区域。注意此box是由几何分析中创建,并且不一定
表示该文本的一个逻辑边界。它包含LTTextLine对象的列表。使用 get_text()方法返回的文本内容。 - LTTextLine :包含表示单个文本行LTChar对象的列表。字符对齐要么水平或垂直,取决于文本的写入模式。
get_text()方法返回的文本内容。 - LTChar
- LTAnno:在文本中实际的字母表示为Unicode字符串(?)。需要注意的是,虽然一个LTChar对象具有实际边界,
LTAnno对象没有,因为这些是“虚拟”的字符,根据两个字符间的关系(例如,一个空格)由布局分析后插入。 - LTImage:表示一个图像对象。嵌入式图像可以是JPEG或其它格式,但是目前PDFMiner没有放置太多精力在图形对象。
- LTLine:代表一条直线。可用于分离文本或附图。
- LTRect:表示矩形。可用于框架的另一图片或数字。
LTCurve:表示一个通用的
Bezier曲线
4.2.3获得目录(纲要)
1 from pdfminer.pdfparser import PDFParser 2 from pdfminer.pdfdocument import PDFDocument 3 4 # Open a PDF document. 5 fp = open('mypdf.pdf', 'rb') 6 parser = PDFParser(fp) 7 document = PDFDocument(parser, password) 8 9 # Get the outlines of the document. 10 outlines = document.get_outlines() 11 for (level,title,dest,a,se) in outlines: 12 print (level, title)
5.个人使用
1 # -*- coding: utf-8 -*- 2 from pdfminer.pdfparser import PDFParser 3 from pdfminer.pdfdocument import PDFDocument 4 from pdfminer.pdfpage import PDFPage 5 from pdfminer.pdfpage import PDFTextExtractionNotAllowed 6 from pdfminer.pdfinterp import PDFResourceManager 7 from pdfminer.pdfinterp import PDFPageInterpreter 8 from pdfminer.pdfdevice import PDFDevice 9 from pdfminer.layout import * 10 from pdfminer.converter import PDFPageAggregator 11 import os 12 os.chdir(r'F:\test') 13 fp = open('python.pdf', 'rb') 14 #来创建一个pdf文档分析器 15 parser = PDFParser(fp) 16 #创建一个PDF文档对象存储文档结构 17 document = PDFDocument(parser) 18 # 检查文件是否允许文本提取 19 if not document.is_extractable: 20 raise PDFTextExtractionNotAllowed 21 else: 22 # 创建一个PDF资源管理器对象来存储共赏资源 23 rsrcmgr=PDFResourceManager() 24 # 设定参数进行分析 25 laparams=LAParams() 26 # 创建一个PDF设备对象 27 # device=PDFDevice(rsrcmgr) 28 device=PDFPageAggregator(rsrcmgr,laparams=laparams) 29 # 创建一个PDF解释器对象 30 interpreter=PDFPageInterpreter(rsrcmgr,device) 31 # 处理每一页 32 for page in PDFPage.create_pages(document): 33 interpreter.process_page(page) 34 # 接受该页面的LTPage对象 35 layout=device.get_result() 36 for x in layout: 37 if(isinstance(x,LTTextBoxHorizontal)): 38 with open('a.txt','a') as f: 39 f.write(x.get_text().encode('utf-8')+'\n')
将书中的文本内容得到了,只是简单的使用,官方文档中讲解的很全面,在此只是做个小总结。
注:转载请注明出处