Python如何讀取PDF文檔(或TXT)
如何讀取PDF文檔(或TXT)
字符串在Python內部的表示是Unicode編碼,首先我們來認識Python中encode()和decode()的作用與區(qū)別:
在做編碼轉換時,通常需要以unicode作為中間編碼,即先將其他編碼的字符解碼(decode)成unicode,再從unicode編碼(encode)成另一種編碼。
- decode的作用是將其他編碼的字符轉換成unicode編碼,如str1,decode(‘gb2312’),表示將gb2312編碼的字符串str1轉換成unicode編碼。
- encode的作用是將unicode編碼轉換成其他編碼的字符串,如str2,encode(‘gb2312’),表示將unicode編碼的字符串str2轉換成gb2312編碼。
常見文檔讀取有:
- TXT
其中TXT文檔的讀取較為簡單,爬取網(wǎng)頁數(shù)據(jù)時注意read()的編碼設置即可
我們主要來介紹使用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下,進入tools目錄下( cd ~/Downloads/pdfminer3k-1.3.1/tools)后使用命令 ——python3 pdf2txt.py ../samples/simple1.pdf #..是退回上一層目錄的意思
3. Python讀取PDF文檔:
pdfminer3k中類的關系:

讀取流程
——打開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是相互關聯(lián)的
——連接分析器和文檔對象:
pdf_parser.set_document(doc) doc.set_parser(pdf_parser)
——判斷文件是否允許文本提取:
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)建一個頁面解析器對象來處理頁面內容:
interpreter = PDFPageInterpreter(resource, device) #傳入的是頁面資源和聚合器對象

——獲取page列表:
doc.get_pages()
——使用頁面解釋器來讀?。?/p>
interpreter.process_page(page)
——使用頁面聚合器獲得內容:
layout = device.get_result() #這里layout是一個LTPage對象 里面存放著 這個page解析出的各種對象
——循環(huán)遍歷取出聚合器獲得的對象內容:
for out in layout:
if hasattr(out, 'get_text'): #判斷out對象是否具有get_text方法
print(out.get_text()) #輸出out對象

Layout布局分析返回的PDF文檔中的每個頁面LTPage對象。
這個對象和頁內包含的子對象,形成一個樹結構。
如圖所示:

樹結構節(jié)點含義:
| 節(jié)點 | 含義 |
|---|---|
| LTPage | 表示整個頁。可能會含有LTTextBox,LTFigure,LTImage,LTRect,LTCurve和LTLine子對象 |
| LTTextBox | 表示一組文本塊可能包含在一個矩形區(qū)域。注意此box是由幾何分析中創(chuàng)建,并且不一定表示該文本的一個邏輯邊界。它包含LTTextLine對象的列表。使用 get_text()方法返回文本內容 |
| LTTextLine | 包含表示單個文本行LTChar對象的列表。字符對齊要么水平或垂直,取決于文本的寫入模式。使用get_text()方法返回文本內容 |
| LTAnno | 在文本中字母實際上被表示為Unicode字符串。需要注意的是,雖然一個LTChar對象具有實際邊界,LTAnno對象沒有,因為這些是“虛擬”的字符,根據(jù)兩個字符間的關系(例如,一個空格)由布局分析后插入 |
| 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)遍歷列表,每次處理一頁的內容
# doc.get_pages() 獲取page列表
for page in doc.get_pages():
#使用頁面解釋器來讀取
interpreter.process_page(page)
#使用聚合器獲得內容
layout = device.get_result()
for out in layout:
if hasattr(out, 'get_text'):
print(out.get_text())
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
pymongo實現(xiàn)控制mongodb中數(shù)字字段做加法的方法
這篇文章主要介紹了pymongo實現(xiàn)控制mongodb中數(shù)字字段做加法的方法,涉及Python使用pymongo模塊操作mongodb數(shù)據(jù)庫字段的技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
使用Python實現(xiàn)企業(yè)微信的自動打卡功能
下面就通過Python程序來實現(xiàn)自動打卡,原理很簡單,用Python設置定時任務,然后通過adb操作手機,完成打卡功能,感興趣的朋友跟隨小編一起看看吧2019-04-04
python pandas dataframe 去重函數(shù)的具體使用
這篇文章主要介紹了python pandas dataframe 去重函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07
python通過Matplotlib繪制常見的幾種圖形(推薦)
這篇文章主要介紹了使用matplotlib對幾種常見的圖形進行繪制方法的相關資料,需要的朋友可以參考下2021-08-08

