1.先pdf转图片
示例代码
import os from pdf2image import convert_from_path # pdf文件路径 pdf_path = '/users/xxx/2022.pdf' # 输出图片的文件夹 output_folder = './output_images2022' # 输出图片的命名格式 output_name = 'page' # 如果输出文件夹不存在,创建它 if not os.path.exists(output_folder): os.makedirs(output_folder) # 将pdf转换为图像列表,设置分辨率为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') # 转灰度 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(' ', '') # 统计子字符串出现次数 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): # 去重关键词以确保唯一性 keywords = list(set(keywords)) # 构建trie树 trie = trie() for kw in keywords: trie.insert(kw) # 初始化计数器 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 # 寻找从当前位置开始的最长匹配关键词 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: # 当前节点是某个关键词的结尾 max_len = current_len end_pos = j + 1 # 更新结束位置为当前字符的下一个位置 else: break # 无后续匹配,退出循环 if max_len > 0: # 更新所有匹配的关键词计数器 for kw in current_node.keywords: counters[kw] += 1 i = end_pos # 跳跃到已匹配部分的末尾 else: i += 1 # 无匹配,移动到下一个字符 return counters if __name__ == "__main__": keywords = ['矮小', '安于现状', '暗藏', '暗淡', '暗黑'] 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:
基于百度飞桨框架开发,模型丰富,支持多语言识别,包括中文、英文等。性能强大,适合复杂场景的文字识别
安装 paddleocr 库:
pip install paddleocr
示例代码
from paddleocr import paddleocr, draw_ocr from pil import image # 初始化 paddleocr # 参数解释: # `lang`:指定语言模型,如 'en'(英文)、'ch'(中文)等。 # `use_angle_cls`:是否启用文字方向分类器。 ocr = paddleocr(use_angle_cls=true, lang='en') # 也可以设置为 'ch' 用于中文[^28^] # 指定图片路径 img_path = 'example.jpg' # 替换为你的图片路径 # 执行 ocr 识别 result = ocr.ocr(img_path, cls=true) # `cls=true` 表示启用方向分类器 # 打印识别结果 for line in result: print(line) # 可选:绘制识别结果并保存 if result: image = image.open(img_path).convert('rgb') boxes = [line[0] for line in result] # 提取文字框 txts = [line[1][0] for line in result] # 提取文字内容 scores = [line[1][1] for line in result] # 提取置信度 # 绘制结果 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
示例代码:识别数字和字母
以下代码展示了如何使用 rapidocr 识别图片中的数字和字母,并仅打印识别结果:
from rapidocr_onnxruntime import rapidocr # 初始化 ocr 引擎 ocr = rapidocr() # 指定图片路径 img_path = 'example.jpg' # 替换为你的图片路径 # 执行识别 result, _ = ocr(img_path) # 提取并打印识别结果(仅数字和字母) if result: for line in result: text = line[1] # 提取文字内容 # 筛选只包含数字和字母的文本 if text.isalnum(): print(text) else: print("未识别到文字")
注意事项
- 图片路径:确保 img_path 指向的图片包含数字或字母。
- 语言设置:默认情况下,rapidocr 支持中英文混合识别。如果需要识别其他语言,可以参考文档进行配置。
- 环境要求:确保 python 版本为 3.6 或更高。
3、easyocr
特点:易于使用,支持多种语言(包括中文、英文等),基于深度学习技术,适合初学者和快速集成。
安装方法:
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]) # 打印识别结果
4、pytesseract
特点:tesseract 的 python 封装,支持多种语言,使用简单,适合传统 ocr 任务。
安装方法:
pip install pytesseract
需要先安装 tesseract ocr,可以从 tesseract 官网 下载。
使用示例:
from pil import image import pytesseract img_path = 'example.jpg' text = pytesseract.image_to_string(image.open(img_path), lang='eng') print(text) # 打印识别结果
5、doctr
特点:专注于文档分析和表格识别,能够提取文档中的结构化信息,适合处理复杂布局的文档。
安装方法:
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) # 打印识别结果
6、pyocr
特点:封装了多个 ocr 引擎(如 tesseract、cuneiform 等),提供了统一的接口。
安装方法:
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) # 打印识别结果
选择建议:
速度优先:推荐使用 rapidocr 或 easyocr。
准确性优先:推荐使用 paddleocr。
易用性优先:推荐使用 easyocr。
文档分析优先:推荐使用 doctr。
注意:根据你的具体需求(如语言支持、应用场景、性能要求等),可以选择最适合的 ocr 库。
到此这篇关于使用python实现pdf转图片再进行ocr识别的文章就介绍到这了,更多相关python pdf转图片内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论