PaddleOCR-MarkItDown 最小集成设计
结论
本轮建议的高质量 PDF 转 Markdown 最小方案是:
PaddleOCR负责扫描件 / 模糊件 / 拍照件 / 重布局理解MarkItDown负责文本型 PDF、Office、HTML、URL 与 fallback- 在两者之上增加一个 repo-managed
router,统一做输入判断、命令编排和输出契约
本轮不建议把两者串成“所有文件都先 OCR 再 Markdown”的重链路,也不建议把
MarkItDown 当作 PaddleOCR 输出 Markdown 的二次转换器。
为什么主方案先选 PaddleOCR + MarkItDown
1. 许可证更稳
PaddleOCR官方仓库是Apache-2.0MarkItDown官方仓库是MIT- 相比之下,
MinerU当前使用的是自定义MinerU Open Source License
因此在长期整合、二次分发、公司内落地、后续开源边界审查上,PaddleOCR + MarkItDown
的风险更低。
2. 中文与脏扫描场景证据更直接
PaddleOCR 官方 README 当前直接强调:
- 处理中英日拼音等多语言混排
- 面向
Warping / Scanning / Screen Photography / Illumination / Skewed真实脏输入 - 输出
Markdown / JSON
对“比较模糊的 PDF”这个目标,证据链比只强调通用 OCR 更对题。
3. 与仓内现有能力更互补
仓内当前已经有:
codex/mcps/integrations/documents/markitdowncodex/mcps/markitdown-mcpcodex/skills/markitdown
因此本轮真正缺的不是另一个 Markdown 转换器,而是一个:
- 决定何时走
MarkItDown - 决定何时走
PaddleOCR - 统一输出与 fallback
的决策层。
最小架构
输入层
- 输入文件路径
- 输出 Markdown 路径
- 可选 engine 偏好
- 可选运行配置
路由层
当前阶段已经加入轻量 probe + 规则:
- 图片输入:优先
PaddleOCR doc/docx/ppt/pptx/xls/xlsx/html/htm/csv/xml/json/txt/md/epub:走MarkItDownpdf:- 先跑
PDF text-layer probe - 判定
text时走MarkItDown - 判定
scan时走PaddleOCR - 判定
unknown时回退到默认引擎 - 用户显式
prefer-ocr时走PaddleOCR
- 先跑
下一阶段再补:
- 页数 / 图片占比 / 可复制文本量探测
- 失败后自动 fallback
PDF text-layer probe
当前 router 已实现一个轻量启发式 probe:
- 读取 PDF 原始 bytes
- 尝试解压
FlateDecodestreams - 统计
BT / Tf / Tj / TJ等文本操作符 - 统计图片标记
- 抽取 literal text 片段
probe 只输出三类:
textscanunknown
这不是严格 PDF 解析器,但已经足以承担当前“自动区分文本 PDF 与扫描 PDF”的最小决策层角色。
adapter 层
MarkItDown adapter
负责:
- 文本型 PDF
- Office / HTML / 文本类输入
- fallback
当前默认使用官方 CLI 模板:
uvx --from git+https://github.com/microsoft/markitdown.git@604bba13da2f43b756b49122cb65bdedb85b1dff#subdirectory=packages/markitdown markitdown {input} -o {output}PaddleOCR adapter
负责:
- 扫描 PDF
- 模糊 PDF
- 拍照件
- 图片输入
本轮只固定 adapter 接口,不在仓内写死运行命令。原因是 PaddleOCR 当前有多种落地形态:
- pipeline
- VLM
- CPU / GPU / NPU
- 本地 Python 环境
- 独立服务
如果在没有现场验证的情况下把某条命令写死进仓,会把 router 变成脆弱的 host-bound 脚本。
输出层
统一输出:
Markdown- 可选
JSON决策结果
当前最小 evidence 包括:
- selected engine
- fallback engine
- planned command
- route reasons
Canonical 落点
设计文档
E:\My Project\Atramenti-Console\codex\plugins\obsidian\data\docs\agent\PaddleOCR-MarkItDown 最小集成设计.md
capability 原型
E:\My Project\Atramenti-Console\codex\mcps\integrations\documents\pdf-markdown-router
现有依赖能力
E:\My Project\Atramenti-Console\codex\mcps\integrations\documents\markitdownE:\My Project\Atramenti-Console\codex\mcps\markitdown-mcp
当前 router 原型包含什么
tools/router.mjs
支持:
--input--output--engine auto|markitdown|paddleocr--config--prefer-ocr--probe-only--json--execute
默认推荐使用:
- 先
plan - 再在配置补齐后
execute
tools/router.config.example.json
作用:
- 固定 MarkItDown 的命令模板
- 给 PaddleOCR 预留本机绑定位
- 不把未经验证的 Paddle 命令写死进仓
本轮边界
本轮明确不做:
- 真正把 router 注册成新的全局 MCP
- 安装 / 绑定 PaddleOCR 的完整本机运行时
- 做 PDF 内容级 text-layer 探测
- 做跨页表格质量对比基准
下一阶段建议
阶段 1:把 Paddle 本机命令绑定跑通
目标:
- 选定你机器上的 Paddle backend
- 用你自己的 3 到 5 份样本跑通
- 把经过验证的命令写入非示例配置
阶段 2:补更强自动探测与 fallback
补:
- 更强的 PDF text-layer / image density / page probe
- 简单扫描件判定
- execute 失败后的 fallback
阶段 3:再决定是否 MCP 化
当前判断:先不要升级成真正 MCP。
理由:
PaddleOCR的本机执行命令还没有完成现场绑定- 当前 capability 的稳定部分是“路由与决策”,不是“完整执行链”
- 如果现在就 MCP 化,会把一个尚未固定 backend 的原型接口过早承诺成稳定外部能力
只有当下面三件事都稳定后,再把它升级成真正的 MCP:
- route rule 稳定
- PDF probe 稳定
- Paddle command 稳定
- 输出契约稳定
否则先把它留在 repo-managed local router 层,成本更低,也更容易迭代。