使用Python實(shí)現(xiàn)pdf轉(zhuǎn)圖片再進(jìn)行OCR識(shí)別
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識(shí)別
示例代碼
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 進(jìn)行 OCR
text = pytesseract.image_to_string(image, lang="chi_sim") # 中文
# # 打印提取的文本
# print("提取的文本:")
# print(text.replace(' ', ''))
return text.replace(' ', '')
# 統(tǒng)計(jì)子字符串出現(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)
# 初始化計(jì)數(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é)點(diǎn)是某個(gè)關(guān)鍵詞的結(jié)尾
max_len = current_len
end_pos = j + 1 # 更新結(jié)束位置為當(dāng)前字符的下一個(gè)位置
else:
break # 無后續(xù)匹配,退出循環(huán)
if max_len > 0:
# 更新所有匹配的關(guān)鍵詞計(jì)數(shù)器
for kw in current_node.keywords:
counters[kw] += 1
i = end_pos # 跳躍到已匹配部分的末尾
else:
i += 1 # 無匹配,移動(dòng)到下一個(gè)字符
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.知識(shí)補(bǔ)充
Python中圖片與pdf識(shí)別文本的OCR方法
1、PaddleOCR:
基于百度飛槳框架開發(fā),模型豐富,支持多語言識(shí)別,包括中文、英文等。性能強(qiáng)大,適合復(fù)雜場(chǎng)景的文字識(shí)別
安裝 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 識(shí)別
result = ocr.ocr(img_path, cls=True) # `cls=True` 表示啟用方向分類器
# 打印識(shí)別結(jié)果
for line in result:
print(line)
# 可選:繪制識(shí)別結(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 版本,這是一個(gè)輕量級(jí)且高效的推理引擎:
pip install rapidocr_onnxruntime
示例代碼:識(shí)別數(shù)字和字母
以下代碼展示了如何使用 RapidOCR 識(shí)別圖片中的數(shù)字和字母,并僅打印識(shí)別結(jié)果:
from rapidocr_onnxruntime import RapidOCR
# 初始化 OCR 引擎
ocr = RapidOCR()
# 指定圖片路徑
img_path = 'example.jpg' # 替換為你的圖片路徑
# 執(zhí)行識(shí)別
result, _ = ocr(img_path)
# 提取并打印識(shí)別結(jié)果(僅數(shù)字和字母)
if result:
for line in result:
text = line[1] # 提取文字內(nèi)容
# 篩選只包含數(shù)字和字母的文本
if text.isalnum():
print(text)
else:
print("未識(shí)別到文字")
注意事項(xiàng)
- 圖片路徑:確保 img_path 指向的圖片包含數(shù)字或字母。
- 語言設(shè)置:默認(rèn)情況下,RapidOCR 支持中英文混合識(shí)別。如果需要識(shí)別其他語言,可以參考文檔進(jìn)行配置。
- 環(huán)境要求:確保 Python 版本為 3.6 或更高。
3、EasyOCR
特點(diǎn):易于使用,支持多種語言(包括中文、英文等),基于深度學(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]) # 打印識(shí)別結(jié)果
4、Pytesseract
特點(diǎn):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) # 打印識(shí)別結(jié)果
5、DocTR
特點(diǎn):專注于文檔分析和表格識(shí)別,能夠提取文檔中的結(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) # 打印識(shí)別結(jié)果
6、PyOCR
特點(diǎn):封裝了多個(gè) 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) # 打印識(shí)別結(jié)果
選擇建議:
速度優(yōu)先:推薦使用 RapidOCR 或 EasyOCR。
準(zhǔn)確性優(yōu)先:推薦使用 PaddleOCR。
易用性優(yōu)先:推薦使用 EasyOCR。
文檔分析優(yōu)先:推薦使用 docTR。
注意:根據(jù)你的具體需求(如語言支持、應(yīng)用場(chǎng)景、性能要求等),可以選擇最適合的 OCR 庫。
到此這篇關(guān)于使用Python實(shí)現(xiàn)pdf轉(zhuǎn)圖片再進(jìn)行OCR識(shí)別的文章就介紹到這了,更多相關(guān)Python pdf轉(zhuǎn)圖片內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python腳本實(shí)現(xiàn)下載合并SAE日志
這篇文章主要介紹了Python腳本實(shí)現(xiàn)下載合并SAE日志,本文講解了代碼編寫過程,然后給出了完整代碼,需要的朋友可以參考下2015-02-02
Python實(shí)現(xiàn)自定義包的實(shí)例詳解
這篇文章主要介紹了實(shí)現(xiàn)自定義包的方法,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
python處理 yaml 時(shí)保持輸入輸出格式一致的問題記錄
這篇文章主要介紹了python處理 yaml 時(shí)保持輸入輸出格式一致的問題記錄,要想保持順序不變?cè)赿ump時(shí)添加sort_keys=False,使yaml格式保持原來的排序,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-06-06
python十進(jìn)制和二進(jìn)制的轉(zhuǎn)換方法(含浮點(diǎn)數(shù))
這篇文章主要介紹了python十進(jìn)制和二進(jìn)制的轉(zhuǎn)換方法(含浮點(diǎn)數(shù)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-07-07
Python web如何在IIS發(fā)布應(yīng)用過程解析
這篇文章主要介紹了Python web如何在IIS發(fā)布應(yīng)用過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Python必備shelve與dbm本地持久化存儲(chǔ)數(shù)據(jù)的兩個(gè)強(qiáng)大工具
當(dāng)涉及存儲(chǔ)大量數(shù)據(jù)并且需要高效訪問時(shí),shelve和dbm模塊是Python中用于本地持久化存儲(chǔ)數(shù)據(jù)的兩個(gè)強(qiáng)大工具,它們?cè)试S開發(fā)人員以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù),并支持快速的檢索和更新操作,在本文將深入探討這兩個(gè)模塊,展示它們的優(yōu)勢(shì)和應(yīng)用場(chǎng)景2024-01-01

