Python 实现网页端文档 OCR 识别系统 | 支持发票 / 合同自动分类、数据库存储、一键导出 Excel#Python #OCR 文字识别 #EasyOCR #ipywidgets #SQLite #图像处理 #毕业设计一、前言项目背景日常学习工作中经常需要提取发票、导诊单、助学贷款合同、纸质购销合同内文字手动录入效率极低。 基于 Kaggle Notebook ipywidgets 网页前端 EasyOCR 轻量文字识别搭建一套无本地部署、浏览器直接使用的图文识别工具具备以下核心能力可视化网页上传图片兼容 jpg/png/jpeg通用中文 OCR 识别提取单据、合同全部文字SQLite 本地数据库持久存储每一张图片的完整识别文本一键导出 Excel 表格自动对文本板块分类分格票据基础信息 / 收费明细 / 金额汇总 / 其他支持查询全部历史上传文档导出历史汇总表。技术栈识别核心EasyOCR轻量、开箱即用中文识别无复杂 CUDA 环境依赖前端界面ipywidgets 交互式网页组件无需 Flask/Django数据库SQLite3 本地文件数据库无需安装数据库服务数据处理Pandas、Openpyxl 生成 Excel运行环境Kaggle Notebook / Jupyter Lab二、完整项目代码# 安装轻量稳定依赖 !pip install easyocr openpyxl ipywidgets import os import sqlite3 import time import numpy as np import pandas as pd from PIL import Image import ipywidgets as widgets from IPython.display import display, clear_output from io import BytesIO import warnings warnings.filterwarnings(ignore) import easyocr from openpyxl import Workbook # 初始化EasyOCR中文识别器自动适配GPU/CPU reader easyocr.Reader([ch_sim]) # SQLite数据库初始化 db_path /kaggle/working/doc_table_db.sqlite conn sqlite3.connect(db_path, check_same_threadFalse) cur conn.cursor() cur.execute( CREATE TABLE IF NOT EXISTS bill_data ( id INTEGER PRIMARY KEY AUTOINCREMENT, file_name TEXT, full_text TEXT, table_json TEXT, upload_time TEXT ) ) conn.commit() # OCR识别核心函数全容错 def parse_bill_image(pil_image): # 统一转为RGB三通道兼容所有图片格式 pil_image pil_image.convert(RGB) img_np np.array(pil_image) # 执行文字识别 ocr_result reader.readtext(img_np, detail0) full_text \n.join(ocr_result) table_rows [[text] for text in ocr_result] df pd.DataFrame(table_rows, columns[单据识别内容]) return full_text, df # 前端交互控件 upload widgets.FileUpload(accept.jpg,.png,.jpeg, multipleFalse, description上传发票/报销单/合同图片) btn_rec widgets.Button(description1.执行OCR表格识别, button_stylesuccess) btn_excel widgets.Button(description2.一键导出分格Excel, button_styleprimary) btn_history widgets.Button(description3.查看全部单据记录, button_styleinfo) out widgets.Output() # 全局缓存 cache_df None cache_text cache_filename # 识别按钮逻辑兼容所有FileUpload键名 def run_recognize(event): global cache_df, cache_text, cache_filename out.clear_output() with out: if not upload.value: print(❌ 请先上传单据图片) return uploaded_file upload.value[0] # 兼容二进制读取键 if content in uploaded_file: bin_data uploaded_file[content] elif data in uploaded_file: bin_data uploaded_file[data] else: bin_data uploaded_file[next(iter(uploaded_file.keys()))] # 兼容文件名读取 if name in uploaded_file: cache_filename uploaded_file[name] elif metadata in uploaded_file: cache_filename uploaded_file[metadata][name] else: cache_filename unknown_bill.jpg # 打开并预览图片 img Image.open(BytesIO(bin_data)) print( 单据原图预览 ) display(img.resize((450, 320))) # 识别 cache_text, cache_df parse_bill_image(img) print(\n 全文识别内容 ) print(cache_text if cache_text else 未识别到任何文字) print(\n 前端电子表格 ) display(cache_df) # 写入数据库 now time.strftime(%Y-%m-%d %H:%M:%S) cur.execute(INSERT INTO bill_data (file_name, full_text, table_json, upload_time) VALUES (?,?,?,?), (cache_filename, cache_text, cache_df.to_json(), now)) conn.commit() print(f\n✅ 单据 {cache_filename} 数据已存入数据库) # 导出函数新建空白表格两列独立分格只输出单个Excel def export_xlsx(event): global cache_df, cache_text out.clear_output() with out: if cache_df is None or len(cache_df) 0: print(❌ 暂无识别表格请先执行OCR识别) return save_path /kaggle/working/单据分格明细表.xlsx # 新建空白工作簿精准分列写入不会挤在一列 wb Workbook() ws wb.active ws.title 识别分格表格 # 表头两列 ws.cell(row1, column1, value文本分类板块) ws.cell(row1, column2, value识别文本内容) row_idx 2 text_lines cache_text.split(\n) # 全类型关键词库适配票据、导诊单、助学贷款、合同 base_key [票据代码,票据号码,交款人,校验码,开票日期,医疗机构,登记号,姓名,合计金额,学生姓名,身份证号,院校名称,受理证明,联系电话] item_key [诊察费,西药费,治疗费,项目名称,数量,金额,X,专业名称,贷款金额] pay_key [金额合计,医保,个人账户,个人现金支付,个人自付] other_key [流水号,门诊号,复核人,收款人,【药品】,【其他】,国家开发银行,助学贷款] for line in text_lines: line line.strip() if len(line) 0: continue tag 其他说明文本 if any(k in line for k in base_key): tag 票据基础信息 elif any(k in line for k in item_key): tag 收费明细表格 elif any(k in line for k in pay_key): tag 金额支付汇总 elif any(k in line for k in other_key): tag 单据辅助板块 # A列分类B列原文完全分开两列 ws.cell(rowrow_idx, column1, valuetag) ws.cell(rowrow_idx, column2, valueline) row_idx 1 wb.save(save_path) print(f✅ 分格Excel导出完成仅单个文件{save_path}) print(Excel两列独立A列分类板块B列识别文字无挤压重叠) # 查看全部历史单据 def show_all_history(event): out.clear_output() with out: all_data pd.read_sql(SELECT * FROM bill_data, conn) print( 数据库全部单据历史记录 ) display(all_data) all_data.to_excel(/kaggle/working/全部单据历史记录.xlsx, sheet_name单据记录, indexFalse) print(\n完整历史数据已导出Excel) # 绑定按钮事件 btn_rec.on_click(run_recognize) btn_excel.on_click(export_xlsx) btn_history.on_click(show_all_history) # 渲染前端页面 print( 7号作业智能文档提取器分格两列Excel版 ) print(功能发票/报销单/合同图文OCR识别 | 数据库持久存储 | 一键导出单文件两列分格Excel) display(widgets.HBox([upload])) display(widgets.HBox([btn_rec, btn_excel, btn_history])) display(out)三、模块分步解析3.1 依赖安装与 OCR 初始化!pip install easyocr openpyxl ipywidgets import easyocr reader easyocr.Reader([ch_sim])EasyOCR 内置简体中文模型自动检测 GPU 加速无 GPU 自动切换 CPU无需配置 Paddle、Tesseract 复杂环境一行依赖即可运行。3.2 SQLite 数据库模块CREATE TABLE IF NOT EXISTS bill_data ( id INTEGER PRIMARY KEY AUTOINCREMENT, file_name TEXT, full_text TEXT, table_json TEXT, upload_time TEXT )存储每张图片文件名、完整识别文本、DataFrame 序列化文本、上传时间永久保存识别记录。3.3 OCR 识别核心函数parse_bill_image()统一图片 RGB 格式调用readtext提取全部单行文字返回完整字符串 DataFrame供前端展示、入库、导出使用。3.4 ipywidgets 交互式前端FileUpload图片上传组件支持本地拖拽上传Button三个功能按钮执行识别、导出分格 Excel、查询历史Output控制台输出预览图、识别文字、运行日志。3.5 识别逻辑事件点击识别按钮读取上传图片二进制流PIL 打开预览调用 OCR 识别控制台打印原图、全部识别文字、前端表格自动插入 SQLite 数据库持久保存。3.6 自动分格 Excel 导出核心亮点不覆盖原始数据新建空白 Excel 工作表固定两列结构文本分类板块、识别文本内容内置关键词规则库自动区分四类文本票据基础信息姓名、登记号、开票日期、身份证收费明细表格药品、诊疗项目、规格、金额金额支付汇总合计、医保、自付金额单据辅助板块合同标题、机构名称、备注仅输出单个 Excel 文件无多余副表。3.7 历史记录查询读取数据库全表数据前端展示并导出历史汇总 Excel可回溯所有上传单据识别内容。四、运行使用流程复制全部代码粘贴到 Jupyter / Kaggle Notebook 单元格执行页面出现上传框上传发票、导诊单、助学贷款、合同图片点击【1. 执行 OCR 表格识别】控制台预览图片并输出全部识别文字点击【2. 一键导出分格 Excel】右侧 Output 文件夹下载两列分类表格点击【3. 查看全部单据记录】查看所有历史识别文档。五、效果展示前端页面可视化上传框 三个功能按钮浏览器直接操作无窗口程序识别输出控制台打印图片 完整纯文本网页内置表格实时预览Excel 文件两列标准分格自动归类文字无需人工手动分列数据库本地 sqlite 文件永久存储重启环境记录不丢失。六、项目局限与优化方案现有局限纯文本关键词分类无图像边框检测无框长合同仅能完整提取文字无法自动拆分复杂表格单元格拍摄严重倾斜、大面积红色公章遮挡文字会出现少量错字、文字丢失仅支持本地导出 Excel无网页在线下载弹窗Kaggle 需右侧 Output 获取文件。拓展优化方向增加 OpenCV 图像矫正、色彩降噪降低公章、反光导致的识别错误引入 TableTransformer 深度学习表格检测自动识别无框合同行列后端改用 FlaskGradio搭建独立网页服务支持在线预览下载接入阿里云 / 百度商业 OCR 接口大幅提升印刷票据、手写文字识别精度。七、适用场景大学 Python 课程大作业、毕设简易图文识别系统个人办公医疗导诊单、报销发票、纸质合同文字批量提取轻量离线文字提取工具无需安装客户端软件。八、总结本项目基于轻量 EasyOCR 实现了开箱即用的网页端文档识别系统依托 ipywidgets 快速搭建交互式前端搭配 SQLite 实现数据持久化自动分类导出结构化 Excel代码简洁、依赖少、部署门槛极低适合入门学习 OCR 图文处理、交互式 Web 组件开发。