orc-order-v2/backup/v1_backup_20250502190248/run_ocr.py
2025-05-02 19:05:42 +08:00

235 lines
8.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
OCR流程运行脚本
-------------
整合百度OCR和Excel处理功能的便捷脚本
"""
import os
import sys
import argparse
import logging
import configparser
from pathlib import Path
from datetime import datetime
# 确保logs目录存在
log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logs')
os.makedirs(log_dir, exist_ok=True)
# 设置日志文件路径
log_file = os.path.join(log_dir, 'ocr_processor.log')
# 配置日志
logger = logging.getLogger('ocr_processor')
if not logger.handlers:
# 创建文件处理器
file_handler = logging.FileHandler(log_file, encoding='utf-8')
file_handler.setLevel(logging.INFO)
# 创建控制台处理器
console_handler = logging.StreamHandler(sys.stdout)
console_handler.setLevel(logging.INFO)
# 设置格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)
# 添加处理器到日志器
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 设置日志级别
logger.setLevel(logging.INFO)
logger.info("OCR处理器初始化")
# 标记该日志文件为活跃,避免被清理工具删除
try:
# 创建一个标记文件,表示该日志文件正在使用中
active_marker = os.path.join(log_dir, 'ocr_processor.active')
with open(active_marker, 'w') as f:
f.write(f"Active since: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
except Exception as e:
logger.warning(f"无法创建日志活跃标记: {e}")
def parse_args():
"""解析命令行参数"""
parser = argparse.ArgumentParser(description='OCR流程运行脚本')
parser.add_argument('--step', type=int, default=0, help='运行步骤: 1-OCR识别, 2-Excel处理, 0-全部运行 (默认)')
parser.add_argument('--config', type=str, default='config.ini', help='配置文件路径')
parser.add_argument('--force', action='store_true', help='强制处理所有文件,包括已处理的文件')
parser.add_argument('--input', type=str, help='指定输入文件(仅用于单文件处理)')
parser.add_argument('--output', type=str, help='指定输出文件(仅用于单文件处理)')
return parser.parse_args()
def check_env():
"""检查配置是否有效"""
try:
# 尝试读取配置文件
config = configparser.ConfigParser()
if not config.read('config.ini', encoding='utf-8'):
logger.warning("未找到配置文件config.ini或文件为空")
return
# 检查API密钥是否已配置
if not config.has_section('API'):
logger.warning("配置文件中缺少[API]部分")
return
api_key = config.get('API', 'api_key', fallback='')
secret_key = config.get('API', 'secret_key', fallback='')
if not api_key or not secret_key:
logger.warning("API密钥未设置或为空请在config.ini中配置API密钥")
except Exception as e:
logger.error(f"检查配置时出错: {e}")
def run_ocr(args):
"""运行OCR识别过程"""
logger.info("开始OCR识别过程...")
# 导入模块
try:
from baidu_table_ocr import OCRProcessor, ConfigManager
# 创建配置管理器
config_manager = ConfigManager(args.config)
# 创建处理器
processor = OCRProcessor(config_manager)
# 检查输入目录中是否有图片
input_files = processor.get_unprocessed_images()
if not input_files and not args.input:
logger.warning(f"{processor.input_folder}目录中没有找到未处理的图片文件")
return False
# 单文件处理或批量处理
if args.input:
if not os.path.exists(args.input):
logger.error(f"输入文件不存在: {args.input}")
return False
logger.info(f"处理单个文件: {args.input}")
output_file = processor.process_image(args.input)
if output_file:
logger.info(f"OCR识别成功输出文件: {output_file}")
return True
else:
logger.error("OCR识别失败")
return False
else:
# 批量处理
batch_size = processor.batch_size
max_workers = processor.max_workers
# 如果需要强制处理先设置skip_existing为False
if args.force:
processor.skip_existing = False
logger.info(f"批量处理文件,批量大小: {batch_size}, 最大线程数: {max_workers}")
total, success = processor.process_images_batch(
batch_size=batch_size,
max_workers=max_workers
)
logger.info(f"OCR识别完成总计处理: {total},成功: {success}")
return success > 0
except ImportError as e:
logger.error(f"导入OCR模块失败: {e}")
return False
except Exception as e:
logger.error(f"OCR识别过程出错: {e}")
return False
def run_excel_processing(args):
"""运行Excel处理过程"""
logger.info("开始Excel处理过程...")
# 导入模块
try:
from excel_processor_step2 import ExcelProcessorStep2
# 创建处理器
processor = ExcelProcessorStep2()
# 单文件处理或批量处理
if args.input:
if not os.path.exists(args.input):
logger.error(f"输入文件不存在: {args.input}")
return False
logger.info(f"处理单个Excel文件: {args.input}")
result = processor.process_specific_file(args.input)
if result:
logger.info(f"Excel处理成功")
return True
else:
logger.error("Excel处理失败请查看日志了解详细信息")
return False
else:
# 检查output目录中最新的Excel文件
latest_file = processor.get_latest_excel()
if not latest_file:
logger.error("未找到可处理的Excel文件无法进行处理")
return False
# 处理最新的Excel文件
logger.info(f"处理最新的Excel文件: {latest_file}")
result = processor.process_latest_file()
if result:
logger.info("Excel处理成功")
return True
else:
logger.error("Excel处理失败请查看日志了解详细信息")
return False
except ImportError as e:
logger.error(f"导入Excel处理模块失败: {e}")
return False
except Exception as e:
logger.error(f"Excel处理过程出错: {e}")
return False
def main():
"""主函数"""
# 解析命令行参数
args = parse_args()
# 检查环境变量
check_env()
# 根据步骤运行相应的处理
ocr_success = False
if args.step == 0 or args.step == 1:
ocr_success = run_ocr(args)
if not ocr_success:
if args.step == 1:
logger.error("OCR识别失败请检查input目录是否有图片或检查API配置")
sys.exit(1)
else:
logger.warning("OCR识别未处理任何文件跳过Excel处理步骤")
return
else:
# 如果只运行第二步假设OCR已成功完成
ocr_success = True
# 只有当OCR成功或只运行第二步时才执行Excel处理
if ocr_success and (args.step == 0 or args.step == 2):
excel_result = run_excel_processing(args)
if not excel_result and args.step == 2:
logger.error("Excel处理失败")
sys.exit(1)
logger.info("处理完成")
if __name__ == "__main__":
main()