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

 

將書中的文本內容獲得了,只是簡單的使用,官方文檔中講解的很全面,在此只是作個小總結。

注:轉載請註明出處

相關文章
相關標籤/搜索