Python從PDF中提取文本的方法效率總結(jié)
前言
這段時(shí)間做了好幾個(gè)關(guān)于年報(bào)的需求,其中無(wú)一例外需要從年報(bào)PDF中提取文本再進(jìn)行下一步的操作。為了提高效率,對(duì)比分析了python中各種可以實(shí)現(xiàn)此功能的方法效率。
一、pdfplumber
簡(jiǎn)介:
- 可以為pdf文件插入文本字符、矩形和行的詳細(xì)信息
- 對(duì)于非掃描格式pdf解析效果最佳
- 基于pdfminer.six構(gòu)建
- 代碼簡(jiǎn)潔,易于理解
安裝:
pip install pdfplumber
示例:
import pdfplumber
def pdf2txt(pdf_path):
txt = ''
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
txt = txt + page.extract_text()
return txt二、pdfminer
簡(jiǎn)介:
- 可以獲取文本的提取位置以及其他布局信息
- 可將pdf轉(zhuǎn)換為其他格式(HTML/XML)
- 支持基本的加密方式(RC4 and AES)
安裝:
pip install pdfminer
示例:
from pdfminer.converter import TextConverter
from pdfminer.pdfdocument import PDFTextExtractionNotAllowed
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
def parsePDF(PDF_path):
resource_manager = PDFResourceManager()
fake_file_handle = io.StringIO()
converter = TextConverter(resource_manager,fake_file_handle)
page_interpreter = PDFPageInterpreter(resource_manager,converter)
with open(PDF_path,'rb') as fh:
for page in PDFPage.get_pages(fh,caching=True,check_extractable=True):
page_interpreter.process_page(page)
text = fake_file_handle.getvalue()
converter.close()
fake_file_handle.close()
if text:
return text三、fitz / pymupdf
簡(jiǎn)介:
- 支持多種格式
- 可以提取文字和圖像
- 搜索文本
安裝:
直接安裝fitz會(huì)出現(xiàn)較多問(wèn)題,建議安裝pymupdf
pip install pymupdf
示例:
import fitz
def parsePDF(filePath):
with fitz.open(filePath) as doc:
text = ""
for page in doc.pages():
text += page.get_text()
if text:
return text官方示例:
https://github.com/pymupdf/PyMuPDF/tree/master/tests
四、性能對(duì)比
使用以上三種方法對(duì)同一個(gè)PDF進(jìn)行文本提取,分別記錄提取文本結(jié)果的長(zhǎng)度和運(yùn)行時(shí)間,結(jié)果如下:

fitz提取出的文本長(zhǎng)度不僅更長(zhǎng),耗時(shí)更是快了不止10倍!
可以說(shuō)fitz在提取文本的性能方面完爆其他庫(kù),但是卻很少有文章介紹這個(gè)庫(kù),有點(diǎn)奇怪。
總結(jié)
到此這篇關(guān)于Python從PDF中提取文本的方法效率的文章就介紹到這了,更多相關(guān)Python從PDF提取文本內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python應(yīng)用開(kāi)發(fā)頻繁假死的問(wèn)題分析及解決
最近在開(kāi)發(fā)一款自動(dòng)化的應(yīng)用,但是,在測(cè)試時(shí),卻發(fā)現(xiàn)了問(wèn)題,當(dāng)我點(diǎn)擊暫停任務(wù)后,此時(shí)子線程被阻塞,如果我這個(gè)時(shí)候點(diǎn)擊停止,那么就會(huì)任務(wù)結(jié)束,之后,如果我再點(diǎn)擊開(kāi)始運(yùn)行,整個(gè)應(yīng)用就會(huì)卡死,所以本文介紹了Python應(yīng)用開(kāi)發(fā)頻繁假死的問(wèn)題分析及解決,需要的朋友可以參考下2024-08-08
Python RabbitMQ實(shí)現(xiàn)簡(jiǎn)單的進(jìn)程間通信示例
這篇文章主要介紹了Python RabbitMQ實(shí)現(xiàn)簡(jiǎn)單的進(jìn)程間通信示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Python wxpython模塊響應(yīng)鼠標(biāo)拖動(dòng)事件操作示例
這篇文章主要介紹了Python wxpython模塊響應(yīng)鼠標(biāo)拖動(dòng)事件操作,結(jié)合實(shí)例形式分析了Python使用wxpython模塊創(chuàng)建窗口、綁定事件及相應(yīng)鼠標(biāo)事件相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
解決Django生產(chǎn)環(huán)境無(wú)法加載靜態(tài)文件問(wèn)題的解決
這篇文章主要介紹了解決Django生產(chǎn)環(huán)境無(wú)法加載靜態(tài)文件問(wèn)題的解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04
Python Flask的request對(duì)象使用詳解
本文介紹Flask request對(duì)象,一個(gè)完整的HTTP請(qǐng)求,包括客戶端向服務(wù)端發(fā)送的Request請(qǐng)求和服務(wù)器端發(fā)送Response響應(yīng).為了能方便訪問(wèn)獲取請(qǐng)求及響應(yīng)報(bào)文信息,Flask框架提供了一些內(nèi)建對(duì)象,下面就來(lái)說(shuō)一下Flask針對(duì)請(qǐng)求提供內(nèi)建對(duì)象reques,需要的朋友可以參考一下2023-02-02
Prometheus開(kāi)發(fā)中間件Exporter過(guò)程詳解
這篇文章主要介紹了Prometheus開(kāi)發(fā)中間件Exporter過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
SQLAlchemy 2.0 類(lèi)型注解指南之Mapped與mapped_column詳解
SQLAlchemy 1.4和2.0引入了新的聲明式映射系統(tǒng),核心組件是Mapped類(lèi)型注解和mapped_column構(gòu)造函數(shù),旨在提供更好的Python類(lèi)型提示支持,本文介紹SQLAlchemy 2.0 類(lèi)型注解指南之Mapped與mapped_column,感興趣的朋友跟隨小編一起看看吧2025-12-12

