使用easyocr、PyPDF2對圖像及PDF文檔進行識別

一、概述

本 Python 腳本的主要功能是對當前目錄及其子目錄下的圖片和 PDF 文件進行光學字符識別(OCR)處理。它使用?easyocr?庫處理圖片中的文字,使用?PyPDF2?庫提取 PDF 文件中的文本,并將處理結果保存為文本文件。同時,腳本會記錄詳細的處理日志,方便用戶跟蹤處理過程和排查問題。

二、環境要求

  • Python 版本:建議使用 Python 3.6 及以上版本。
  • 依賴庫
    • easyocr:用于圖片的 OCR 識別。
    • PyPDF2:用于讀取 PDF 文件并提取文本。
    • PillowPIL):雖然腳本中未直接使用,但?easyocr?處理圖像時可能依賴。

你可以使用以下命令安裝這些依賴庫:

收起

bash

pip install easyocr PyPDF2 Pillow

三、腳本結構與功能模塊

1. 導入必要的庫

收起

python

import os
import time
import easyocr
from PyPDF2 import PdfReader
from PIL import Image

導入了處理文件系統、時間、OCR 識別、PDF 讀取和圖像處理所需的庫。

2. 設置模型下載路徑

收起

python

model_storage_directory = './easyocr_models'
os.makedirs(model_storage_directory, exist_ok=True)

定義了?easyocr?模型的存儲目錄,并確保該目錄存在。

3. 檢查網絡連接

收起

python

def check_network():try:import urllib.requesturllib.request.urlopen('https://www.baidu.com', timeout=5)return Trueexcept:return False

該函數嘗試訪問百度網站,以檢查網絡連接是否正常。如果能成功訪問,則返回?True,否則返回?False

4. 初始化 EasyOCR reader

收起

python

try:print("Initializing EasyOCR...")print(f"Model storage directory: {os.path.abspath(model_storage_directory)}")if not check_network():print("Network connection failed. Please check your internet connection.")exit(1)print("Downloading models (this may take several minutes)...")reader = easyocr.Reader(['ch_sim', 'en'],model_storage_directory=model_storage_directory,download_enabled=True,verbose=True)print("EasyOCR initialized successfully")
except Exception as e:print(f"Failed to initialize EasyOCR: {str(e)}")exit(1)

  • 打印初始化信息和模型存儲目錄的絕對路徑。
  • 檢查網絡連接,若網絡異常則輸出錯誤信息并退出程序。
  • 下載?easyocr?所需的模型,支持中文(簡體)和英文識別。
  • 若初始化成功,打印成功信息;若出現異常,打印錯誤信息并退出程序。

5. 處理圖片文件

收起

python

def process_image(image_path):"""處理圖片文件"""try:result = reader.readtext(image_path)text = '\n'.join([item[1] for item in result])return textexcept Exception as e:print(f"Error processing image {image_path}: {str(e)}")return ""

  • 接受圖片文件路徑作為參數。
  • 使用?easyocr?對圖片進行 OCR 識別,提取識別結果中的文本并拼接成字符串返回。
  • 若處理過程中出現異常,打印錯誤信息并返回空字符串。

6. 處理 PDF 文件

收起

python

def process_pdf(pdf_path):"""處理PDF文件"""try:text = ""reader = PdfReader(pdf_path)for page in reader.pages:text += page.extract_text()return textexcept Exception as e:print(f"Error processing PDF {pdf_path}: {str(e)}")return ""

  • 接受 PDF 文件路徑作為參數。
  • 使用?PyPDF2?讀取 PDF 文件的每一頁,并提取文本拼接成字符串返回。
  • 若處理過程中出現異常,打印錯誤信息并返回空字符串。

7. 保存提取的文本

收起

python

def save_text(text, output_path):"""保存提取的文本"""with open(output_path, 'w', encoding='utf-8') as f:f.write(text)

  • 接受文本內容和輸出文件路徑作為參數。
  • 將文本內容以 UTF-8 編碼寫入指定的輸出文件。

8. 主函數?main

收起

python

def main():# 嘗試多個可能的輸出目錄位置output_folders = ['./output_text',  # 當前目錄os.path.expanduser('~/ocr_output'),  # 用戶主目錄os.path.join(os.getcwd(), 'ocr_output')  # 當前工作目錄]output_folder = Nonefor folder in output_folders:try:os.makedirs(folder, exist_ok=True)output_folder = folderprint(f"Using output directory: {os.path.abspath(output_folder)}")breakexcept Exception as e:print(f"Failed to create output directory {folder}: {str(e)}")if output_folder is None:print("Error: Could not create any output directory")exit(1)# 初始化日志log_file = os.path.join(output_folder, 'ocr_log.txt')# 重定向標準輸出到日志文件import sysclass Logger(object):def __init__(self, filename):self.terminal = sys.stdoutself.log = open(filename, "a", encoding='utf-8')def write(self, message):self.terminal.write(message)self.log.write(message)def flush(self):passsys.stdout = Logger(log_file)print("OCR Processing Log\n")print(f"Starting OCR processing at {time.strftime('%Y-%m-%d %H:%M:%S')}")# 支持的圖片格式image_extensions = ['.bmp', '.jpg', '.jpeg', '.png', '.tiff', '.gif']# 遍歷當前目錄及子目錄for root, dirs, files in os.walk('.'):for file in files:file_path = os.path.join(root, file)base_name, ext = os.path.splitext(file)try:# 處理圖片文件if ext.lower() in image_extensions:print(f"Processing image: {file_path}")text = process_image(file_path)output_path = os.path.join(output_folder, f"{base_name}.txt")save_text(text, output_path)print(f"Successfully processed image: {file_path} -> {output_path}")with open(log_file, 'a') as f:f.write(f"Success: {file_path} -> {output_path}\n")# 處理PDF文件elif ext.lower() == '.pdf':print(f"Processing PDF: {file_path}")text = process_pdf(file_path)output_path = os.path.join(output_folder, f"{base_name}.txt")save_text(text, output_path)print(f"Successfully processed PDF: {file_path} -> {output_path}")with open(log_file, 'a') as f:f.write(f"Success: {file_path} -> {output_path}\n")except Exception as e:error_msg = f"Error processing {file_path}: {str(e)}"print(error_msg)with open(log_file, 'a') as f:f.write(error_msg + "\n")

  • 輸出目錄處理:嘗試在多個預設位置創建輸出目錄,若創建成功則使用該目錄,若所有嘗試均失敗則輸出錯誤信息并退出程序。
  • 日志初始化:在輸出目錄下創建?ocr_log.txt?日志文件,將標準輸出重定向到該日志文件,同時保留在終端的輸出。記錄日志頭部信息和處理開始時間。
  • 文件遍歷與處理:遍歷當前目錄及其子目錄下的所有文件,對圖片文件調用?process_image?函數處理,對 PDF 文件調用?process_pdf?函數處理。將處理結果保存為文本文件,并在日志中記錄成功或失敗信息。

9. 程序入口

收起

python

if __name__ == "__main__":main()

當腳本作為主程序運行時,調用?main?函數開始執行。

四、使用方法

  1. 將腳本保存為一個 Python 文件(例如?ocr_process.py)。
  2. 確保所需的依賴庫已安裝。
  3. 打開終端或命令提示符,進入腳本所在的目錄。
  4. 運行腳本:

收起

bash

python ocr_process.py
  1. 腳本會自動處理當前目錄及其子目錄下的圖片和 PDF 文件,并將處理結果保存到指定的輸出目錄中,同時生成處理日志。

五、注意事項

  • 由于?easyocr?模型下載可能需要一定時間,首次運行腳本時請確保網絡連接穩定,耐心等待模型下載完成。
  • 對于 PDF 文件,PyPDF2?只能提取文本內容,若 PDF 為掃描版或加密文件,可能無法正常提取文本。
  • 若處理過程中出現錯誤,請查看日志文件?ocr_log.txt?以獲取詳細的錯誤信息。

完成代碼

import os
import time
import easyocr
from PyPDF2 import PdfReader
from PIL import Image# 設置模型下載路徑
model_storage_directory = './easyocr_models'
os.makedirs(model_storage_directory, exist_ok=True)# 檢查網絡連接
def check_network():try:import urllib.requesturllib.request.urlopen('https://www.baidu.com', timeout=5)return Trueexcept:return False# 初始化EasyOCR reader
try:print("Initializing EasyOCR...")print(f"Model storage directory: {os.path.abspath(model_storage_directory)}")if not check_network():print("Network connection failed. Please check your internet connection.")exit(1)print("Downloading models (this may take several minutes)...")reader = easyocr.Reader(['ch_sim', 'en'],model_storage_directory=model_storage_directory,download_enabled=True,verbose=True)print("EasyOCR initialized successfully")
except Exception as e:print(f"Failed to initialize EasyOCR: {str(e)}")exit(1)def process_image(image_path):"""處理圖片文件"""try:# 使用EasyOCR提取文本result = reader.readtext(image_path)# 合并所有識別結果text = '\n'.join([item[1] for item in result])return textexcept Exception as e:print(f"Error processing image {image_path}: {str(e)}")return ""def process_pdf(pdf_path):"""處理PDF文件"""try:text = ""reader = PdfReader(pdf_path)for page in reader.pages:text += page.extract_text()return textexcept Exception as e:print(f"Error processing PDF {pdf_path}: {str(e)}")return ""def save_text(text, output_path):"""保存提取的文本"""with open(output_path, 'w', encoding='utf-8') as f:f.write(text)def main():# 嘗試多個可能的輸出目錄位置output_folders = ['./output_text',  # 當前目錄os.path.expanduser('~/ocr_output'),  # 用戶主目錄os.path.join(os.getcwd(), 'ocr_output')  # 當前工作目錄]output_folder = Nonefor folder in output_folders:try:os.makedirs(folder, exist_ok=True)output_folder = folderprint(f"Using output directory: {os.path.abspath(output_folder)}")breakexcept Exception as e:print(f"Failed to create output directory {folder}: {str(e)}")if output_folder is None:print("Error: Could not create any output directory")exit(1)# 初始化日志log_file = os.path.join(output_folder, 'ocr_log.txt')# 重定向標準輸出到日志文件import sysclass Logger(object):def __init__(self, filename):self.terminal = sys.stdoutself.log = open(filename, "a", encoding='utf-8')def write(self, message):self.terminal.write(message)self.log.write(message)def flush(self):passsys.stdout = Logger(log_file)print("OCR Processing Log\n")print(f"Starting OCR processing at {time.strftime('%Y-%m-%d %H:%M:%S')}")# 支持的圖片格式image_extensions = ['.bmp', '.jpg', '.jpeg', '.png', '.tiff', '.gif']# 遍歷當前目錄及子目錄for root, dirs, files in os.walk('.'):for file in files:file_path = os.path.join(root, file)base_name, ext = os.path.splitext(file)try:# 處理圖片文件if ext.lower() in image_extensions:print(f"Processing image: {file_path}")text = process_image(file_path)output_path = os.path.join(output_folder, f"{base_name}.txt")save_text(text, output_path)print(f"Successfully processed image: {file_path} -> {output_path}")with open(log_file, 'a') as f:f.write(f"Success: {file_path} -> {output_path}\n")# 處理PDF文件elif ext.lower() == '.pdf':print(f"Processing PDF: {file_path}")text = process_pdf(file_path)output_path = os.path.join(output_folder, f"{base_name}.txt")save_text(text, output_path)print(f"Successfully processed PDF: {file_path} -> {output_path}")with open(log_file, 'a') as f:f.write(f"Success: {file_path} -> {output_path}\n")except Exception as e:error_msg = f"Error processing {file_path}: {str(e)}"print(error_msg)with open(log_file, 'a') as f:f.write(error_msg + "\n")if __name__ == "__main__":main()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71297.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71297.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71297.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2000-2020年各省地方財政一般預算支出數據

2000-2020年各省地方財政一般預算支出數據 1、時間:2000-2020年 2、來源:國家統計局、統計年鑒 3、指標;行政區劃代碼、地區、年份、地方財政一般預算支出(億元) 4、范圍:31省 5、指標解釋:一般預算支出是國家對集中的預算收…

k8s 中各種發布方式介紹以及對比

前言 在 Kubernetes(K8s)中,不同的發布策略(如金絲雀發布、灰度發布、藍綠發布等)各有其適用場景和優缺點。 1. 滾動發布(Rolling Update) 核心原理:逐步替換舊版本 Pod 為新版本&…

力扣HOT100之哈希:1. 兩數之和

這道題之前刷代碼隨想錄的時候已經刷過好幾遍了&#xff0c;看到就直接秒了。這道題主要是通過unordered_map<int, int>來建立哈希表&#xff0c;其中鍵用來保存向量中的元素&#xff0c;而對應的值則為元素的下標。遍歷整個向量&#xff0c;當遍歷到nums[i]時&#xff0…

kakfa-3:ISR機制、HWLEO、生產者、消費者、核心參數負載均衡

1. kafka內核原理 1.1 ISR機制 光是依靠多副本機制能保證Kafka的高可用性&#xff0c;但是能保證數據不丟失嗎&#xff1f;不行&#xff0c;因為如果leader宕機&#xff0c;但是leader的數據還沒同步到follower上去&#xff0c;此時即使選舉了follower作為新的leader&#xff…

從小米汽車召回看智駕“命門”:智能化時代 — 時間就是安全

2025年1月&#xff0c;小米因車輛“授時同步異常”召回3萬余輛小米SU7&#xff0c;成為其造車歷程中的首個重大安全事件。 從小米SU7召回事件剖析&#xff0c;授時同步何以成為智能駕駛的命門&#xff1f; 2024年11月&#xff0c;多名車主反饋SU7標準版的智能泊車輔助功能出現…

FastGPT 引申:如何基于 LLM 判斷知識庫的好壞

文章目錄 如何基于 LLM 判斷知識庫的好壞方法概述示例 Prompt聲明抽取器 Prompt聲明檢查器 Prompt 判斷機制總結 下面介紹如何基于 LLM 判斷知識庫的好壞&#xff0c;并展示了如何利用聲明抽取器和聲明檢查器這兩個 prompt 構建評價體系。 如何基于 LLM 判斷知識庫的好壞 在知…

【數據挖掘】NumPy的索引與切片(Indexing Slicing)

&#x1f4cc; NumPy ndarray 的索引與切片&#xff08;Indexing & Slicing&#xff09; NumPy 提供 靈活高效 的索引與切片方式&#xff0c;支持 一維、二維、多維數組 的訪問與操作。 1?? 索引&#xff08;Indexing&#xff09; 索引用于訪問 NumPy 數組中的 單個元素…

AI工具:deepseek+階躍視頻,生成好玩的視頻

目標 測試一下&#xff0c;當下好玩的AI工具&#xff0c;緩解一下緊張的AI學習~ 用deepseek生成視頻制作提示詞&#xff0c;讓后把提示詞給階躍視頻生成&#xff0c;一個視頻就生成了。具體操作如下。 操作過程 在階躍官網&#xff0c;階躍AI&#xff0c;注冊一個賬號&…

利用矩陣相乘手動實現卷積操作

卷積&#xff08;Convolution&#xff09; 是信號處理和圖像處理中的一種重要操作&#xff0c;廣泛應用于深度學習&#xff08;尤其是卷積神經網絡&#xff0c;CNN&#xff09;中。它的核心思想是通過一個卷積核&#xff08;Kernel&#xff09; 或 濾波器&#xff08;Filter&am…

前端面試場景題葵花寶典之四

87.場景面試之大數運算&#xff1a;超過js中number最大值的數怎么處理 在 JavaScript 中&#xff0c;Number.MAX_SAFE_INTEGER&#xff08;即 2^53 - 1&#xff0c;即 9007199254740991&#xff09;是能被安全表示的最大整數。超過此值時&#xff0c;普通的 Number 類型會出現…

Linux中死鎖問題的探討

在 Linux 中&#xff0c;死鎖&#xff08;Deadlock&#xff09; 是指多個進程或線程因為競爭資源而相互等待&#xff0c;導致所有相關進程或線程都無法繼續執行的狀態。死鎖是一種嚴重的系統問題&#xff0c;會導致系統資源浪費&#xff0c;甚至系統崩潰。 死鎖的定義 死鎖是指…

【基于Mesh組網的UWB技術討論】

基于Mesh組網的UWB技術討論 Mesh 組網無線Mesh與無線中繼的區別 基于Mesh拓撲的UWB技術可行性星型拓撲 / Mesh拓撲的UWB技術比較 Mesh 組網 Mesh(網格)是一種無中心、自組織的高度業務協同的網絡。通常分為無線Mesh和有線Mesh&#xff0c;但在實際應用場景&#xff0c;有線Mes…

Python Cookbook-3.1 計算昨天和明天的日期

任務 獲得今天的日期&#xff0c;并以此計算昨天和明天的日期。 解決方案 方案一&#xff1a; 無論何時遇到有關“時間變化”或者“時間差”的問題&#xff0c;先考慮datetime包: import datetime today datetime.date.today() yesterday today - datetime.timedelta(day…

USB 模塊 全面解析(二)

本文是我整理的一些 USB 的學習心得&#xff0c;希望能對大家有所幫助。 文章目錄 前言&#x1f34d;USB 協議層數據格式&#x1f347;包格式&#x1f353; PID 域&#x1f353; 令牌包&#x1f353; 數據包&#x1f353; 握手包 &#x1f347;傳輸類型&#x1f353; 批量傳輸&…

從基礎到實踐(十):MOS管的全面解析與實際應用

MOS管&#xff08;金屬-氧化物半導體場效應晶體管&#xff09;是現代電子技術的基石&#xff0c;憑借高輸入阻抗、低功耗和易集成特性&#xff0c;成為數字電路、電源管理和信號處理的核心元件。從微處理器到新能源汽車電驅系統&#xff0c;其高效開關與放大功能支撐了計算機、…

AES/CBC/PKCS5Padding加密

1、加密代碼如下 public static String encryptAEs_CBC(String data,String key,byte[] iv) {Cipher cipher = null;try {cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//位數不夠,自動補一個長度int blocksize = cipher.getBlockSize();byte[] dataBytes …

指紋細節提取(Matlab實現)

指紋細節提取概述指紋作為人體生物特征識別領域中應用最為廣泛的特征之一&#xff0c;具有獨特性、穩定性和便利性。指紋細節特征對于指紋識別的準確性和可靠性起著關鍵作用。指紋細節提取&#xff0c;即從指紋圖像中精確地提取出能夠表征指紋唯一性的關鍵特征點&#xff0c;是…

Python 圖像處理之 Pillow 庫:玩轉圖片

哈嘍,大家好,我是木頭左! Pillow 庫作為 Python 圖像處理的重要工具之一,為提供了便捷且功能豐富的接口,讓能夠輕松地對圖像進行各種操作,從簡單的裁剪、旋轉到復雜的濾鏡應用、圖像合成等,幾乎無所不能。接下來,就讓一起深入探索如何使用 Pillow 庫來處理圖片,開啟一…

Android Flow 示例

在Android開發的世界里&#xff0c;處理異步數據流一直是一個挑戰。隨著Kotlin的流行&#xff0c;Flow作為Kotlin協程庫的一部分&#xff0c;為開發者提供了一種全新的方式來處理這些問題。今天&#xff0c;我將深入探討Flow的設計理念&#xff0c;并通過具體的例子展示如何在實…

記錄uniapp小程序對接騰訊IM即時通訊無ui集成(2)

完成以上步驟之后開始進行登錄&#xff0c;登陸就需要賬號。這個賬號我們可以在騰訊云中創建。 有了賬號之后開始去小程序進行登陸操作。騰訊云接口文檔 這里除了帳號還需要一個校驗值userSig正常項目開發這個字段可以在登陸后讓后端返回&#xff0c;現在是測試我們直接去控制…