从PDF中提取信息----PDFMiner

今天因为某种缘由须要将pdf中的文本提取出来,就去搜了下资料,发现PDFMiner是针对html

内容提取的,虽然最后发现pdf里面的文本全都是图片,就没整成功,不过试了个文本可复制的python

那种pdf文件,发现仍是蛮好用的框架

PDFMiner----python的PDF解析器和分析器布局

1.官方文档:http://www.unixuser.org/~euske/python/pdfminer/index.html字体

2.特征   加密

  • 彻底使用python编写。 (适用于2.4或更新版本)   
  • 解析,分析,并转换成PDF文档。  
  • PDF-1.7规范的支持。 (几乎)   
  • 中日韩语言和垂直书写脚本支持。   
  • 各类字体类型(Type一、TrueType、Type3,和CID)的支持。    
  • 基本加密(RC4)的支持。     
  • PDF与HTML转换。  
  • 纲要(TOC)的提取。    
  • 标签内容提取。     
  • 经过分组文本块重建原始的布局。

3.安装spa

注:使用源码安装,而且处理中日韩语言的时候还须要一个额外的安装步骤翻译

4.用法3d

4.1解析pdf文件用到的类:unix

  • PDFParser:从一个文件中获取数据
  • PDFDocument:保存获取的数据,和PDFParser是相互关联的
  • PDFPageInterpreter处理页面内容
  • PDFDevice将其翻译成你须要的格式
  • PDFResourceManager用于存储共享资源,如字体或图像。

PDFMiner的类之间的关系图:

http://www.unixuser.org/~euske/python/pdfminer/objrel.png

 

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对象。这个对象和页内包含的子对象,造成一个树结构

如图所示:

http://www.unixuser.org/~euske/python/pdfminer/layout.png

  • 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')

 

将书中的文本内容获得了,只是简单的使用,官方文档中讲解的很全面,在此只是作个小总结。

注:转载请注明出处

相关文章
相关标签/搜索