亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python如何讀取PDF文檔(或TXT)

 更新時間:2022年12月01日 10:54:42   作者:愛編程的喵汪人  
這篇文章主要介紹了Python如何讀取PDF文檔(或TXT),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

如何讀取PDF文檔(或TXT)

字符串在Python內(nèi)部的表示是Unicode編碼,首先我們來認(rèn)識Python中encode()和decode()的作用與區(qū)別:

在做編碼轉(zhuǎn)換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。

  • decode的作用是將其他編碼的字符轉(zhuǎn)換成unicode編碼,如str1,decode(‘gb2312’),表示將gb2312編碼的字符串str1轉(zhuǎn)換成unicode編碼。
  • encode的作用是將unicode編碼轉(zhuǎn)換成其他編碼的字符串,如str2,encode(‘gb2312’),表示將unicode編碼的字符串str2轉(zhuǎn)換成gb2312編碼。

常見文檔讀取有:

  • TXT
  • PDF

其中TXT文檔的讀取較為簡單,爬取網(wǎng)頁數(shù)據(jù)時注意read()的編碼設(shè)置即可

我們主要來介紹使用pdfminer3k模塊讀取PDF

文檔PDF的Python讀取

——英文PDF文件支持最好且只支持英文PDF是pyPDF2庫

——而對于多語言PDF文件支持最好的則是pdfminer,我們這里就使用pdfminer3k庫來實現(xiàn)讀取PDF。

1. 安裝pdfminer3k:

——pip install pdfminer3k

——python setup.py install`在這里插入代碼片`

2. 驗證安裝pdfminer3k是否成功:

在cmd下,進(jìn)入tools目錄下( cd ~/Downloads/pdfminer3k-1.3.1/tools)后使用命令 ——python3 pdf2txt.py ../samples/simple1.pdf        #..是退回上一層目錄的意思

3. Python讀取PDF文檔:

pdfminer3k中類的關(guān)系:

讀取流程

——打開pdf文檔的文件對象:

fp = open("naacl06-shinyama.pdf", 'rb')     #本地文檔
fp = urlopen('https://www.tencent.com/zh-cn/articles/802741466496787.pdf')   #在線pdf

——創(chuàng)建文檔分析器(解析器):

pdf_parser = PDFParser(fp)       #傳入pdf,從中獲取數(shù)據(jù) 

——創(chuàng)建文檔對象,保存獲取的數(shù)據(jù):

pdf_doc = PDFDocument()     #保存獲取的數(shù)據(jù),和PDFParser是相互關(guān)聯(lián)的 

——連接分析器和文檔對象:

pdf_parser.set_document(doc)          
doc.set_parser(pdf_parser)       

——判斷文件是否允許文本提?。?/p>

 if not doc.is_extractable:
     raise PDFTextExtractionNotAllowed     #raise如果拋出異常,后續(xù)語句不執(zhí)行

——對文檔對象提供密碼(password)初始化,沒有就不用傳該參數(shù):

doc.initialize("")        

——創(chuàng)建資源管理器:

resource = PDFResourceManager()      #用于存儲共享資源,如字體或圖像

——創(chuàng)建參數(shù)分析器:

laparam = LAParams()

——創(chuàng)建一個頁面聚合器對象:

device = PDFPageAggregator(resource, laparams=laparam)

——創(chuàng)建一個頁面解析器對象來處理頁面內(nèi)容:

interpreter = PDFPageInterpreter(resource, device)     #傳入的是頁面資源和聚合器對象

——獲取page列表:

 doc.get_pages() 

——使用頁面解釋器來讀?。?/p>

interpreter.process_page(page)

——使用頁面聚合器獲得內(nèi)容:

layout = device.get_result()       #這里layout是一個LTPage對象 里面存放著 這個page解析出的各種對象

——循環(huán)遍歷取出聚合器獲得的對象內(nèi)容:

for out in layout:       
        if hasattr(out, 'get_text'):              #判斷out對象是否具有g(shù)et_text方法
            print(out.get_text())                 #輸出out對象

Layout布局分析返回的PDF文檔中的每個頁面LTPage對象。

這個對象和頁內(nèi)包含的子對象,形成一個樹結(jié)構(gòu)。

如圖所示:

樹結(jié)構(gòu)節(jié)點含義:

節(jié)點含義
LTPage表示整個頁??赡軙蠰TTextBox,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曲線

讀取PDF文檔完整實例

from urllib.request import urlopen
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfdevice import PDFDevice
 
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
 
#獲取文檔
#fp = open("naacl06-shinyama.pdf", 'rb')    
fp = urlopen('https://www.tencent.com/zh-cn/articles/802741466496787.pdf')
 
#創(chuàng)建解釋器
pdf_parser = PDFParser(fp)
 
#PDF文檔對象
doc = PDFDocument()
 
#連接解釋器和文檔對象
parser.set_document(doc)
doc.set_parser(parser)
 
#初始化文檔
doc.initialize()
 
#創(chuàng)建PDF資源管理器
resource = PDFResourceManager()
 
# 創(chuàng)建一個PDF參數(shù)分析器
laparam = LAParams()
 
# 創(chuàng)建聚合器
device = PDFPageAggregator(resource, laparams=laparam)
 
#創(chuàng)建PDF頁面解析器
interpreter = PDFPageInterpreter(resource, device)
 
# 循環(huán)遍歷列表,每次處理一頁的內(nèi)容
# doc.get_pages() 獲取page列表

for page in doc.get_pages():
    #使用頁面解釋器來讀取
    interpreter.process_page(page)
    #使用聚合器獲得內(nèi)容
    layout = device.get_result()
    for out in layout:       
        if hasattr(out, 'get_text'):
            print(out.get_text())

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論