文件转 Markdown,用 MarkItDown 就够了
白物集的内容管线每天处理多种格式:早报的 PDF 截图、建站教程的 HTML 页面、知识卡片的 YouTube 链接。过去每类文件需要各自的开源库(PyMuPDF 读 PDF、python-pptx 读幻灯片、beautifulsoup4 解析 HTML),维护成本高,每个库的 API 风格不一致,出错时定位困难。
Microsoft MarkItDown 解决了这个问题。它是 AutoGen 团队开源的 Python 工具,只做一件事:把各种文件格式转为 Markdown,而且做得足够好。GitHub 162k+ stars,MIT 协议,2024 年 11 月开源以来已成为 AI 内容管线领域最受欢迎的格式转换工具之一。
核心亮点
一行命令,覆盖 10+ 格式
MarkItDown 支持的输入格式列表是目前同类工具中最全面的:
| 格式 | 支持情况 | 依赖 |
|---|---|---|
| ✅ 原生 + OCR 插件 | [pdf] |
|
| Word (.docx) | ✅ | [docx] |
| PowerPoint (.pptx) | ✅ | [pptx] |
| Excel (.xlsx) | ✅ | [xlsx] |
| HTML | ✅ | 内置 |
| 图片 (EXIF + OCR) | ✅ | [pdf](间接) |
| 音频 (转录) | ✅ | [audio-transcription] |
| YouTube 链接 | ✅ 自动下载字幕 | [youtube-transcription] |
| EPUB | ✅ | 内置 |
| CSV / JSON / XML | ✅ | 内置 |
| ZIP 压缩包 | ✅ 遍历内容 | 内置 |
每条命令都长这样:
markitdown report.pdf > report.md
markitdown slides.pptx -o slides.md
cat data.csv | markitdown
不需要为每种格式记住不同的库名和参数。
为 LLM 消费优化
MarkItDown 的定位很明确:不是「完美排版保留工具」,而是「LLM 友好转换器」。这意味着它做出的取舍对 AI 工作流极其有利:
- 保留标题层级结构(H1→H6 正确映射)
- 表格转为 Markdown 表格格式
- 链接转为
[text](url)标准格式 - 忽略不必要的样式信息(字体大小、颜色、行距)
- 输出 token 数最小化
根据社区基准测试,同样一份 20 页的 PDF 文档,用 PyMuPDF 提取文本约 4500 tokens,用 MarkItDown 转换后约 3200 tokens——节省了约 30% 的 token 开销,且保留了文档结构信息(标题、列表、表格)。
插件体系:扩展而不膨胀
MarkItDown 内置了插件系统,核心库只包含基础转换能力,OCR、高级 PDF 解析等通过插件提供。搜索 GitHub #markitdown-plugin 可以找到社区插件。这种设计与 Astro 的集成模式类似——核心轻量,需要时按需加载。
在白物集管线中的实际应用
场景一:早报 PDF 截图转文本
早报管线每天从服务器生成 HTML 渲染为 PDF,目前用 OCR + 正则提取,稳定性一般。如果集成 MarkItDown:
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("morning-digest.pdf")
markdown_content = result.text_content
直接得到干净 Markdown,标题层级保留完好,可喂给后续摘要 pipeline。
场景二:知识卡片采集中的 YouTube 转录
采集 Apple 和 AI 新闻时,有时遇到视频形式的信息源。MarkItDown 支持 YouTube URL 直接转录:
markitdown "https://youtube.com/watch?v=xxx" > transcript.md
这会自动提取视频字幕(如果有)并转为 Markdown。在白物集的知识卡片场景中,目前用 yt-dlp 下载字幕再写脚本清理格式。如果改用 MarkItDown,一条命令就能替代 3 个中间步骤。
场景三:Excel 数据表转 Markdown 表格
建站系列教程中经常引用数据库 schema 或数据对比表。用 MarkItDown 转换 Excel:
result = md.convert("article-schedule.xlsx")
print(result.text_content)
# | ID | Title | Status | Date |
# |----|-------|--------|------|
# | 1 | 建站第一篇 | published | 2026-07-01 |
# | 2 | 建站第二篇 | scheduled | 2026-07-02 |
表格格式保留了行列对应关系,直接粘贴进文章即可。
适用场景与局限
最适合: - AI/LLM 数据预处理管线——需要将各种文档统一为 Markdown 格式 - 内容管理系统——批量导入旧文档 - 知识库构建——将企业内部文档(Word、PDF、PPT)转为知识库素材 - 自动化工作流——配合 CI/CD,自动将附件转为可索引文本
不适合: - 需要像素级还原的文档转换(请用 Pandoc 或 Adobe Acrobat) - 扫描件 PDF(需要 OCR 插件,且效果取决于图片质量) - 极低延迟场景(每次调用需要加载格式解析器,首次调用有冷启动)
快速上手
Step 1:安装
pip install 'markitdown[all]'
推荐用 [all] 安装所有可选依赖,省去逐个排查缺失包的麻烦。
Step 2:测试基本转换
echo "# Hello" > test.html
markitdown test.html
# 输出:Hello
Step 3:集成到 Python 脚本
from markitdown import MarkItDown
md = MarkItDown()
result = md.convert("sample.pdf")
print(result.text_content[:500]) # 查看前 500 字符
Step 4:处理批量文件
for f in *.pdf; do
markitdown "$f" -o "${f%.pdf}.md"
done
Step 5:启用插件(如 OCR)
markitdown --use-plugins scanned-doc.pdf -o output.md
写在最后
回到开头的问题:当你的内容管线每天要处理 5 种以上的文件格式时,是维护 5 个不同的库,还是用一个统一的工具?
MarkItDown 给出的答案是:统一接口,不牺牲覆盖度。162k+ stars 不是凭空得来的——它解决了实际工作中一个高频且重复的痛点。如果你的工作流中涉及到「把 X 文件变成 Markdown」这个动作,MarkItDown 值得成为工具箱里的常备工具。
下一个值得思考的问题:当转换完这些文档后,如何自动将它们接入知识库——但那是另一篇文章的话题了。