当前位置: 首页 > news >正文

python pdf转图片再OCR

  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')
  1. 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 imgdef allimngs(image_path):image = Image.open(image_path)image = enhance_image(image)# 使用 pytesseract 进行 OCRtext = 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.rootfor 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 = 0n = len(text)while i < n:current_node = trie.rootmax_len = 0current_len = 0end_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 += 1if current_node.keywords:  # 当前节点是某个关键词的结尾max_len = current_lenend_pos = j + 1  # 更新结束位置为当前字符的下一个位置else:break  # 无后续匹配,退出循环if max_len > 0:# 更新所有匹配的关键词计数器for kw in current_node.keywords:counters[kw] += 1i = end_pos  # 跳跃到已匹配部分的末尾else:i += 1  # 无匹配,移动到下一个字符return countersif __name__ == "__main__":keywords = ['矮小','安于现状','暗藏','暗淡','暗黑']all_text = ''workbook = Workbook()sheet = workbook.activefor i in range(108):i = i+1image_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 = 1for k, v in result.items():sheet[f'A{num}'] = ksheet[f'B{num}'] = vprint(k, v, num)num = num + 1workbook.save(filename='2022.xlsx')

相关文章:

  • 系统架构设计师:系统架构定义与分类相关知识点、记忆要点提示、记忆卡片、练习题、答案与解析
  • B树的异常恢复
  • 深入浅出讲解UDP检验中如何计算检验和
  • paddleocr出现: [WinError 127] 找不到指定的程序解决办法
  • ZYNQ笔记(九):定时器中断
  • 简易Linux GPIO工具
  • linux多线(进)程编程——(9)信号量(二)
  • Kotlin实现Android应用保活方案
  • 【Linux】Rhcsa复习5
  • 电压、电阻、电流型输入的区别
  • npm link 使用指南
  • 《前端面试题之 Vue 篇(第三集)》
  • pivot_root:原理、用途及最简单 Demo
  • Doris + Iceberg 构建冷热分层数据湖架构:架构设计与实战指南
  • 计算机视觉cv2入门之视频处理
  • 编码器---正交编码器
  • 算法—合并排序—js(场景:大数据且需稳定性)
  • 80 7816协议与串口uart协议时序图
  • 【CPU】中断即时性
  • 自然语言处理(9)—— 共现词矩阵及Python实现
  • 第一集|《蛮好的人生》蛮好,《悬镜》挺玄
  • 消息人士称哈马斯愿与以色列达成长期停火
  • 特朗普政府将对中国建造船只加征“港口费”,外交部:损人害己
  • 潮州官方回应女婴事件:尚未发现虐待,各种原因导致营养不良
  • 陈少洋出任中国航天科工集团党组副书记、董事、总经理
  • “珍爱网门店关闭后服务被转线上”续:平台称送一个月服务,当事人坚持退款