不忙OCR
官方脚本
可调用节点
v2.7.0
离线OCR文字识别脚本 | 基于RapidOCR(PP-OCRv6)+PP-DocLayoutV3版面分析+RapidTable表格重建+PP-FormulaNet_plus-M公式识别,支持图片批量识别、标题/段落/表格/图片/公式结构还原、并行处理、检测框可视化,导出Markdown/Word/TXT/JSON/Excel,支持定时任务与节点联动,模型由不忙脚本盒子统一下载
脚本能力
直接启动支持
右键启动支持
快捷键启动不支持
超级复制启动不支持
定时任务支持
可被其他脚本调用是
依赖其他脚本否
图形化启动界面支持
基于 RapidOCR (PP-OCRv6) 文字识别 + PP-DocLayoutV3 版面分析 + RapidTable 表格重建 + PP-FormulaNet_plus-M 公式识别的离线图片文字识别工具。支持批量识别、版面结构还原(标题/正文/表格/图片/公式)、检测框可视化,一键导出 Markdown / Word / TXT / JSON / Excel。AI 模型由「不忙脚本盒子」统一下载管理,脚本本身不含模型。
核心特性
- 离线识别:RapidOCR PP-OCRv6 引擎,本地 CPU 推理,无需联网、不上传图片
- 版面分析:PP-DocLayoutV3(24 类版面元素),还原标题、正文、表格、图片、公式等结构,并据此重排阅读顺序
- 表格重建:RapidTable (SLANetPlus) 独立表格结构模型,正确还原表头、行、列与单元格;小表复用全文 OCR 提速,大表自动缩放重建保证完整;输出 Markdown / Word / Excel 表格(Excel 支持合并单元格)
- 公式识别:PP-FormulaNet_plus-M(PP-FormulaNet_plus 系列最高精度档,En-BLEU 91.45%),版面检出的公式区域识别为 LaTeX(
$$...$$),可按需开启 - 检测框可视化:自动保存带文字检测框的标注图(可开关)
- 多格式导出:Markdown / Word / TXT / JSON / Excel(每个表格一个 sheet,精确还原行列;非表格文本入「文本」sheet);Word 中的公式会转成可编辑的 Word 原生公式(OMML),不是纯文本粘贴的 LaTeX
- 批量处理:一次选中多张图片逐个识别,支持多核并行(可配并行数),结果与源图同目录输出(
原文件名_ocr后缀) - 自动预处理:可选手动或「自动」模式,低对比度/低质量图自动增强
- 定时任务:配置好图片与参数,到点自动静默识别
- 节点联动:可被其他脚本调用,返回识别文本、坐标与表格单元格结构
脚本演示

安装方法
本脚本的运行环境、依赖组件及图形化窗口均依赖"不忙脚本盒子",建议仅通过盒子安装和使用本脚本。
前置条件:安装好 不忙脚本盒子
- 打开盒子 → 脚本市场 → 搜索 「离线OCR」
- 点击「安装」——盒子会自动下载所需的 AI 模型),请保持网络畅通
使用方式
直接启动
- 在盒子里点击脚本卡片,弹出运行设置窗口
- 点击「源文件」右侧的文件选择器,选择要识别的图片(可多选)
- 按需调整参数:检测阈值、预处理、导出格式、检测框可视化
- 点击「执行」,完成后在图片所在目录查看
_ocr.md/_ocr.docx等结果文件
右键启动
- 在文件管理器中选中一张或多张图片(支持 png/jpg/jpeg/bmp/tiff/webp)
- 右键 → 选择 「离线OCR」
- 盒子弹出运行窗口并预填所选图片,调整参数后点「执行」
定时任务
- 打开盒子 → 定时任务 → 新建任务 → 选择 「离线OCR」
- 在表单中填写源文件与识别参数(阈值/预处理/导出格式),设置触发时间
- 到点自动在后台识别,结果写入图片同目录,执行记录显示成功/失败
参数说明
| 参数 | 说明 |
|---|---|
| 版面分析 | 启用 PP-DocLayoutV3 版面分析(还原标题/表格/图片/公式结构);关闭则仅纯文本排版,且不加载版面模型,速度更快 |
| 版面阈值 | 版面区域检测置信度阈值(0.1-0.9),仅版面分析开启时生效 |
| 检测阈值 | OCR 文本检测置信度阈值(0.1-0.9),越低识别越多、误检也越多 |
| 预处理 | 无 / 自动(低对比度自动增强) / 灰度化 / 二值化 / 降噪 / 增强对比度 |
| 导出格式 | Markdown / Word / TXT / JSON / Excel(表格图推荐,自动拆分为多个 sheet) |
| 检测框可视化 | 开启时额外保存带绿色文字检测框的 _ocr_boxes.png 标注图 |
| 公式识别 | 将版面检出的公式区域识别为 LaTeX(按需开启,单条约 1-2 秒) |
| 并行数 | 批量处理并行数,0=自动(不超过 4 个线程,也不超过图片数),1=串行,最大 8 |
节点脚本(开发者阅读)
本脚本声明为节点,可被其他盒子脚本通过 /api/link 调用。返回业务键:
| 业务键 | 类型 | 说明 |
|---|---|---|
results |
list | 各图片导出的结果文件路径列表 |
text |
str | 合并后的 Markdown 识别文本 |
ocr_data |
list | 逐图 OCR 结构化结果:[{image, items:[{text, score, box, points}], tables:[{bbox, cells:[{row, col, text, box}]}]}] |
联动调用示例:
import json, sys, requests
payload = json.load(open(sys.argv[1], encoding="utf-8"))
api_base = payload["environment"]["api_base"]
OCR_ID = "e8a3c1d0-6b4f-4a7e-9c2d-5f1e8b3a7d0c" # 本脚本 script_id
r = requests.post(f"{api_base}/api/link", json={
"script_id": OCR_ID,
"data": {"target_paths": ["C:/scan.png"]},
"params": {"export_format": "Markdown", "box_thresh": 0.5},
}, timeout=3600)
body = r.json()
if not body.get("success"):
raise RuntimeError(body.get("message", "联动调用失败"))
result = body["result"]
if result.get("code") != 0:
raise RuntimeError(result.get("msg"))
text = result["text"] # 识别出的 Markdown 文本
out_files = result["results"] # 导出文件路径列表
entry = result["ocr_data"][0] # 首图结构化结果
for it in entry["items"]:
print(it["text"], it["box"]) # 文本 + [x1, y1, x2, y2]
for t in entry.get("tables", []): # 表格单元格(含坐标/行列号)
for c in t["cells"]:
print(c.get("row"), c.get("col"), c.get("text"), c["box"])
💡 使用提示
- 批量识别运算量较大,建议先关闭其他大型应用
- 只需纯文本时可关闭「版面分析」,跳过版面模型加载,识别更快
- 版面结构还原不准确时,可调高「版面阈值」过滤低置信度区域
- 表格区域会自动裁剪并用 RapidTable 重建,无需额外设置
- 识别公式时:开启「公式识别」即可,Markdown 输出
$$...$$,Word 输出可编辑的 Word 原生公式,Excel/文本 sheet 以 LaTeX 行出现 - Word 公式走 LaTeX → MathML → OMML 转换(纯 Python,无需本机装 Office);若
latex2mathml/mathml2omml缺失或转换失败,会退化为插入 LaTeX 原文,公式内容不会丢 - 选择「Excel」导出时,每个检测到的表格写入独立 sheet(按行列精确放置),图内标题/说明等文本放入「文本」sheet
- 导出格式选 JSON 时,节点返回的
text为空,请直接使用results中的 JSON 文件或ocr_data - 识别效果不佳时,优先尝试「增强对比度」预处理,再调低检测阈值
- 方向校正采用整页投票。PP-OCR 的方向分类器是 0°/180° 二分类,对短文本行(三两个字)存在误判概率,而它一旦判错就会把正立的行真的旋转 180°,导致漏字甚至数字错位(实测出现过「显示器」→「器」、「备注」整格丢失、「300mg」→「30mg」)。本工具改为统计整张图被判倒转的行占比,占比过低时视为零星误判、不执行旋转 —— 既消除了误判,又保留了处理真正倒转图片的能力
- 本工具不做整页旋转。若原图整体倒置,每一行文字会被逐行转正,但行的阅读顺序仍按图像坐标排列,段落顺序和表格行序会颠倒。遇到整体倒置的图片,建议先转正再识别
- 在盒子外直接跑 CLI 时(无
BM_API_BASE),脚本拿不到盒子下发的模型路径,会自动退回各识别库自带的按需下载(模型落到用户缓存目录,不会写进脚本目录)。日常使用建议始终通过盒子运行
🖥️ 环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Windows 10+(64 位) |
| 运行环境 | Python 3.10+(由盒子自动管理) |
| 版面模型 | PP-DocLayoutV3(约 131 MB,安装脚本时由盒子自动下载) |
| 公式模型 | PP-FormulaNet_plus-M(约 594 MB,安装脚本时由盒子自动下载) |
| 表格模型 | SLANetPlus(随 Python 包自动下载,约 8 MB) |
| 公式转 Word | latex2mathml + mathml2omml(由盒子自动安装,纯 Python,不需要 Office) |
| Excel 支持 | openpyxl(由盒子自动安装) |
本脚本已声明为节点,可被其他脚本通过「不忙脚本盒子」机制调用。完整配置见下方 TOML,其他脚本若需调用请严格按此配置构造请求。
bm-scripts-box-rc.toml
[bmscriptsbox]
[bmscriptsbox.info]
id = "e8a3c1d0-6b4f-4a7e-9c2d-5f1e8b3a7d0c"
name = "不忙OCR"
desc = "离线OCR文字识别脚本 | 基于RapidOCR(PP-OCRv6)+PP-DocLayoutV3版面分析+RapidTable表格重建+PP-FormulaNet_plus-M公式识别,支持图片批量识别、标题/段落/表格/图片/公式结构还原、并行处理、检测框可视化,导出Markdown/Word/TXT/JSON/Excel,支持定时任务与节点联动,模型由不忙脚本盒子统一下载"
version = "2.7.0"
icon = "./imgs/ocr.png"
[bmscriptsbox.runtime]
language = "python"
language_version = ">=3.10"
entry = "main.py"
terminal = "always"
[bmscriptsbox.triggers.context_menu]
enabled = true
targets = ["files"]
filters = [".png", ".jpg", ".jpeg", ".bmp", ".tiff", ".webp"]
[[bmscriptsbox.inputs]]
name = "target_paths"
label = "源文件"
type = "list"
pick = "files"
exts = [".png", ".jpg", ".jpeg", ".bmp", ".tiff", ".webp"]
description = "要识别的图片文件"
[[bmscriptsbox.params]]
name = "layout_analysis"
label = "版面分析"
type = "bool"
default = true
description = "启用 RapidLayout 版面分析(还原标题/表格/图片结构);关闭则仅纯文本排版,不加载模型"
[[bmscriptsbox.params]]
name = "layout_conf_thresh"
label = "版面阈值"
type = "float"
default = 0.3
when = { field = "layout_analysis", eq = true }
description = "版面区域检测置信度阈值 (0.1-0.9)"
[[bmscriptsbox.params]]
name = "box_thresh"
label = "检测阈值"
type = "float"
default = 0.5
description = "OCR 文本检测置信度阈值 (0.1-0.9)"
[[bmscriptsbox.params]]
name = "preprocess_mode"
label = "预处理"
type = "str"
default = "无"
choices = ["无", "自动", "灰度化", "二值化", "降噪", "增强对比度"]
description = "OCR 前对图片的预处理方式;自动=按对比度自适应增强"
[[bmscriptsbox.params]]
name = "export_format"
label = "导出格式"
type = "str"
default = "Markdown"
choices = ["Markdown", "Word", "TXT", "JSON", "Excel"]
description = "识别结果的导出格式(Word 中的公式为可编辑的 Word 原生公式)"
[[bmscriptsbox.params]]
name = "show_boxes"
label = "检测框可视化"
type = "bool"
default = true
description = "是否保存带文字检测框的标注图"
[[bmscriptsbox.params]]
name = "formula_ocr"
label = "公式识别"
type = "bool"
default = false
description = "将版面检出的公式区域识别为 LaTeX(按需开启,单条约 1-2 秒)"
# ====== AI 模型(盒子安装时统一下载,脚本通过 /api/model/path 取路径) ======
[[bmscriptsbox.models]]
source = "modelscope"
repo_id = "RapidAI/RapidLayout"
files = ["onnx/pp_doc_layout/pp_doc_layoutv3.onnx"]
[[bmscriptsbox.models]]
source = "modelscope"
repo_id = "RapidAI/RapidDoc"
files = ["formula/PP-FormulaNet_plus-M/pp_formulanet_plus_m.onnx"]
[bmscriptsbox.params_form]
enabled = true
[bmscriptsbox.schedule]
enabled = true
[bmscriptsbox.node]
enabled = true
[[bmscriptsbox.outputs]]
name = "results"
type = "list"
description = "各图片导出的结果文件路径列表"
[[bmscriptsbox.outputs]]
name = "text"
type = "str"
description = "合并后的 Markdown 识别文本"
[[bmscriptsbox.outputs]]
name = "ocr_data"
type = "list"
description = "逐图 OCR 结构化结果: [{image, items:[{text, score, box, points}], tables:[{bbox, cells}]}]"
评论