今天由於某種原因需要將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')
將書中的文本內容得到了,只是簡單的使用,官方文檔中講解的很全面,在此只是做個小總結。
注:轉載請注明出處