当前位置: 首页 > 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')
http://www.xdnf.cn/news/43993.html

相关文章:

  • WebSocket启用备忘
  • 【C++】类和对象之日期类的实现(构造、运算符重载)
  • Deepseek输出的内容如何直接转化为word文件?
  • PFLM: Privacy-preserving federated learning with membership proof证明阅读
  • mysql中的group by用法详解
  • 大模型安全吗?数据泄露与AI伦理的黑暗面!
  • 【数据结构_12】二叉树(4)
  • redis 中的 String 数据结构
  • 【Linux系统】Linux基础指令(详解Linux命令行常用指令,每一个指令都有示例演示)
  • 【2025计算机网络-面试常问】http和https区别是什么,http的内容有哪些,https用的是对称加密还是非对称加密,流程是怎么样的
  • 【人工智能】推荐开源企业级OCR大模型InternVL3
  • 【后端开发】MyBatis
  • 树莓派系统中设置固定 IP
  • Oracle 23ai Vector Search 系列之6 向量相似性搜索(Similarity Search)
  • 力扣DAY60-61 | 热100 | 回溯:单词搜索、分割回文串
  • 17.【.NET 8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--SonarQube部署与配置
  • kotlin知识体系(六) : Flow核心概念与与操作符指南
  • opencv图像库编程
  • 软件开发过程中技术债的控制策略
  • iPhone 13P 换超容电池,一年实记的“电池循环次数-容量“柱状图
  • next.js 如何实现动态路由?
  • 【消息队列RocketMQ】一、RocketMQ入门核心概念与架构解析
  • Git拉分支技巧:从零开始创建并推送分支
  • 每天学一个 Linux 命令(28):ln
  • 产品经理学习过程
  • 深度剖析即梦 AI:开启创意无限的智能创作时代
  • springboot--web开发响应参数注解
  • Web前端:百度首页克隆 - 前端开发练习
  • 网络设备基础运维全攻略:华为/思科核心操作与巡检指南
  • 2.2 BackgroundWorker的使用介绍