> 分级导航:L1=摘要(本段)→ L2=红线+流程+命令速查(§⛔/§1-§3)→ L3=完整运维细节(REFERENCE.md)
-o 输出文件已存在时必须暂停确认,禁止静默覆写。
File is encrypted)立即终止,提示用户解密后重试。
.doc/.ppt 且 COM 和 LibreOffice 均不可用时,暂停告知用户安装 Office 或 LibreOffice,禁止静默跳过。
scripts/convert.py 统一入口。禁止裸调 markitdown / uvx markitdown / 原生库。
E:\Marvis_Data)路径优先用 python_executor,脚本内部 pathlib.Path 自动适配平台。
rm -rf / diskpart clean / DROP TABLE / git reset --hard 等破坏性命令不得自动执行,必须输出完整预览并等待用户确认。
post_clean.py↔convert.py 循环清洗。
> 完整禁令细则及 HARB 黑名单详见 REFERENCE.md §4。
核心入口:scripts/convert.py。零人工干预:依赖检测 → uv 安装 extras → 转换 → 降级兜底 → 后置清洗 → 输出。
🟢 最小可用示例:python scripts/convert.py input.docx。版本自查:python scripts/convert.py --version。
只需调用一次 scripts/convert.py,脚本内部自动完成:
(.doc/.ppt?)→预处理为 .docx/.pptx → 依赖检测 → 自动安装 → markitdown → (失败)原生降级 → 后置清洗 → 输出
| 步骤 | 说明 |
|------|------|
| 预处理 | .doc/.ppt 自动转为 .docx/.pptx(见 §2.5) |
| 依赖 | 按扩展名自动检测+安装缺失 Python 模块,120s 超时 |
| markitdown extras | 自动补全可选依赖,pypdf 已就绪则跳过 |
| markitdown 转换 | CLI 调用 |
| 降级兜底 | 失败时自动切换 python-docx/openpyxl/python-pptx |
| 后置清洗 | 内联执行:去水印+页码+标题修复+表格补全+摘要注入 |
| 结果反馈 | 输出路径 + H 标题统计 + 表格计数 + 转换方式 |
单个小文件可直接调用 scripts/convert.py。批量转换、大文件、网络驱动器文件、旧格式 .doc/.ppt、含 OCR/音频/ZIP 的慢转换任务,必须采用 Init → Step → Poll 渐进式执行,避免长时间转换卡死或失败文件被静默吞掉。
| 阶段 | 动作 | 输出 | 失败回退 |
|---|---|---|---|
| :--- | :--- | :--- | :--- |
| Init | 确认源路径、输出路径、格式过滤、文件数量、覆盖策略和平台能力 | task_id、待转换清单、输出目录、进度 0/N | 路径不可达、输出覆盖未授权、旧格式环境缺失时暂停 |
| Step | 每次只转换 1 个文件或 1 个小批次,执行 convert.py/batch_convert.py 并立即做 V1-V6 检查 | 成功文件、失败文件、输出路径、质量检查结果 | 单文件失败写入失败清单,不影响其他文件;加密文件不重试 |
| Poll | 汇总成功/失败/待处理数量、最近失败原因和可续跑命令 | running/success/failed/paused、进度百分比、失败清单、待确认项 | 中断后从失败清单和未处理清单续跑,不重复转换已验证输出 |
执行约束:
_conversion_errors.log 或等价失败清单,最终回复需列出失败文件和下一步处理建议。convert.py 自动处理依赖。以下为手动参考,完整映射表见 REFERENCE.md §1。
| 格式 | 额外包 |
|------|--------|
| .docx/.doc | python-docx |
| .xlsx | openpyxl |
| .xls | xlrd |
| .pptx/.ppt | python-pptx |
| .pdf | pypdf |
| .epub | ebooklib |
无需额外依赖的格式:.html .csv .json .xml .png .jpg .jpeg .gif .bmp .tiff .webp .mp3 .wav .m4a .ogg .flac .zip
# 一次性安装全部可选依赖(脚本自动处理)
uv tool install markitdown --with python-docx --with openpyxl --with python-pptx --with pypdf --with xlrd --with ebooklib
.doc/.ppt 不被 markitdown 直接支持,convert.py 自动尝试两种方式:
| | .doc→.docx | .ppt→.pptx |
|---|---|---|
| 方式1 | Word COM (Windows only) | PowerPoint COM (Windows only) |
| 方式2 | soffice --headless --convert-to docx | soffice --headless --convert-to pptx |
LibreOffice 定位链:shutil.which("soffice") → $SOFFICE_PATH → 常见安装路径 → 裸名兜底。详见 REFERENCE.md §3。
> 🔴 CHECKPOINT:旧格式且 COM 和 LibreOffice 均不可用时,暂停并告知用户安装 Office 或 LibreOffice。.xls 无需预处理。
# 单文件(推荐)
python scripts/convert.py input.docx -o output.md
# 默认输出名 / 跳过摘要 / 静默
python scripts/convert.py input.pdf
python scripts/convert.py data.xlsx --no-summary
python scripts/convert.py report.pptx -q
# 批量转换(确认源/目标/数量/格式后执行)
python scripts/batch_convert.py <源目录> <输出目录> --ext .pdf .docx --clean
# 单独后置清洗(仅极端场景)
python scripts/post_clean.py output.md --check-only
> 🔴 CHECKPOINT:-o 输出已存在时暂停确认;批量转换前必须确认路径+数量+格式。
markitdown 失败时自动启用原生降级(输出同样经过后置清洗):
| 格式 | 降级方案 | 能力 |
|------|---------|------|
| .docx/.doc | python-docx | 段落样式→标题、表格→MD 表格 |
| .xlsx/.xls | openpyxl | Sheet→H2 章节、数据行→MD 表格 |
| .pptx | python-pptx | 幻灯片→H2 章节、表格自动转换 |
convert.py 内联清洗管线(6 类 15+ 正则):去水印/页码/机密标记/版权声明 + 空白压缩 + 标题层级修复 + 表格分隔符补全 + 文档摘要注入。完整清洗项及正则模式详见 REFERENCE.md §1。
| 错误类型 | 处理方式 |
|:---|:---|
| 依赖安装失败 | 终止,输出缺失包名,提示手动安装 |
| markitdown 失败 | 自动降级到原生转换器 |
| 加密文档 | 🔴 立即终止,提示解密后重试 |
| 旧格式无预处理环境 | 🔴 CHECKPOINT:暂停,告知安装 Office/LibreOffice |
| 批量单文件失败 | 跳过,记入 _conversion_errors.log,其余继续 |
| 输出路径不可写 | 终止,提示检查权限/磁盘空间 |
> 完整异常分类表(含 uv 不在 PATH、网络驱动器不可达等)见 REFERENCE.md §10。
{状态}将 `{源文件名}` 转换为 Markdown [{转换方式}] | H1={n} H2={n} H3={n} | 表格={n} | {文件大小}
输出: {绝对路径}
| 字段 | 取值 |
|:---|:---|
| 状态 | 成功 / 失败 / 部分成功 |
| 转换方式 | markitdown / 原生降级(python-docx) / 原生降级(openpyxl) / 原生降级(python-pptx) |
批量:批量转换完成 | 总计=N | 成功=N | 失败=N,详情见 _conversion_errors.log。
| 脚本 | 用途 |
|------|------|
| scripts/convert.py | 智能转换引擎(依赖补全 + markitdown + 降级 + 内联清洗) |
| scripts/batch_convert.py | 批量递归转换,保持目录结构 |
| scripts/post_clean.py | 单独后置清洗(极端场景备用) |
| scripts/platform_detect.py | 平台检测模块,best_office_tool() 路由 |
前置校验:python -c "from pathlib import Path; assert Path('scripts/convert.py').exists()"
Windows / Linux / macOS 全支持。convert.py 启动时自动检测平台能力,脚本使用 pathlib.Path 适配路径。详见 REFERENCE.md §3。
python scripts/convert.py
python_executor
--ext → 必须指定格式过滤
详细禁令清单见 REFERENCE.md §4。
转换完成后必须执行逐项检查,任一未通过即进入 §5 异常处理。
| # | 检查项 | 验证命令(替换 <输出.md>) |
|:---|:---|:---|
| V1 | 文件存在且非空 | python -c "import os; assert os.stat('<输出.md>').st_size>0" |
| V2 | UTF-8 无乱码 | python -c "open('<输出.md>',encoding='utf-8').read()" |
| V3 | 无残留水印 | python -c "import re; t=open('<输出.md>').read(); assert not re.search(r'Generated by\|Page \\d+',t)" |
| V4 | 标题层级正常 | H1 存在 + 无跳跃(H1→H3 无 H2) |
| V5 | 表格分隔符完整 | 无 \|---\| 缺失 |
| V6 | 批量文件数对应 | 输出目录文件数 = 源文件数 |
Agent 完成后在最终回复中确认:V1 存在非空 / V2+V3 抽检前 3 段无乱码水印 / V4 无跳跃 / V5 表格完整 / V6(批量时)数量一致。
> 详细验证 oneliner、回归测试用例(RT1-RT3)见 REFERENCE.md §5。自检清单见 REFERENCE.md §2。
共 7 个版本