跳到正文

目录

MarkItDown 指南:微软开源的文档转 Markdown 工具

MarkItDown 指南:微软开源的文档转 Markdown 工具

§1 项目概述

1.1 什么是 MarkItDown?

MarkItDown 是微软开源的轻量级 Python 工具,出自 AutoGen 团队,把各种格式的文档转换成 Markdown,服务对象是 LLM(大语言模型)和文本分析管道。

项目信息
Stars188K+(截至 2026 年 10 月)
Forks13.9K
官方仓库microsoft/markitdown
最新版本v0.1.8(2026-09-22)
语言Python
贡献者133 人
许可证MIT

数字会随时间变化,以仓库主页为准。

1.2 为什么转成 Markdown?

LLM 对 Markdown 的接受度天然高于裸文本。GPT-4o 这类主流模型的训练语料里大量出现过 Markdown,能直接识别标题、列表、表格、链接的结构;同样的内容用 HTML 表达要消耗更多 token(词元),而 Markdown 用极少的标记就保留了结构。

一个直观的对比:把同一份财务报告丢给模型,扁平化文本会把表头和数据混在一起,模型要自己猜结构;转成 Markdown 表格后,检索和推理都更稳。

1.3 MarkItDown vs Textract

MarkItDown 常被拿来和 textract 比较,README 也主动把自己定位成 textract 的对标品。两者都做文本提取,差别在输出:

对比维度TextractMarkItDown
输出格式纯文本Markdown(保留结构)
文档结构可能丢失保留标题、列表、表格、链接
定位通用文本提取LLM/RAG(检索增强生成)管道优化
依赖较重按需安装、轻量

需要说明边界:MarkItDown 的目标读者是文本分析工具,不是追求高保真的人类阅读场景。复杂版式、字体、配色这类视觉信息会被丢弃。

§2 支持格式详解

2.1 格式列表

MarkItDown 目前支持以下格式(README 列出,另有一些社区扩展):

格式类型说明依赖
PDF文本与表格提取pip install 'markitdown[pdf]'
PowerPoint.pptx 文件pip install 'markitdown[pptx]'
Word.docx 文件pip install 'markitdown[docx]'
Excel.xlsx / .xls 文件pip install 'markitdown[xlsx,xls]'
图片EXIF 元数据 + LLM 图像描述内置(描述需传 llm_client,见 §7)
音频元数据 + 语音转录pip install 'markitdown[audio-transcription]'
HTML网页内容内置支持
CSV / JSON / XML文本格式内置支持
ZIP 文件递归转换内部文件内置支持
YouTube视频转录pip install 'markitdown[youtube-transcription]'
EPub电子书内置支持
Outlook.msg 邮件pip install 'markitdown[outlook]'

2.2 全量安装

# 安装所有格式支持
pip install 'markitdown[all]'

[all] 会装齐全部可选依赖。磁盘或依赖冲突敏感的场景,用下面的按需安装更稳妥。

2.3 渐进式安装

# 只装 PDF 支持
pip install 'markitdown[pdf]'

# 只装 Office 三件套
pip install 'markitdown[pptx,docx,xlsx]'

# PDF + DOCX + PPTX
pip install 'markitdown[pdf,docx,pptx]'

§3 快速上手

3.1 环境准备

MarkItDown 要求 Python 3.10–3.14,官方建议用虚拟环境隔离依赖:

# 标准 Python
python -m venv .venv
source .venv/bin/activate  # Linux / macOS
.venv\Scripts\activate     # Windows

# 用 uv 创建(装包时用 uv pip install)
uv venv --python=3.12 .venv
source .venv/bin/activate

3.2 CLI(命令行工具)使用

# 输出到 stdout
markitdown path-to-file.pdf > document.md

# 指定输出文件
markitdown path-to-file.pdf -o document.md

# 管道输入
cat path-to-file.pdf | markitdown

从管道读入时格式判断只能靠猜,可以用 -x 指定扩展名、-m 指定 MIME 类型、-c 指定字符集,给转换器一个明确提示。

3.3 Python API(应用程序接口)使用

核心用法三行:

from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("test.xlsx")
print(result.markdown)

convert() 接收文件路径、URL、Path 对象、requests.Response 或二进制流,按扩展名自动路由到对应转换器。结果对象的 markdown 属性是当前推荐写法;text_content 是它的兼容别名,旧代码里常见。

§4 插件系统

4.1 插件架构

MarkItDown 从 0.1.0 起引入插件机制,第三方能通过 Python entry point 扩展转换能力。插件默认关闭,装好后要显式启用。

# 查看已安装插件
markitdown --list-plugins

# 启用插件转换
markitdown --use-plugins path-to-file.pdf

# 查找社区插件:在 GitHub 搜 #markitdown-plugin

4.2 核心插件一览

插件功能安装
markitdown-ocr图片 OCR(LLM Vision)pip install markitdown-ocr
markitdown-mcpMCP 服务器pip install markitdown-mcp
markitdown-sample-plugin插件开发模板见 packages/markitdown-sample-plugin

4.3 OCR 插件

markitdown-ocr 为 PDF、DOCX、PPTX、XLSX 里的嵌入图片添加 OCR,用 LLM Vision 提取文字,不需要额外的机器学习库或二进制依赖:

pip install markitdown-ocr
pip install openai  # 或任意 OpenAI 兼容客户端
from markitdown import MarkItDown
from openai import OpenAI

md = MarkItDown(
    enable_plugins=True,
    llm_client=OpenAI(),
    llm_model="gpt-4o",
)
result = md.convert("document_with_images.pdf")
print(result.markdown)

注意:不传 llm_client 时插件仍会加载,但 OCR 会被静默跳过,退回内置转换器。

4.4 MCP 服务器

MCP(Model Context Protocol)是连接 LLM 应用的标准协议。官方 markitdown-mcp 包把 MarkItDown 暴露成一个 MCP 服务器,Claude Desktop 这类应用可以直接调用它读取任意文档。

pip install markitdown-mcp
markitdown-mcp --help

服务器暴露一个 convert_to_markdown(uri) 工具,可接收 http:、https:、file:、data: 形式的 URI。默认走 STDIO;加 --http 开启 Streamable HTTP 与 SSE 传输,默认监听 127.0.0.1:3001,--host 和 --port 只在 HTTP 模式下有效(旧的 --sse 是 --http 的弃用别名)。服务器不做认证,以当前用户权限读文件,不要把它暴露到不受信的网络。

§5 Azure Document Intelligence 集成

5.1 什么时候用它

内置转换器离线运行,覆盖常规场景。碰到扫描版 PDF、复杂表格、多栏排版这类高精度需求,可以切到 Azure 的云端文档分析服务。

5.2 CLI 使用

markitdown path-to-file.pdf -o document.md -d -e "<document_intelligence_endpoint>"

v0.1.8 起端点也可以放在环境变量里,之后只需要 -d:

export MARKITDOWN_DOCINTEL_ENDPOINT="<document_intelligence_endpoint>"
markitdown path-to-file.pdf -o document.md -d

5.3 Python API 使用

from markitdown import MarkItDown

md = MarkItDown(docintel_endpoint="<your_endpoint>")
result = md.convert("test.pdf")
print(result.markdown)

端点从 Azure 门户创建 Document Intelligence 资源后获取。每次调用走 Azure API,会产生费用,别在本地测试时误用。

§6 Azure Content Understanding 集成

6.1 它解决了什么

v0.1.6 起新增对 Azure Content Understanding 的支持,覆盖内置转换器和 Document Intelligence 够不着的场景:

  • 音视频:内置转换器不支持视频,音频只有基础转录;视频只有 CU 一条路,音频用它质量更高
  • 结构化字段提取:预置或自定义 analyzer 抽取发票金额、合同条款等字段,输出为 YAML front matter——内置和 Document Intelligence 集成都不暴露字段
  • 高质量文档提取:云端布局分析与 OCR,应对扫描件、复杂表格和多页文档
  • 单 API 多模态:一个 cu_endpoint 处理文档、图片、音频、视频,按文件类型自动路由
pip install 'markitdown[az-content-understanding]'

6.2 CLI 使用

markitdown path-to-file.pdf --use-cu --cu-endpoint "<content_understanding_endpoint>"

同样支持环境变量:

export MARKITDOWN_CU_ENDPOINT="<content_understanding_endpoint>"
markitdown path-to-file.pdf --use-cu

6.3 Python API 使用

from markitdown import MarkItDown

# 零配置:按文件类型自动选择预置 analyzer
md = MarkItDown(cu_endpoint="<content_understanding_endpoint>")
result = md.convert("report.pdf")   # 文档 → prebuilt-documentSearch
result = md.convert("meeting.mp4")  # 视频 → prebuilt-videoSearch
result = md.convert("call.wav")     # 音频 → prebuilt-audioSearch
print(result.markdown)

自定义 analyzer 抽领域字段:

md = MarkItDown(
    cu_endpoint="<content_understanding_endpoint>",
    cu_analyzer_id="my-invoice-analyzer",
)
result = md.convert("invoice.pdf")
print(result.markdown)
# 输出带 YAML front matter 的提取字段:
# ---
# contentType: document
# fields:
#   VendorName: CONTOSO LTD.
#   InvoiceDate: '2019-11-15'
# ---

自定义 analyzer 会按自身模态匹配兼容的文件类型;遇到不兼容的输入(比如文档 analyzer 碰上音频),自动回退到默认预置 analyzer,不会直接报错。

费用提示:路由到 Content Understanding 的格式,每次 convert() 都是一次计费调用。只希望 PDF 走云端时,用 cu_file_types 限定:

from markitdown.converters import ContentUnderstandingFileType

md = MarkItDown(
    cu_endpoint="<content_understanding_endpoint>",
    cu_file_types=[ContentUnderstandingFileType.PDF],  # 只有 PDF 走 CU
)

6.4 三套转换怎么选

能力内置转换器Document IntelligenceContent Understanding
文档转换离线、按格式提取云端布局提取云端多模态提取
结构化字段不支持集成未暴露YAML front matter
自定义 analyzer不支持集成不可配cu_analyzer_id
音视频无视频、基础音频不支持支持
成本仅本地计算Azure API 计费Azure API 计费

§7 LLM 图像描述

7.1 功能说明

给 PPTX 和图片文件提供 llm_client、llm_model,MarkItDown 会用视觉模型生成图片的文字描述。注意:目前只对这两类文件生效。

7.2 配置方法

from markitdown import MarkItDown
from openai import OpenAI

client = OpenAI(max_retries=5)

md = MarkItDown(
    llm_client=client,
    llm_model="gpt-4o",
    llm_prompt="用中文描述这张图片的内容",
)
result = md.convert("example.jpg")
print(result.markdown)

llm_client 只要兼容 OpenAI 的客户端协议即可,不必局限官方 openai 包。失败处理有一条明确链路:OpenAI 客户端对可重试错误默认自动重试 2 次(max_retries=5 表示最多 6 次尝试,带退避);重试耗尽或遇到不可重试错误时,MarkItDown 会尝试其他适用的转换器,全部失败才抛 FileConversionException。

§8 技术架构

8.1 包结构

packages/
├── markitdown/               # 核心包
├── markitdown-mcp/           # MCP 服务器
├── markitdown-ocr/           # OCR 插件
└── markitdown-sample-plugin/ # 插件开发模板

仓库根目录有 Dockerfile,不改代码就能容器化运行:

docker build -t markitdown:latest .
docker run --rm -i markitdown:latest < ~/your-file.pdf > output.md

8.2 核心转换流程

输入(路径 / URL / 流)
    ↓
格式猜测(扩展名 / MIME / 内容探测,可能产生多个候选)
    ↓
按优先级逐个尝试转换器(accepts() 通过才进入 convert())
    ↓
某个转换器抛异常 → 记录下来,换下一个继续
    ↓
Markdown 输出

这套"猜测 + 排序 + 失败回退"的设计解释了一个常见现象:损坏或非常规文件往往仍能转出结果,只是质量下降——因为优先转换器失败后由兜底转换器接手。

8.3 内置 Converter

核心包内置了 18 个转换器,按扩展名、MIME 类型或 URL 模式分发:

转换器触发条件提取内容
PDF.pdf文本与表格
PowerPoint.pptx幻灯片文本
Word.docx全文结构
Excel.xlsx / .xls表格数据
图片.jpg / .png 等EXIF + 可选 LLM 描述
音频.mp3 / .wav元数据 + 转录
HTML.html结构化文本
CSV.csv表格
纯文本.txt / .json / .jsonl 等兜底文本提取
RSS / AtomXML 订阅源条目内容
Wikipediawikipedia.org URL词条内容
Bing SERPbing.com/search URL搜索结果
Jupyter Notebook.ipynb单元格内容
YouTubeYouTube URL字幕转录
EPub.epub全书文本
Outlook.msg邮件内容
ZIP.zip递归转换内部文件

Document Intelligence 与 Content Understanding 转换器只在构造时传入对应端点才会注册,且排在转换器栈的最前面——这正是 §6.4 里"传入 cu_file_types 才不会被抢路由"的原因。

§9 实践建议

9.1 RAG 管道集成

MarkItDown 常作为 RAG 管道的第一步:把异构文档统一转成 Markdown,再交给分块、嵌入、检索:

from markitdown import MarkItDown

def extract_document(file_path: str) -> str:
    """RAG 管道的文档提取步骤"""
    md = MarkItDown(enable_plugins=True)
    result = md.convert(file_path)
    return result.markdown

content = extract_document("quarterly_report.pdf")

9.2 批处理模式

from markitdown import MarkItDown
from pathlib import Path

def batch_convert(directory: str, output_dir: str) -> None:
    """批量转换目录下所有支持的文件"""
    md = MarkItDown()
    output_path = Path(output_dir)
    output_path.mkdir(parents=True, exist_ok=True)

    for file in Path(directory).rglob("*"):
        if file.suffix.lower() in [".pdf", ".docx", ".pptx", ".xlsx"]:
            try:
                result = md.convert(str(file))
                (output_path / f"{file.stem}.md").write_text(result.markdown)
                print(f"ok: {file.name}")
            except Exception as e:
                print(f"fail: {file.name}: {e}")

batch_convert("./documents", "./markdown")

9.3 流式处理

convert_stream() 从 v0.1.0 起要求二进制文件对象(0.0.x 曾接受文本流,是破坏性变更):

from markitdown import MarkItDown

md = MarkItDown()
with open("document.pdf", "rb") as f:
    result = md.convert_stream(f)
    print(result.markdown)

9.4 安全注意事项

README 在最显眼的位置放了警告:MarkItDown 以当前进程权限执行 I/O,行为和 open() / requests.get() 一样。不要直接把不受信的输入喂给它——托管服务里用户上传的文件可能指向内网地址或元数据服务。

优先调用最窄的 API:只处理本地文件用 convert_local(),只处理字节流用 convert_stream(),而不是一律用权限宽松的 convert()。

§10 FAQ 与故障排除

Q1:转换后内容不完整? A1:v0.1.0 起移除了临时文件机制,DocumentConverter 改为直接读文件流,内容应完整返回。若仍有缺失,先确认文件本身可被读取。

Q2:convert_stream() 报错? A2:确认传的是二进制对象(open(file, "rb") 或 io.BytesIO)。0.0.x 版本接受的文本流已经不再支持。

Q3:只想装特定格式? A3:用可选依赖,如 pip install 'markitdown[pdf,docx,pptx]'。格式与依赖对应关系见 §2.1 表格。

Q4:Azure 端点怎么配置? A4:在 Azure 门户创建 Document Intelligence 或 Content Understanding 资源,拿到端点后分别传给 docintel_endpoint 或 cu_endpoint,也可以用 §5.2 和 §6.2 的环境变量。注意两者是独立的云服务,各有各的计费。

Q5:OCR 没生效? A5:确认装了 markitdown-ocr 并在 MarkItDown() 里传了 enable_plugins=True 和 llm_client。缺任一条件 OCR 都会静默跳过。

§11 总结

MarkItDown 解决的核心问题:把 PDF、Office、图片、音频等异构文档统一转成 Markdown,直接喂给 LLM 或 RAG 管道。它的竞争力在三点:格式覆盖广、依赖按需安装、输出保留结构(标题、列表、表格、链接不丢)。

局限同样要清楚:复杂排版的 PDF 转换精度有限,追求高保真应评估 Azure Document Intelligence 或 Content Understanding;OCR 和云端转换依赖外部服务,有额外成本与延迟。

判断依据就一条——场景是「批量文档 → Markdown → LLM 处理」,MarkItDown 是门槛最低的选择;对转换精度或音视频字段提取有硬性要求,再引入 Azure 服务。

附录:安装速查表

# 全量安装
pip install 'markitdown[all]'

# 常用组合
pip install 'markitdown[pdf,docx,pptx]'

# PDF + 图片 OCR
pip install 'markitdown[pdf]' markitdown-ocr openai

# Azure Document Intelligence
pip install 'markitdown[az-doc-intel]'

# Azure Content Understanding
pip install 'markitdown[az-content-understanding]'

# YouTube 视频转录
pip install 'markitdown[youtube-transcription]'

端点类配置建议走环境变量,避免把密钥写进脚本:

export MARKITDOWN_DOCINTEL_ENDPOINT="<document_intelligence_endpoint>"
export MARKITDOWN_CU_ENDPOINT="<content_understanding_endpoint>"

附录:术语表

术语含义
LLM大语言模型,本文指 GPT-4o 这类生成式模型
RAG检索增强生成,先检索再生成的问答/处理管道
Token词元,模型处理文本的最小单位
CLI命令行工具
API应用程序接口
MCP模型上下文协议,LLM 应用与外部工具互通的协议
OCR光学字符识别,从图片中提取文字

本文基于 microsoft/markitdown 项目(v0.1.8)撰写,MIT 许可证。版本、Star 等数据随项目演进,以仓库主页为准。

参与讨论

使用 GitHub 登录。欢迎补充事实、异议与实践。