MarkItDown 文档转 Markdown 实战指南:20 种格式一条命令搞定
【免费下载链接】markitdownPython tool for converting files and office documents to Markdown.项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown
MarkItDown 是微软开源的 Python 工具,能把 Word、Excel、PDF、音频、图片、网页等 20 多种文件转成结构化的 Markdown 文本。如果你需要把散落的文档喂给大模型、做全文检索,或者只想用纯文本编辑器快速读 PPT 和表格,它基本一条命令就能搞定。我跑过 docx、pdf、rss 三种输入,实际跑起来会发现:它的输出干净、结构保留得不错,比手动复制粘贴省事很多。
核心能力拆解
一条命令的转换流水线
输入是任意支持的文件路径或 URL,输出就是 Markdown 字符串(终端直出或存盘)。核心用法只有这一句:
markitdown path/to/报告.docx > 报告.md # 或者直接用 -o 存盘 markitdown path/to/报告.docx -o 报告.md💡 关键机制:你可以把它理解成一个"格式分拣台"。文件进来后,MarkItDown 先靠魔数(文件头字节特征)和扩展名猜出类型,再按优先级从高到低依次问已注册的转换器"这个你能不能接",谁接得住谁处理。猜不出扩展名时(比如从标准读入流),用
-x pdf手动给个提示即可。
和 Pandoc 相比,它不追求排版精度的极致还原,而是追求"任何格式都能出可读文本"的覆盖面;和纯手工解析相比,它省去了你为每种格式选库的麻烦。
内置 20 种格式覆盖
内置转换器按文件类型各管一段,装[all]extras(一组可选依赖)后全部可用:
| 类别 | 格式 | 解析要点 |
|---|---|---|
| 办公 | docx / xlsx / xls / pptx / msg | 保留标题层级与表格 |
| 文档 | pdf / epub / ipynb | PDF 走文本层抽取 |
| 数据 | csv / html / rss | CSV 直接转 Markdown 表格 |
| 媒体 | mp3 / wav / 图片 | 音频走元数据,图片走描述 |
| 网络 | 网页 / Wikipedia / YouTube | 按 URL 特征路由 |
from markitdown import MarkItDown md = MarkItDown() result = md.convert("test.xlsx") print(result.markdown) # result.text_content 是旧写法,仍可用💡 关键机制:转换器按优先级排队,PDF、DOCX 这类"专号"优先级为 0,HTML、纯文本这类"通用号"为 10,专号先试,避免 Word 文件被当纯文本处理。
插件机制:给工具接上外部能力
插件通过 Python 的 entry point(可调用入口注册机制)被发现,装完插件包后用-p激活:
pip install markitdown-ocr # 官方 OCR 插件 markitdown scan.pdf -p --list-plugins # 查看已装插件官方 OCR 插件对扫描版 PDF 的处理逻辑:页面没有可抽取文本层时,自动按 300 DPI 渲染成整页图片,交给视觉模型(vision LLM)逐页识别,识别结果按*[Image OCR] ... [End OCR]*标记插回原文位置。没配 LLM 客户端时会静默回退到内置转换器,不会报错。
实战场景演示
场景一:批量转换一整个文件夹
背景:团队把 API 说明散落在 30 多个 docx 里,想统一转成 md 进 Git 管理。
📌 操作步骤:
- 确认依赖装齐:
pip install "markitdown[all]"- 用 shell 循环批量转换(CLI 本身不接受目录参数,批处理交给 shell):
mkdir -p api_markdown for f in api_docs/*.docx; do out="api_markdown/$(basename "${f%.docx}").md" markitdown "$f" -o "$out" done ls api_markdown | head- 或者用 Python 版批量脚本,方便加错误处理:
from pathlib import Path from markitdown import MarkItDown md = MarkItDown() for f in sorted(Path("api_docs").glob("*.docx")): out = Path("api_markdown") / (f.stem + ".md") out.write_text(md.convert(str(f)).markdown, encoding="utf-8") print("done")预期效果:每个 docx 对应一个同名 .md,标题层级和表格都保留为 Markdown 语法,可直接git add进版本控制。
⚠️ 注意:markitdown一次只处理一个文件,没有内置--output-dir这类目录参数,批量逻辑请放在脚本里写。
下面这张图是测试目录里一份学术论文 PDF 的第一页,转出来后的标题、图表说明、脚注都会变成对应的 Markdown 结构:
场景二:网页、RSS 与无扩展名流
背景:把竞品博客的 RSS 订阅或某个 Wikipedia 页面存档成本地 Markdown。
📌 操作步骤:
- 直接传 URL,它会自动按内容类型路由(RSS 有专门的转换器):
markitdown https://example.com/feed.xml -o feed.md- 从管道读入时给格式提示(stdin 没有扩展名可猜):
curl -sL https://example.com/page.html | markitdown -x html -o page.md预期效果:feed.md 里每个条目变成带标题和链接的段落列表,正文中的 HTML 标签被清洗成纯 Markdown。
💡 提示:-x之外还有-m(MIME 类型)和-c(字符集)两个提示参数,遇到乱码时先试-c UTF-8。
场景三:图片与文档里的"看不见的内容"
背景:扫描版 PDF 或文档内嵌的图片,默认抽取不到文字,只能加 LLM 视觉能力补齐。
📌 操作步骤:
- 安装 OCR 插件并配置 OpenAI 兼容客户端:
pip install markitdown-ocr openai- Python 里传入 LLM 客户端:
from openai import OpenAI from markitdown import MarkItDown md = MarkItDown( enable_plugins=True, llm_client=OpenAI(), llm_model="gpt-4o", ) print(md.convert("scan.pdf").markdown)预期效果:扫描页的识别文本按阅读顺序插回对应位置,图片描述与 OCR 文本都进入最终 Markdown。
下面这张图就是项目测试用的"LLM 看图说话"样例图,转换时它会附带模型对图中文字和色块的描述一起输出:
⚠️ 注意:不传llm_client时 OCR 静默跳过,输出只包含文档原有文本,容易误以为插件没生效。
调优与排障
四个高频问题,都是"现象 → 原因 → 修复":
问题 1:某格式报 MissingDependencyException原因:基础包不含该格式的解析库。修复:
pip install "markitdown[all]"问题 2:图片转换后元数据缺失、报错提示需要 exiftool原因:图片 EXIF 元数据依赖外部工具 exiftool。修复:
sudo apt-get install libimage-exiftool-perl # 或用 brew install exiftool问题 3:markitdown < data.bin输出空白或走了错误转换器原因:无扩展名无 URL 可猜,兜底到纯文本。修复:
markitdown -x pdf < data.bin问题 4:装了 OCR 插件但输出里没有 OCR 内容原因:未启用插件或未传 LLM 客户端。修复:
markitdown --list-plugins # 先确认插件能被发现 markitdown scan.pdf -p # 用 -p 激活第三方插件CLI 参数速查(以实际--help输出为准):
| 参数 | 用途 | 示例 |
|---|---|---|
-o | 输出文件 | -o out.md |
-x | 扩展名提示 | -x pdf |
-m | MIME 类型提示 | -m text/html |
-c | 字符集提示 | -c UTF-8 |
-p | 启用第三方插件 | -p |
--list-plugins | 列出已装插件 | |
-d -e | 云端 DocIntel 抽取 | -d -e https://... |
--keep-data-uris | 保留 base64 图片 |
同类工具横向对比:
| 维度 | MarkItDown | Pandoc | Docling |
|---|---|---|---|
| 格式覆盖 | ★★★★★ | ★★★★☆ | ★★★☆☆ |
| 表格还原 | ★★★☆☆ | ★★★★☆ | ★★★★★ |
| 插件扩展 | ★★★★☆ | ★★★☆☆ | ★★★☆☆ |
| LLM 配套 | ★★★★★ | ★★☆☆☆ | ★★☆☆☆ |
选型建议:目标是"任意格式都能出可读文本、接 LLM 工作流",选 MarkItDown;目标是学术论文级别的排版保真,Pandoc 仍是首选。
扩展入口与资源
自己加一种格式只需三步:继承DocumentConverter、实现accepts()(能不能接)和convert()(怎么转),再通过 entry point 注册。仓库里有个完整的 RTF 示例插件:
class RtfConverter(DocumentConverter): def accepts(self, file_stream, stream_info, **kwargs): return (stream_info.extension or "").lower() == ".rtf" def convert(self, file_stream, stream_info, **kwargs): text = file_stream.read().decode("utf-8") return DocumentConverterResult(markdown=rtf_to_text(text))写好后按 sample-plugin 的 pyproject.toml 声明markitdown.plugin入口组,装上去后-p即可识别,官方插件(如 OCR)走的也是这条通道。
资源导航:
- 主包文档与安装说明:packages/markitdown/README.md
- OCR 插件说明与故障排查:packages/markitdown-ocr/README.md
- 示例插件源码:packages/markitdown-sample-plugin/src/markitdown_sample_plugin/_plugin.py
- MCP 服务端(给 Agent 调用):packages/markitdown-mcp/README.md
- 需要源码构建时可拉取仓库:
git clone https://gitcode.com/GitHub_Trending/ma/markitdown
从一条markitdown file.docx命令起步,到批量脚本、OCR 插件、自定义转换器,整条链路都在同一个 Python 包体系内。文档要进搜索、进 RAG、进大模型上下文时,让 MarkItDown 站在流水线最前端,后面所有环节处理的都是干净的 Markdown,这才是它最大的价值。
【免费下载链接】markitdownPython tool for converting files and office documents to Markdown.项目地址: https://gitcode.com/GitHub_Trending/ma/markitdown
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考