今天由于某種原因需要將pdf中的文本提取出來,就去搜了下資料,發(fā)現(xiàn)PDFMiner是針對
內(nèi)容提取的,雖然最后發(fā)現(xiàn)pdf里面的文本全都是圖片,就沒整成功,不過試了個文本可復(fù)制的
那種pdf文件,發(fā)現(xiàn)還是蠻好用的。
PDFMiner----python的PDF解析器和分析器
1.官方文檔:http://www.unixuser.org/~euske/python/pdfminer/index.html
2.特征
3.安裝
注:使用源碼安裝,并且處理中日韓語言的時候還需要一個額外的安裝步驟
4.用法
4.1解析pdf文件用到的類:
PDFMiner的類之間的關(guān)系圖:

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 #創(chuàng)建一個PDF文檔解析器對象12 parser = PDFParser(fp)13 #創(chuàng)建一個PDF文檔對象存儲文檔結(jié)構(gòu)14 #提供密碼初始化,沒有就不用傳該參數(shù)15 document = PDFDocument(parser, passWord)16 #檢查文件是否允許文本提取17 if not document.is_extractable:18 raise PDFTextExtractionNotAllowed19 #創(chuàng)建一個PDF資源管理器對象來存儲共享資源20 rsrcmgr = PDFResourceManager()21 #創(chuàng)建一個pdf設(shè)備對象22 device = PDFDevice(rsrcmgr)23 #創(chuàng)建一個PDF解析器對象24 interpreter = PDFPageInterpreter(rsrcmgr, device)25 #處理文檔當(dāng)中的每個頁面26 for page in PDFPage.create_pages(document):27 interpreter.process_page(page)
當(dāng)然這只是進(jìn)行解析,還可進(jìn)行布局分析,我的數(shù)據(jù)就是從這一步的到的
4.2.2布局分析
首先對第一步的代碼進(jìn)行修改和增加
1 from pdfminer.layout import LAParams 2 from pdfminer.converter import PDFPageAggregator 3 4 # 設(shè)定參數(shù)進(jìn)行分析 5 laparams = LAParams() 6 # 創(chuàng)建一個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對象。這個對象和頁內(nèi)包含的子對象,形成一個樹結(jié)構(gòu)
如圖所示:

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 PDFPageAggregator11 import os12 os.chdir(r'F:/test')13 fp = open('python.pdf', 'rb')14 #來創(chuàng)建一個pdf文檔分析器15 parser = PDFParser(fp) 16 #創(chuàng)建一個PDF文檔對象存儲文檔結(jié)構(gòu)17 document = PDFDocument(parser)18 # 檢查文件是否允許文本提取19 if not document.is_extractable:20 raise PDFTextExtractionNotAllowed21 else:22 # 創(chuàng)建一個PDF資源管理器對象來存儲共賞資源23 rsrcmgr=PDFResourceManager()24 # 設(shè)定參數(shù)進(jìn)行分析25 laparams=LAParams()26 # 創(chuàng)建一個PDF設(shè)備對象27 # device=PDFDevice(rsrcmgr)28 device=PDFPageAggregator(rsrcmgr,laparams=laparams)29 # 創(chuàng)建一個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')
將書中的文本內(nèi)容得到了,只是簡單的使用,官方文檔中講解的很全面,在此只是做個小總結(jié)。
注:轉(zhuǎn)載請注明出處
|
新聞熱點
疑難解答