使用Python實現(xiàn)pdf轉(zhuǎn)圖片再進行OCR識別
1.先pdf轉(zhuǎn)圖片
示例代碼
import os from pdf2image import convert_from_path # PDF文件路徑 pdf_path = '/Users/xxx/2022.pdf' # 輸出圖片的文件夾 output_folder = './output_images2022' # 輸出圖片的命名格式 output_name = 'page' # 如果輸出文件夾不存在,創(chuàng)建它 if not os.path.exists(output_folder): os.makedirs(output_folder) # 將PDF轉(zhuǎn)換為圖像列表,設(shè)置分辨率為300 DPI images = convert_from_path(pdf_path, dpi=300) # 保存每一頁為PNG圖片 for i, image in enumerate(images): image.save(f'{output_folder}/{output_name}_{i+1}.png', 'PNG')
2.OCR識別
示例代碼
from PIL import ImageEnhance import pytesseract from PIL import Image from openpyxl import Workbook # 配置 Tesseract 的路徑(如果需要) # pytesseract.pytesseract.tesseract_cmd = r'/usr/local/bin/tesseract' # Mac 的路徑 # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe' # Windows 的路徑 # 打開圖片 # image_path = "/Users/xxx/page_3.png" # 替換為你的圖片路徑 def enhance_image(img): img = img.convert('L') # 轉(zhuǎn)灰度 img = ImageEnhance.Contrast(img).enhance(2.0) return img def allimngs(image_path): image = Image.open(image_path) image = enhance_image(image) # 使用 pytesseract 進行 OCR text = pytesseract.image_to_string(image, lang="chi_sim") # 中文 # # 打印提取的文本 # print("提取的文本:") # print(text.replace(' ', '')) return text.replace(' ', '') # 統(tǒng)計子字符串出現(xiàn)次數(shù) class TrieNode: def __init__(self): self.children = {} self.keywords = [] class Trie: def __init__(self): self.root = TrieNode() def insert(self, keyword): node = self.root for char in keyword: if char not in node.children: node.children[char] = TrieNode() node = node.children[char] node.keywords.append(keyword) def count_keywords(text, keywords): # 去重關(guān)鍵詞以確保唯一性 keywords = list(set(keywords)) # 構(gòu)建Trie樹 trie = Trie() for kw in keywords: trie.insert(kw) # 初始化計數(shù)器 counters = {kw: 0 for kw in keywords} i = 0 n = len(text) while i < n: current_node = trie.root max_len = 0 current_len = 0 end_pos = i # 尋找從當(dāng)前位置開始的最長匹配關(guān)鍵詞 for j in range(i, n): char = text[j] if char in current_node.children: current_node = current_node.children[char] current_len += 1 if current_node.keywords: # 當(dāng)前節(jié)點是某個關(guān)鍵詞的結(jié)尾 max_len = current_len end_pos = j + 1 # 更新結(jié)束位置為當(dāng)前字符的下一個位置 else: break # 無后續(xù)匹配,退出循環(huán) if max_len > 0: # 更新所有匹配的關(guān)鍵詞計數(shù)器 for kw in current_node.keywords: counters[kw] += 1 i = end_pos # 跳躍到已匹配部分的末尾 else: i += 1 # 無匹配,移動到下一個字符 return counters if __name__ == "__main__": keywords = ['矮小', '安于現(xiàn)狀', '暗藏', '暗淡', '暗黑'] all_text = '' workbook = Workbook() sheet = workbook.active for i in range(108): i = i+1 image_path = f"/Users/xxx/output_images2022/page_{i}.png" all_text = all_text + allimngs(image_path) all_text = all_text.replace(' ', '').replace('\n', '') result = count_keywords(all_text, keywords) num = 1 for k, v in result.items(): sheet[f'A{num}'] = k sheet[f'B{num}'] = v print(k, v, num) num = num + 1 workbook.save(filename='2022.xlsx')
3.知識補充
Python中圖片與pdf識別文本的OCR方法
1、PaddleOCR:
基于百度飛槳框架開發(fā),模型豐富,支持多語言識別,包括中文、英文等。性能強大,適合復(fù)雜場景的文字識別
安裝 PaddleOCR 庫:
pip install paddleocr
示例代碼
from paddleocr import PaddleOCR, draw_ocr from PIL import Image # 初始化 PaddleOCR # 參數(shù)解釋: # `lang`:指定語言模型,如 'en'(英文)、'ch'(中文)等。 # `use_angle_cls`:是否啟用文字方向分類器。 ocr = PaddleOCR(use_angle_cls=True, lang='en') # 也可以設(shè)置為 'ch' 用于中文[^28^] # 指定圖片路徑 img_path = 'example.jpg' # 替換為你的圖片路徑 # 執(zhí)行 OCR 識別 result = ocr.ocr(img_path, cls=True) # `cls=True` 表示啟用方向分類器 # 打印識別結(jié)果 for line in result: print(line) # 可選:繪制識別結(jié)果并保存 if result: image = Image.open(img_path).convert('RGB') boxes = [line[0] for line in result] # 提取文字框 txts = [line[1][0] for line in result] # 提取文字內(nèi)容 scores = [line[1][1] for line in result] # 提取置信度 # 繪制結(jié)果 im_show = draw_ocr(image, boxes, txts, scores, font_path='path/to/PaddleOCR/doc/fonts/simfang.ttf') im_show = Image.fromarray(im_show) im_show.save('result.jpg') # 保存繪制后的圖片[^28^]
2、RapidOCR
首先,確保安裝了 RapidOCR 的 ONNXRuntime 版本,這是一個輕量級且高效的推理引擎:
pip install rapidocr_onnxruntime
示例代碼:識別數(shù)字和字母
以下代碼展示了如何使用 RapidOCR 識別圖片中的數(shù)字和字母,并僅打印識別結(jié)果:
from rapidocr_onnxruntime import RapidOCR # 初始化 OCR 引擎 ocr = RapidOCR() # 指定圖片路徑 img_path = 'example.jpg' # 替換為你的圖片路徑 # 執(zhí)行識別 result, _ = ocr(img_path) # 提取并打印識別結(jié)果(僅數(shù)字和字母) if result: for line in result: text = line[1] # 提取文字內(nèi)容 # 篩選只包含數(shù)字和字母的文本 if text.isalnum(): print(text) else: print("未識別到文字")
注意事項
- 圖片路徑:確保 img_path 指向的圖片包含數(shù)字或字母。
- 語言設(shè)置:默認情況下,RapidOCR 支持中英文混合識別。如果需要識別其他語言,可以參考文檔進行配置。
- 環(huán)境要求:確保 Python 版本為 3.6 或更高。
3、EasyOCR
特點:易于使用,支持多種語言(包括中文、英文等),基于深度學(xué)習(xí)技術(shù),適合初學(xué)者和快速集成。
安裝方法:
pip install easyocr
使用示例:
import easyocr reader = easyocr.Reader(['en', 'ch_sim']) # 支持多語言 img_path = 'example.jpg' result = reader.readtext(img_path) for line in result: print(line[1]) # 打印識別結(jié)果
4、Pytesseract
特點:Tesseract 的 Python 封裝,支持多種語言,使用簡單,適合傳統(tǒng) OCR 任務(wù)。
安裝方法:
pip install pytesseract
需要先安裝 Tesseract OCR,可以從 Tesseract 官網(wǎng) 下載。
使用示例:
from PIL import Image import pytesseract img_path = 'example.jpg' text = pytesseract.image_to_string(Image.open(img_path), lang='eng') print(text) # 打印識別結(jié)果
5、DocTR
特點:專注于文檔分析和表格識別,能夠提取文檔中的結(jié)構(gòu)化信息,適合處理復(fù)雜布局的文檔。
安裝方法:
pip install python-doctr
使用示例:
from doctr.models import ocr_predictor from doctr.io import DocumentFile img_path = 'example.jpg' doc = DocumentFile.from_images(img_path) model = ocr_predictor(pretrained=True) result = model(doc) for block in result.pages[0].blocks: for line in block.lines: for word in line.words: print(word.value) # 打印識別結(jié)果
6、PyOCR
特點:封裝了多個 OCR 引擎(如 Tesseract、Cuneiform 等),提供了統(tǒng)一的接口。
安裝方法:
pip install pyocr
使用示例:
import pyocr from PIL import Image tools = pyocr.get_available_tools() ocr_tool = tools[0] img_path = 'example.jpg' text = ocr_tool.image_to_string(Image.open(img_path), lang='eng') print(text) # 打印識別結(jié)果
選擇建議:
速度優(yōu)先:推薦使用 RapidOCR 或 EasyOCR。
準確性優(yōu)先:推薦使用 PaddleOCR。
易用性優(yōu)先:推薦使用 EasyOCR。
文檔分析優(yōu)先:推薦使用 docTR。
注意:根據(jù)你的具體需求(如語言支持、應(yīng)用場景、性能要求等),可以選擇最適合的 OCR 庫。
到此這篇關(guān)于使用Python實現(xiàn)pdf轉(zhuǎn)圖片再進行OCR識別的文章就介紹到這了,更多相關(guān)Python pdf轉(zhuǎn)圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python處理 yaml 時保持輸入輸出格式一致的問題記錄
這篇文章主要介紹了python處理 yaml 時保持輸入輸出格式一致的問題記錄,要想保持順序不變在dump時添加sort_keys=False,使yaml格式保持原來的排序,本文給大家介紹的非常詳細,需要的朋友可以參考下2024-06-06python十進制和二進制的轉(zhuǎn)換方法(含浮點數(shù))
這篇文章主要介紹了python十進制和二進制的轉(zhuǎn)換方法(含浮點數(shù)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-07-07Python web如何在IIS發(fā)布應(yīng)用過程解析
這篇文章主要介紹了Python web如何在IIS發(fā)布應(yīng)用過程解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05Python必備shelve與dbm本地持久化存儲數(shù)據(jù)的兩個強大工具
當(dāng)涉及存儲大量數(shù)據(jù)并且需要高效訪問時,shelve和dbm模塊是Python中用于本地持久化存儲數(shù)據(jù)的兩個強大工具,它們允許開發(fā)人員以鍵值對的形式存儲數(shù)據(jù),并支持快速的檢索和更新操作,在本文將深入探討這兩個模塊,展示它們的優(yōu)勢和應(yīng)用場景2024-01-01