日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PDFMiner 操作 PDF 文件

發(fā)布時間:2023/12/20 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PDFMiner 操作 PDF 文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

PDFMiner介紹

  • PDFMiner是一個可以從PDF文檔中提取信息的工具。與其他PDF相關(guān)的工具不同,它注重的完全是獲取和分析文本數(shù)據(jù)。-

  • PDFMiner允許你獲取某一頁中文本的準確位置和一些諸如字體、行數(shù)的信息。它包括一個PDF轉(zhuǎn)換器,可以把PDF文件轉(zhuǎn)換成HTML等格式。它還有一個擴展的PDF解析器,可以用于除文本分析以外的其他用途。

  • PDFMiner內(nèi)置兩個好用的工具:pdf2txt.py和dumppdf.py

  • pdf2txt.py從PDF文件中提取所有文本內(nèi)容。但不能識別畫成圖片的文本,這需要特征識別。對于加密的PDF你需要提供一個密碼才能解析,對于沒有提取權(quán)限的PDF文檔你得不到任何文本。

  • dumppdf.py把PDF文件內(nèi)容變成pseudo-XML格式。這個程序主要用于debug,但是它也可能用于提取一些有意義的內(nèi)容(比如圖片)。

官方主頁:https://euske.github.io/pdfminer/



pdfminer 安裝

第一種安裝:

  • 上pdfminer的主頁,將壓縮包下載下來,然后解壓到一定的文件中;
    http://www.unixuser.org/~euske/python/pdfminer/index.html
  • 打開cmd命令;

  • 使用cd命令,設置為setup.py的當前目錄下

  • 設置目錄完畢后,然后輸入setup.py install 注意install是一個重要的參數(shù),不可以缺失;另外如果直接使用pyhton解釋器打開setup.py,然后直接運行的話,是會出問題的,所以必須通過命令行的方式進行。


第二種安裝:

如果你的Python有安裝pip模塊,就可以通過命令“python pip install pdfminer”,自動安裝pdfminer。


驗證是否安裝成功

  • 將當前目錄設置為tools文件夾下,里面有一個pdf2txt.py文件

  • 在samples的文件下面有一個simple1.pdf的文件,將其拷貝到tools文件夾下,

  • 在命令行中輸入pdf2txt.py simple1.pdf,然后如果看到成功將pdf文件中的內(nèi)容輸出了就說明安裝成功了。



pdfminer 的使用

解析pdf文件用到的類:

  • PDFParser:從一個文件中獲取數(shù)據(jù)
  • PDFDocument:保存獲取的數(shù)據(jù),和PDFParser是相互關(guān)聯(lián)的
  • PDFPageInterpreter處理頁面內(nèi)容
  • PDFDevice將其翻譯成你需要的格式
  • PDFResourceManager用于存儲共享資源,如字體或圖像。

PDFMiner的類之間的關(guān)系圖:

Layout布局分析返回的PDF文檔中的每個頁面LTPage對象。這個對象和頁內(nèi)包含的子對象,形成一個樹結(jié)構(gòu)。如圖所示:

LTPage :表示整個頁。可能會含有LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine子對象。
LTTextBox:表示一組文本塊可能包含在一個矩形區(qū)域。注意此box是由幾何分析中創(chuàng)建,并且不一定表示該文本的一個邏輯邊界。它包含LTTextLine對象的列表。使用 get_text()方法返回文本內(nèi)容。
LTTextLine :包含表示單個文本行LTChar對象的列表。字符對齊要么水平或垂直,取決于文本的寫入模式。使用get_text()方法返回文本內(nèi)容。
LTAnno:在文本中字母實際上被表示為Unicode字符串。需要注意的是,雖然一個LTChar對象具有實際邊界,LTAnno對象沒有,因為這些是“虛擬”的字符,根據(jù)兩個字符間的關(guān)系(例如,一個空格)由布局分析后插入。
LTImage:表示一個圖像對象。嵌入式圖像可以是JPEG或其它格式,但是目前PDFMiner沒有放置太多精力在圖形對象。
LTLine:代表一條直線。可用于分離文本或附圖。
LTRect:表示矩形。可用于框架的另一圖片或數(shù)字。
LTCurve:表示一個通用的Bezier曲線


(1)獲取PDF文檔目錄(綱要)

#!/usr/bin/python #-*- coding: utf-8 -*- from pdfminer.pdfparser import PDFParser from pdfminer.pdfdocument import PDFDocument #獲得目錄(綱要) # 打開一個pdf文件 fp = open(u'F:\\pdf\\2013\\000608_陽光股份_2013年年度報告(更新后)_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讀取一個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#打開一個pdf文件 fp = open(u'F:\\pdf\\2013\\000001_平安銀行_2013年年度報告_2562.pdf', 'rb') #創(chuàng)建一個PDF文檔解析器對象 parser = PDFParser(fp) #創(chuàng)建一個PDF文檔對象存儲文檔結(jié)構(gòu) #提供密碼初始化,沒有就不用傳該參數(shù) #document = PDFDocument(parser, password) document = PDFDocument(parser) #檢查文件是否允許文本提取 if not document.is_extractable:raise PDFTextExtractionNotAllowed #創(chuàng)建一個PDF資源管理器對象來存儲共享資源 #caching = False不緩存 rsrcmgr = PDFResourceManager(caching = False) # 創(chuàng)建一個PDF設備對象 laparams = LAParams() # 創(chuàng)建一個PDF頁面聚合對象 device = PDFPageAggregator(rsrcmgr, laparams=laparams) #創(chuàng)建一個PDF解析器對象 interpreter = PDFPageInterpreter(rsrcmgr, device) #處理文檔當中的每個頁面# doc.get_pages() 獲取page列表 #for i, page in enumerate(document.get_pages()): #PDFPage.create_pages(document) 獲取page列表的另一種方式 replace=re.compile(r'\s+'); # 循環(huán)遍歷列表,每次處理一個page的內(nèi)容 for page in PDFPage.create_pages(document):interpreter.process_page(page)# 接受該頁面的LTPage對象layout=device.get_result()# 這里layout是一個LTPage對象 里面存放著 這個page解析出的各種對象# 一般包括LTTextBox, LTFigure, LTImage, LTTextBoxHorizontal 等等for x in layout:#如果x是水平文本對象的話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#將一個pdf轉(zhuǎn)換成txt def pdfTotxt(filepath,outpath):try:fp = file(filepath, 'rb')outfp=file(outpath,'w')#創(chuàng)建一個PDF資源管理器對象來存儲共享資源#caching = False不緩存rsrcmgr = PDFResourceManager(caching = False)# 創(chuàng)建一個PDF設備對象laparams = LAParams()device = TextConverter(rsrcmgr, outfp, codec='utf-8', laparams=laparams,imagewriter=None)#創(chuàng)建一個PDF解析器對象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年年度報告_2562.pdf',u'test.txt')#一個文件夾下的所有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 文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。