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
其中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)
——判斷文件是否允許文本提取:
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()
——使用頁面解釋器來讀取:
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 | 代表一條直線??捎糜诜蛛x文本或附圖 |
| LTRect | 表示矩形??捎糜诳蚣艿牧硪粓D片或數(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)文章
java關(guān)于string最常出現(xiàn)的面試題整理
在本篇文章里小編給大家整理的是一篇關(guān)于java關(guān)于string最常出現(xiàn)的面試題整理內(nèi)容,有興趣的朋友們可以參考下。2021-01-01
Python中轉(zhuǎn)換角度為弧度的radians()方法
這篇文章主要介紹了Python中轉(zhuǎn)換角度為弧度的radians()方法,是Python入門中的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05
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設(shè)置定時任務(wù),然后通過adb操作手機,完成打卡功能,感興趣的朋友跟隨小編一起看看吧2019-04-04
python獲取android設(shè)備的GPS信息腳本分享
這篇文章主要介紹了python獲取android設(shè)備的GPS信息腳本分享,本文直接給出實現(xiàn)代碼,需要的朋友可以參考下2015-03-03
python pandas dataframe 去重函數(shù)的具體使用
這篇文章主要介紹了python pandas dataframe 去重函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
python通過Matplotlib繪制常見的幾種圖形(推薦)
這篇文章主要介紹了使用matplotlib對幾種常見的圖形進(jìn)行繪制方法的相關(guān)資料,需要的朋友可以參考下2021-08-08

