使用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)前位置開始的最長(zhǎ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 封裝,支持多種語言,使用簡(jiǎn)單,適合傳統(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)文章
Django 解決由save方法引發(fā)的錯(cuò)誤
這篇文章主要介紹了Django 解決由save方法引發(fā)的錯(cuò)誤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
利用Python連接Oracle數(shù)據(jù)庫的基本操作指南
由于之前的在職的公司沒有機(jī)會(huì)接觸到Oralce數(shù)據(jù)庫,所以就沒有用python連接過Oralce,之前大多集中在連接mysql和sql server,最近在做一下web自動(dòng)化的工作,所以簡(jiǎn)單的記錄一下,下面這篇文章主要給大家介紹了關(guān)于利用Python連接Oracle數(shù)據(jù)庫的基本操作,需要的朋友可以參考下2022-06-06
Python 惰性導(dǎo)入的項(xiàng)目實(shí)踐
Python3.15引入了lazyimports特性,允許在導(dǎo)入模塊時(shí)延遲執(zhí)行,從而避免啟動(dòng)階段的高成本導(dǎo)入,本文就來詳細(xì)的介紹一下惰性導(dǎo)入的項(xiàng)目實(shí)踐,感興趣的可以了解一下2026-04-04
Django 后臺(tái)獲取文件列表 InMemoryUploadedFile的例子
今天小編就為大家分享一篇Django 后臺(tái)獲取文件列表 InMemoryUploadedFile的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08
Python內(nèi)存優(yōu)化之如何創(chuàng)建大量實(shí)例時(shí)節(jié)省內(nèi)存
在Python開發(fā)中,??內(nèi)存消耗??是一個(gè)經(jīng)常被忽視但至關(guān)重要的問題,本文將深入探討Python中各種內(nèi)存優(yōu)化技術(shù),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10
從基礎(chǔ)到高級(jí)詳解Python中HTTP請(qǐng)求處理實(shí)戰(zhàn)指南
HTTP 是互聯(lián)網(wǎng)數(shù)據(jù)通信的基石,它定義了客戶端(如瀏覽器或 Python 腳本)如何與服務(wù)器進(jìn)行交互,下面小編就帶大家深入了解一下Python中HTTP請(qǐng)求處理的相關(guān)知識(shí)吧2026-02-02
Python學(xué)習(xí)之線程池與GIL全局鎖詳解
本文我們將學(xué)習(xí)線程池的創(chuàng)建與全局鎖。線程池的創(chuàng)建于進(jìn)程池的原理是相同的;關(guān)于GIL全局鎖,暫時(shí)沒有代碼上的練習(xí),而是對(duì)其概念進(jìn)行一個(gè)簡(jiǎn)單的啟蒙,感興趣的可以了解一下2022-04-04

