批量识别图片中的表格,借助 OpenAI 兼容的视觉模型,将表格内容提取为 Markdown,并支持导出为 Excel。
提示词针对高考录取数据表格优化(院校代号、年份、计划数、分数等),其他类型表格也能识别。
需要 Python >= 3.11,使用 uv 管理依赖:
# 安装 uv(如已安装可跳过)
curl -LsSf https://astral.sh/uv/install.sh | sh
# 克隆项目
git clone https://github.com/TNXGLab/toudang.git
cd toudang
# 安装依赖
uv sync把要识别的表格截图或照片放到 img/ 目录下,支持 jpg、png、webp、bmp、tiff 格式。
img/
├── 1.jpg
├── 2.jpg
└── 3.png
推荐用环境变量,省得每次输入:
export OPENAI_API_KEY="sk-your-api-key"
export OPENAI_BASE_URL="https://your-api-endpoint/v1" # 可选,默认用 OpenAI 官方
export OPENAI_MODEL="gpt-4o-mini" # 可选,默认 gemini-3.1-flash-lite-previewuv run python main.py程序会逐个(或并发)识别 img/ 下的图片,进度条会实时显示当前状态。
识别完成后,一键合并所有 Markdown 表格为 Excel:
uv run python main.py excel| 参数 | 说明 | 默认值 |
|---|---|---|
-i, --input |
图片目录或单张图片路径 | img/ |
-o, --output |
输出根目录 | output/ |
--api-key |
OpenAI 兼容 API Key | 环境变量 OPENAI_API_KEY |
--base-url |
API 端点地址 | 环境变量 OPENAI_BASE_URL |
--model |
视觉模型名称 | 环境变量 OPENAI_MODEL |
--concurrency |
同时处理的图片数 | 3 |
--force |
忽略状态文件,强制重新识别所有图片 | 关闭 |
--skip-failed |
跳过上次失败的图片(文件未变化时) | 关闭 |
# 指定图片目录和输出目录
uv run python main.py -i ~/screenshots -o ~/results
# 5 张图并发,加速处理
uv run python main.py --concurrency 5
# 上次有失败的图,但图片没变,直接跳过它们
uv run python main.py --skip-failed
# 图片更新了,全部重新识别
uv run python main.py --force
# 导出 Excel,指定输入输出路径
uv run python main.py excel -i output/markdown -o result.xlsxoutput/
├── markdown/ # 每张图片识别出的 Markdown 表格
│ ├── 1.abc12345.tables.md
│ └── 2.def67890.tables.md
├── raw/ # 模型原始返回文本(调试用)
│ ├── 1.abc12345.raw.md
│ └── 2.def67890.raw.md
├── logs/ # 每次运行的 JSONL 日志
│ └── run_20260629_143052.jsonl
├── state.json # 任务状态文件(支持断点续传)
└── tables.xlsx # Excel 导出结果
程序会记录每张图片的处理状态到 output/state.json。如果中途中断(Ctrl+C),下次运行会自动跳过已经成功识别的图片,只处理剩余的。
用 --force 可以强制全部重新识别。
识别输出严格遵循 Markdown 表格格式:
- 院校信息行:院校名称和代号放在第一列,其余列为空,方便导出后在 Excel 中合并单元格区分
- 年份数据行:以年份开头,数据按列对齐
- 支持单张图片包含多个院校、多个表格
导出的 Excel 中,院校行会横向合并为一个单元格并高亮显示,与数据行区分。