Python如何讀取PDF文檔(或TXT)
如何讀取PDF文檔(或TXT)
字符串在Python內(nèi)部的表示是Unicode編碼,首先我們來認識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下,進入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()
——使用頁面解釋器來讀?。?/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 | 表示整個頁。可能會含有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曲線 |
讀取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)文章
python中實現(xiàn)php的var_dump函數(shù)功能
這篇文章主要介紹了python中實現(xiàn)php的var_dump函數(shù)功能,var_dump函數(shù)在PHP中調(diào)試時非常實用,本文介紹在Python中實現(xiàn)這個函數(shù),需要的朋友可以參考下2015-01-01
Python數(shù)據(jù)擬合實現(xiàn)最小二乘法示例解析
這篇文章主要為大家介紹了Python數(shù)據(jù)擬合實現(xiàn)最小二乘法的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-10-10
python 求某條線上特定x值或y值的點坐標(biāo)方法
今天小編就為大家分享一篇python 求某條線上特定x值或y值的點坐標(biāo)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python3如何根據(jù)函數(shù)名動態(tài)調(diào)用函數(shù)
這篇文章主要介紹了Python3如何根據(jù)函數(shù)名動態(tài)調(diào)用函數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11

