PDFMiner 操作 PDF 文件
PDFMiner介紹
PDFMiner是一個(gè)可以從PDF文檔中提取信息的工具。與其他PDF相關(guān)的工具不同,它注重的完全是獲取和分析文本數(shù)據(jù)。-
PDFMiner允許你獲取某一頁(yè)中文本的準(zhǔn)確位置和一些諸如字體、行數(shù)的信息。它包括一個(gè)PDF轉(zhuǎn)換器,可以把PDF文件轉(zhuǎn)換成HTML等格式。它還有一個(gè)擴(kuò)展的PDF解析器,可以用于除文本分析以外的其他用途。
PDFMiner內(nèi)置兩個(gè)好用的工具:pdf2txt.py和dumppdf.py
pdf2txt.py從PDF文件中提取所有文本內(nèi)容。但不能識(shí)別畫(huà)成圖片的文本,這需要特征識(shí)別。對(duì)于加密的PDF你需要提供一個(gè)密碼才能解析,對(duì)于沒(méi)有提取權(quán)限的PDF文檔你得不到任何文本。
dumppdf.py把PDF文件內(nèi)容變成pseudo-XML格式。這個(gè)程序主要用于debug,但是它也可能用于提取一些有意義的內(nèi)容(比如圖片)。
官方主頁(yè):https://euske.github.io/pdfminer/
pdfminer 安裝
第一種安裝:
- 上pdfminer的主頁(yè),將壓縮包下載下來(lái),然后解壓到一定的文件中;
http://www.unixuser.org/~euske/python/pdfminer/index.html 打開(kāi)cmd命令;
使用cd命令,設(shè)置為setup.py的當(dāng)前目錄下
設(shè)置目錄完畢后,然后輸入setup.py install 注意install是一個(gè)重要的參數(shù),不可以缺失;另外如果直接使用pyhton解釋器打開(kāi)setup.py,然后直接運(yùn)行的話,是會(huì)出問(wèn)題的,所以必須通過(guò)命令行的方式進(jìn)行。
第二種安裝:
如果你的Python有安裝pip模塊,就可以通過(guò)命令“python pip install pdfminer”,自動(dòng)安裝pdfminer。
驗(yàn)證是否安裝成功
將當(dāng)前目錄設(shè)置為tools文件夾下,里面有一個(gè)pdf2txt.py文件
在samples的文件下面有一個(gè)simple1.pdf的文件,將其拷貝到tools文件夾下,
在命令行中輸入pdf2txt.py simple1.pdf,然后如果看到成功將pdf文件中的內(nèi)容輸出了就說(shuō)明安裝成功了。
pdfminer 的使用
解析pdf文件用到的類(lèi):
- PDFParser:從一個(gè)文件中獲取數(shù)據(jù)
- PDFDocument:保存獲取的數(shù)據(jù),和PDFParser是相互關(guān)聯(lián)的
- PDFPageInterpreter處理頁(yè)面內(nèi)容
- PDFDevice將其翻譯成你需要的格式
- PDFResourceManager用于存儲(chǔ)共享資源,如字體或圖像。
PDFMiner的類(lèi)之間的關(guān)系圖:
Layout布局分析返回的PDF文檔中的每個(gè)頁(yè)面LTPage對(duì)象。這個(gè)對(duì)象和頁(yè)內(nèi)包含的子對(duì)象,形成一個(gè)樹(shù)結(jié)構(gòu)。如圖所示:
LTPage :表示整個(gè)頁(yè)。可能會(huì)含有LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine子對(duì)象。
LTTextBox:表示一組文本塊可能包含在一個(gè)矩形區(qū)域。注意此box是由幾何分析中創(chuàng)建,并且不一定表示該文本的一個(gè)邏輯邊界。它包含LTTextLine對(duì)象的列表。使用 get_text()方法返回文本內(nèi)容。
LTTextLine :包含表示單個(gè)文本行LTChar對(duì)象的列表。字符對(duì)齊要么水平或垂直,取決于文本的寫(xiě)入模式。使用get_text()方法返回文本內(nèi)容。
LTAnno:在文本中字母實(shí)際上被表示為Unicode字符串。需要注意的是,雖然一個(gè)LTChar對(duì)象具有實(shí)際邊界,LTAnno對(duì)象沒(méi)有,因?yàn)檫@些是“虛擬”的字符,根據(jù)兩個(gè)字符間的關(guān)系(例如,一個(gè)空格)由布局分析后插入。
LTImage:表示一個(gè)圖像對(duì)象。嵌入式圖像可以是JPEG或其它格式,但是目前PDFMiner沒(méi)有放置太多精力在圖形對(duì)象。
LTLine:代表一條直線。可用于分離文本或附圖。
LTRect:表示矩形。可用于框架的另一圖片或數(shù)字。
LTCurve:表示一個(gè)通用的Bezier曲線
(1)獲取PDF文檔目錄(綱要)
#!/usr/bin/python #-*- coding: utf-8 -*- from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument #獲得目錄(綱要) # 打開(kāi)一個(gè)pdf文件 fp = open(u'F:\\pdf\\2013\\000608_陽(yáng)光股份_2013年年度報(bào)告(更新后)_1.pdf', 'rb') parser = PDFParser(fp) document = PDFDocument(parser)# .獲得文檔的目錄(綱要) outlines = document.get_outlines() for (level,title,dest,a,se) in outlines:print level, title(2)讀取pdf文本內(nèi)容
下面我們利用pdfminer讀取一個(gè)pdf文檔中的文本內(nèi)容:
#!/usr/bin/python #-*- coding: utf-8 -*-from pdfminer.converter import PDFPageAggregator from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument from pdfminer.pdfpage import PDFPage from pdfminer.pdfpage import PDFTextExtractionNotAllowed from pdfminer.pdfinterp import PDFResourceManager from pdfminer.pdfinterp import PDFPageInterpreter from pdfminer.layout import * import re#打開(kāi)一個(gè)pdf文件 fp = open(u'F:\\pdf\\2013\\000001_平安銀行_2013年年度報(bào)告_2562.pdf', 'rb') #創(chuàng)建一個(gè)PDF文檔解析器對(duì)象 parser = PDFParser(fp) #創(chuàng)建一個(gè)PDF文檔對(duì)象存儲(chǔ)文檔結(jié)構(gòu) #提供密碼初始化,沒(méi)有就不用傳該參數(shù) #document = PDFDocument(parser, password) document = PDFDocument(parser) #檢查文件是否允許文本提取 if not document.is_extractable:raise PDFTextExtractionNotAllowed #創(chuàng)建一個(gè)PDF資源管理器對(duì)象來(lái)存儲(chǔ)共享資源 #caching = False不緩存 rsrcmgr = PDFResourceManager(caching = False) # 創(chuàng)建一個(gè)PDF設(shè)備對(duì)象 laparams = LAParams() # 創(chuàng)建一個(gè)PDF頁(yè)面聚合對(duì)象 device = PDFPageAggregator(rsrcmgr, laparams=laparams) #創(chuàng)建一個(gè)PDF解析器對(duì)象 interpreter = PDFPageInterpreter(rsrcmgr, device) #處理文檔當(dāng)中的每個(gè)頁(yè)面# doc.get_pages() 獲取page列表 #for i, page in enumerate(document.get_pages()): #PDFPage.create_pages(document) 獲取page列表的另一種方式 replace=re.compile(r'\s+'); # 循環(huán)遍歷列表,每次處理一個(gè)page的內(nèi)容 for page in PDFPage.create_pages(document):interpreter.process_page(page)# 接受該頁(yè)面的LTPage對(duì)象layout=device.get_result()# 這里layout是一個(gè)LTPage對(duì)象 里面存放著 這個(gè)page解析出的各種對(duì)象# 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等for x in layout:#如果x是水平文本對(duì)象的話if(isinstance(x,LTTextBoxHorizontal)):text=re.sub(replace,'',x.get_text())if len(text)!=0:print text(3)保存pdf文本內(nèi)容
如果你想要把pdf文檔文本保存為txt的話,可以參考下面的程序:
#!/usr/bin/python #-*- coding: utf-8 -*-import os import re from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.pdfpage import PDFPage from pdfminer.converter import TextConverter from pdfminer.layout import LAParams#將一個(gè)pdf轉(zhuǎn)換成txt def pdfTotxt(filepath,outpath):try:fp = file(filepath, 'rb')outfp=file(outpath,'w')#創(chuàng)建一個(gè)PDF資源管理器對(duì)象來(lái)存儲(chǔ)共享資源#caching = False不緩存rsrcmgr = PDFResourceManager(caching = False)# 創(chuàng)建一個(gè)PDF設(shè)備對(duì)象laparams = LAParams()device = TextConverter(rsrcmgr, outfp, codec='utf-8', laparams=laparams,imagewriter=None)#創(chuàng)建一個(gè)PDF解析器對(duì)象interpreter = PDFPageInterpreter(rsrcmgr, device)for page in PDFPage.get_pages(fp, pagenos = set(),maxpages=0,password='',caching=False, check_extractable=True):page.rotate = page.rotate % 360interpreter.process_page(page)#關(guān)閉輸入流fp.close()#關(guān)閉輸出流device.close()outfp.flush()outfp.close()except Exception, e:print "Exception:%s",e#pdfTotxt(u'F:\\pdf\\2013\\000001_平安銀行_2013年年度報(bào)告_2562.pdf',u'test.txt')#一個(gè)文件夾下的所有pdf文檔轉(zhuǎn)換成txt def pdfTotxt(fileDir):files=os.listdir(fileDir)tarDir=fileDir+'txt'if not os.path.exists(tarDir):os.mkdir(tarDir)replace=re.compile(r'\.pdf',re.I)for file in files:filePath=fileDir+'\\'+fileoutPath=tarDir+'\\'+re.sub(replace,'',file)+'.txt'pdfTotxt(filePath,outPath)print "Saved "+outPathpdfTotxt(u'F:\\pdf\\2013')總結(jié)
以上是生活随笔為你收集整理的PDFMiner 操作 PDF 文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何快速构建嵌入式全栈知识体系?
- 下一篇: 华为这个事,是不是刷KPI?