ocr-auto-entry / app.py
xixiyyds
Fix syntax error with multiline string escape using chr(10)
aed44c5
Raw
History Blame Contribute Delete
4.73 kB
"""
Gradio 网页版界面
提供浏览器端可视化的 OCR 自动录单演示
"""
import gradio as gr
import os
from ocr_engine import OCREngine
from data_extractor import DataExtractor
from excel_writer import ExcelWriter
# 初始化核心引擎
ocr_engine = OCREngine(lang='ch')
data_extractor = DataExtractor()
excel_writer = ExcelWriter(output_dir='output')
def process_single_image(image_path):
"""处理单张图片并返回提取结果"""
if not image_path:
return "请先上传一张图片", None
try:
# 1. OCR 识别
ocr_result = ocr_engine.recognize(image_path)
# 2. 提取数据
data = data_extractor.extract(ocr_result)
# 3. 写入单条 Excel
data['image_path'] = os.path.basename(image_path)
data['status'] = '成功'
excel_path = excel_writer.create_report([data], filename="temp_single_result.xlsx")
# 格式化展示文本
result_text = "### 📥 提取结果:" + chr(10) + \
f"- **订单编号**: {data.get('order_no', '未提取到')}" + chr(10) + \
f"- **客户名称**: {data.get('customer', '未提取到')}" + chr(10) + \
f"- **产品名称**: {data.get('product', '未提取到')}" + chr(10) + \
f"- **数量**: {data.get('quantity', '未提取到')}" + chr(10) + \
f"- **金额**: {data.get('amount', '未提取到')}" + chr(10) + \
f"- **提取时间**: {data.get('extract_time', '')}"
return result_text, excel_path
except Exception as e:
return f"❌ 处理失败: {str(e)}", None
def process_batch_images(image_files):
"""批量处理多张图片并生成汇总 Excel"""
if not image_files:
return "请先上传图片文件", None
results = []
summary_text = "### 📊 批量处理进度:" + chr(10)
for i, file_obj in enumerate(image_files):
# Gradio 批量上传的文件可能是 File 对象,通过 .name 获取路径
path = file_obj.name if hasattr(file_obj, 'name') else file_obj
filename = os.path.basename(path)
try:
ocr_result = ocr_engine.recognize(path)
data = data_extractor.extract(ocr_result)
data['image_path'] = filename
data['status'] = '成功'
results.append(data)
summary_text += f"- ✅ {filename} 提取成功" + chr(10)
except Exception as e:
results.append({
'image_path': filename,
'status': f'失败: {str(e)}'
})
summary_text += f"- ❌ {filename} 处理失败: {str(e)}" + chr(10)
# 生成 Excel 汇总报告
output_path = excel_writer.create_report(results)
summary_text += chr(10) + "**🎉 批量处理完成!已生成汇总 Excel 报告。**"
return summary_text, output_path
# 构建 Gradio 界面
with gr.Blocks(title="OCR 自动录单系统") as demo:
gr.Markdown("""
# 📄 OCR 自动录单系统 (网页版)
这是一个基于 **PaddleOCR** + **Python** 的轻量级高效率自动录单工具。适合制造业、电气、设备厂等办公室自动录入采购单、送货单和发票。
""")
with gr.Tab("单张图片调试"):
with gr.Row():
with gr.Column():
input_img = gr.Image(type="filepath", label="上传订单/采购单图片")
btn_run = gr.Button("🚀 开始智能提取", variant="primary")
with gr.Column():
out_text = gr.Markdown("提取结果会显示在这里...")
out_file = gr.File(label="下载当前生成的 Excel 录单")
btn_run.click(
fn=process_single_image,
inputs=input_img,
outputs=[out_text, out_file]
)
with gr.Tab("批量录单模式"):
with gr.Row():
with gr.Column():
input_files = gr.File(file_count="multiple", label="上传多张订单图片", file_types=["image"])
btn_batch_run = gr.Button("⚡ 开始批量全自动录入", variant="primary")
with gr.Column():
out_batch_text = gr.Markdown("批量处理进度会显示在这里...")
out_batch_file = gr.File(label="下载汇总生成的 Excel 报表")
btn_batch_run.click(
fn=process_batch_images,
inputs=input_files,
outputs=[out_batch_text, out_batch_file]
)
if __name__ == "__main__":
demo.launch(server_name="0.0.0.0", server_port=7860)