• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    使用Python实现pdf转图片再进行OCR识别

    发布者: 涵韵 | 发布时间: 2025-6-14 12:24| 查看数: 48| 评论数: 0|帖子模式

    1.先pdf转图片
    示例代码
    1. import os
    2. from pdf2image import convert_from_path

    3. # PDF文件路径
    4. pdf_path = '/Users/xxx/2022.pdf'
    5. # 输出图片的文件夹
    6. output_folder = './output_images2022'
    7. # 输出图片的命名格式
    8. output_name = 'page'

    9. # 如果输出文件夹不存在,创建它
    10. if not os.path.exists(output_folder):
    11.     os.makedirs(output_folder)

    12. # 将PDF转换为图像列表,设置分辨率为300 DPI
    13. images = convert_from_path(pdf_path, dpi=300)

    14. # 保存每一页为PNG图片
    15. for i, image in enumerate(images):
    16.     image.save(f'{output_folder}/{output_name}_{i+1}.png', 'PNG')
    复制代码
    2.OCR识别
    示例代码
    1. from PIL import ImageEnhance
    2. import pytesseract
    3. from PIL import Image
    4. from openpyxl import Workbook

    5. # 配置 Tesseract 的路径(如果需要)
    6. # pytesseract.pytesseract.tesseract_cmd = r'/usr/local/bin/tesseract'  # Mac 的路径
    7. # pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'  # Windows 的路径

    8. # 打开图片
    9. # image_path = "/Users/xxx/page_3.png"  # 替换为你的图片路径


    10. def enhance_image(img):
    11.     img = img.convert('L')  # 转灰度
    12.     img = ImageEnhance.Contrast(img).enhance(2.0)
    13.     return img


    14. def allimngs(image_path):

    15.     image = Image.open(image_path)

    16.     image = enhance_image(image)

    17.     # 使用 pytesseract 进行 OCR
    18.     text = pytesseract.image_to_string(image, lang="chi_sim")  # 中文

    19.     # # 打印提取的文本
    20.     # print("提取的文本:")
    21.     # print(text.replace(' ', ''))

    22.     return text.replace(' ', '')


    23. # 统计子字符串出现次数

    24. class TrieNode:
    25.     def __init__(self):
    26.         self.children = {}
    27.         self.keywords = []


    28. class Trie:
    29.     def __init__(self):
    30.         self.root = TrieNode()

    31.     def insert(self, keyword):
    32.         node = self.root
    33.         for char in keyword:
    34.             if char not in node.children:
    35.                 node.children[char] = TrieNode()
    36.             node = node.children[char]
    37.         node.keywords.append(keyword)


    38. def count_keywords(text, keywords):
    39.     # 去重关键词以确保唯一性
    40.     keywords = list(set(keywords))

    41.     # 构建Trie树
    42.     trie = Trie()
    43.     for kw in keywords:
    44.         trie.insert(kw)

    45.     # 初始化计数器
    46.     counters = {kw: 0 for kw in keywords}
    47.     i = 0
    48.     n = len(text)

    49.     while i < n:
    50.         current_node = trie.root
    51.         max_len = 0
    52.         current_len = 0
    53.         end_pos = i

    54.         # 寻找从当前位置开始的最长匹配关键词
    55.         for j in range(i, n):
    56.             char = text[j]
    57.             if char in current_node.children:
    58.                 current_node = current_node.children[char]
    59.                 current_len += 1
    60.                 if current_node.keywords:  # 当前节点是某个关键词的结尾
    61.                     max_len = current_len
    62.                     end_pos = j + 1  # 更新结束位置为当前字符的下一个位置
    63.             else:
    64.                 break  # 无后续匹配,退出循环

    65.         if max_len > 0:
    66.             # 更新所有匹配的关键词计数器
    67.             for kw in current_node.keywords:
    68.                 counters[kw] += 1
    69.             i = end_pos  # 跳跃到已匹配部分的末尾
    70.         else:
    71.             i += 1  # 无匹配,移动到下一个字符

    72.     return counters


    73. if __name__ == "__main__":
    74.     keywords = ['矮小',
    75.                 '安于现状',
    76.                 '暗藏',
    77.                 '暗淡',
    78.                 '暗黑']
    79.     all_text = ''
    80.     workbook = Workbook()
    81.     sheet = workbook.active

    82.     for i in range(108):
    83.         i = i+1
    84.         image_path = f"/Users/xxx/output_images2022/page_{i}.png"
    85.         all_text = all_text + allimngs(image_path)

    86.     all_text = all_text.replace(' ', '').replace('\n', '')

    87.     result = count_keywords(all_text, keywords)

    88.     num = 1

    89.     for k, v in result.items():
    90.         sheet[f'A{num}'] = k
    91.         sheet[f'B{num}'] = v
    92.         print(k, v, num)
    93.         num = num + 1

    94.     workbook.save(filename='2022.xlsx')
    复制代码
    3.知识补充
    Python中图片与pdf识别文本的OCR方法
    1、PaddleOCR:
    基于百度飞桨框架开发,模型丰富,支持多语言识别,包括中文、英文等。性能强大,适合复杂场景的文字识别
    安装 PaddleOCR 库:
    1. pip install paddleocr
    复制代码
    示例代码
    1. from paddleocr import PaddleOCR, draw_ocr
    2. from PIL import Image

    3. # 初始化 PaddleOCR
    4. # 参数解释:
    5. # `lang`:指定语言模型,如 'en'(英文)、'ch'(中文)等。
    6. # `use_angle_cls`:是否启用文字方向分类器。
    7. ocr = PaddleOCR(use_angle_cls=True, lang='en')  # 也可以设置为 'ch' 用于中文[^28^]

    8. # 指定图片路径
    9. img_path = 'example.jpg'  # 替换为你的图片路径

    10. # 执行 OCR 识别
    11. result = ocr.ocr(img_path, cls=True)  # `cls=True` 表示启用方向分类器

    12. # 打印识别结果
    13. for line in result:
    14.     print(line)

    15. # 可选:绘制识别结果并保存
    16. if result:
    17.     image = Image.open(img_path).convert('RGB')
    18.     boxes = [line[0] for line in result]  # 提取文字框
    19.     txts = [line[1][0] for line in result]  # 提取文字内容
    20.     scores = [line[1][1] for line in result]  # 提取置信度

    21.     # 绘制结果
    22.     im_show = draw_ocr(image, boxes, txts, scores, font_path='path/to/PaddleOCR/doc/fonts/simfang.ttf')
    23.     im_show = Image.fromarray(im_show)
    24.     im_show.save('result.jpg')  # 保存绘制后的图片[^28^]
    复制代码
    2、RapidOCR
    首先,确保安装了 RapidOCR 的 ONNXRuntime 版本,这是一个轻量级且高效的推理引擎:
    1. pip install rapidocr_onnxruntime
    复制代码
    示例代码:识别数字和字母
    以下代码展示了如何使用 RapidOCR 识别图片中的数字和字母,并仅打印识别结果:
    1. from rapidocr_onnxruntime import RapidOCR

    2. # 初始化 OCR 引擎
    3. ocr = RapidOCR()

    4. # 指定图片路径
    5. img_path = 'example.jpg'  # 替换为你的图片路径

    6. # 执行识别
    7. result, _ = ocr(img_path)

    8. # 提取并打印识别结果(仅数字和字母)
    9. if result:
    10.     for line in result:
    11.         text = line[1]  # 提取文字内容
    12.         # 筛选只包含数字和字母的文本
    13.         if text.isalnum():
    14.             print(text)
    15. else:
    16.     print("未识别到文字")
    复制代码
    注意事项

    • 图片路径:确保 img_path 指向的图片包含数字或字母。
    • 语言设置:默认情况下,RapidOCR 支持中英文混合识别。如果需要识别其他语言,可以参考文档进行配置。
    • 环境要求:确保 Python 版本为 3.6 或更高。
    3、EasyOCR
    特点:易于使用,支持多种语言(包括中文、英文等),基于深度学习技术,适合初学者和快速集成。
    安装方法:
    1. pip install easyocr
    复制代码
    使用示例:
    1. import easyocr

    2. reader = easyocr.Reader(['en', 'ch_sim'])  # 支持多语言
    3. img_path = 'example.jpg'
    4. result = reader.readtext(img_path)
    5. for line in result:
    6.     print(line[1])  # 打印识别结果
    复制代码
    4、Pytesseract
    特点:Tesseract 的 Python 封装,支持多种语言,使用简单,适合传统 OCR 任务。
    安装方法:
    1. pip install pytesseract
    复制代码
    需要先安装 Tesseract OCR,可以从 Tesseract 官网 下载。
    使用示例:
    1. from PIL import Image
    2. import pytesseract

    3. img_path = 'example.jpg'
    4. text = pytesseract.image_to_string(Image.open(img_path), lang='eng')
    5. print(text)  # 打印识别结果
    复制代码
    5、DocTR
    特点:专注于文档分析和表格识别,能够提取文档中的结构化信息,适合处理复杂布局的文档。
    安装方法:
    1. pip install python-doctr
    复制代码
    使用示例:
    1. from doctr.models import ocr_predictor
    2. from doctr.io import DocumentFile

    3. img_path = 'example.jpg'
    4. doc = DocumentFile.from_images(img_path)
    5. model = ocr_predictor(pretrained=True)
    6. result = model(doc)
    7. for block in result.pages[0].blocks:
    8.     for line in block.lines:
    9.         for word in line.words:
    10.             print(word.value)  # 打印识别结果
    复制代码
    6、PyOCR
    特点:封装了多个 OCR 引擎(如 Tesseract、Cuneiform 等),提供了统一的接口。
    安装方法:
    1. pip install pyocr
    复制代码
    使用示例:
    1. import pyocr
    2. from PIL import Image

    3. tools = pyocr.get_available_tools()
    4. ocr_tool = tools[0]
    5. img_path = 'example.jpg'
    6. text = ocr_tool.image_to_string(Image.open(img_path), lang='eng')
    7. print(text)  # 打印识别结果
    复制代码
    选择建议:
    速度优先:推荐使用 RapidOCR 或 EasyOCR。
    准确性优先:推荐使用 PaddleOCR。
    易用性优先:推荐使用 EasyOCR。
    文档分析优先:推荐使用 docTR。
    注意:根据你的具体需求(如语言支持、应用场景、性能要求等),可以选择最适合的 OCR 库。
    到此这篇关于使用Python实现pdf转图片再进行OCR识别的文章就介绍到这了,更多相关Python pdf转图片内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/python/340025358.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表