微软MarkItDown:文档转Markdown神器
·

MarkItDown解析
1. 概述
MarkItDown 是微软开源的一个轻量级 Python 工具,用于将各种文件格式转换为 Markdown。它专为 LLM(大语言模型)和文本分析管道设计,与 textract 类似,但更专注于保留文档结构(标题、列表、表格、链接等)。
核心价值主张:
- 输出 Markdown 格式,LLM 原生理解
- 保留文档结构,便于下游处理
- Token 效率高
2. MarkItDown架构
d:/daku/markitdown-main/
├── packages/
│ ├── markitdown/ # 核心包
│ ├── markitdown-mcp/ # MCP 服务器集成
│ ├── markitdown-ocr/ # OCR 插件(LLM Vision)
│ └── markitdown-sample-plugin/ # 插件开发示例
├── Dockerfile
└── README.md
3. MarkItDown设计
3.1 MarkItDown核心类结构
┌─────────────────────────────────────┐
│ MarkItDown (主入口) │
│ - 管理转换器注册表 │
│ - 协调转换流程 │
│ - 处理多种输入源 │
└─────────────────────────────────────┘
│
┌─────────┼─────────┐
▼ ▼ ▼
┌────────┐ ┌────────┐ ┌────────┐
│内置转换器│ │插件转换器│ │Azure文档 │
│(20+种) │ │(动态加载)│ │智能转换器 │
└────────┘ └────────┘ └────────┘
│
▼
┌─────────────────────────────────────┐
│ DocumentConverter (抽象基类) │
│ - accepts() # 判断是否可处理 │
│ - convert() # 执行转换 │
└─────────────────────────────────────┘
│
┌─────────┼─────────┬─────────┐
▼ ▼ ▼ ▼
┌───────┐ ┌───────┐ ┌───────┐ ┌───────┐
│PDF │ │DOCX │ │XLSX │ │PPTX │
│Converter│ │Converter│ │Converter│ │Converter│
└───────┘ └───────┘ └───────┘ └───────┘
3.2 MarkItDown支持的文件格式
| 类别 | 格式 | 依赖 |
|---|---|---|
| 文档 | pdfminer.six, pdfplumber | |
| Office | DOCX, PPTX, XLSX | python-pptx, mammoth, pandas |
| 网页 | HTML, RSS, Wikipedia | beautifulsoup4 |
| 媒体 | 图片(OCR), 音频(转录) | SpeechRecognition, pydub |
| 数据 | CSV, JSON, XML, ZIP | 内置 |
| 其他 | YouTube, EPub, Outlook | youtube-transcript-api |
4. MarkItDown核心代码解析
4.1 主类 MarkItDown
class MarkItDown:
def __init__(self, *, enable_builtins=True, enable_plugins=False, **kwargs):
# 支持 LLM 客户端配置(用于图片描述)
self._llm_client = kwargs.get("llm_client")
self._llm_model = kwargs.get("llm_model")
# 使用 Magika 进行文件类型检测
self._magika = magika.Magika()
# 转换器注册表(带优先级)
self._converters: List[ConverterRegistration] = []
4.2 转换器优先级系统
PRIORITY_SPECIFIC_FILE_FORMAT = 0.0 # 特定格式(如 .pdf, .docx)
PRIORITY_GENERIC_FILE_FORMAT = 10.0 # 通用格式(如 text/*)
优先级规则:
- 数值越小,优先级越高
- 相同优先级时,后注册的优先
- 插件可以通过设置优先级来覆盖内置转换器
4.3 MarkItDown转换流程
def convert(self, source):
# 1. 识别输入类型(本地文件/URL/流/Response)
# 2. 获取 StreamInfo 猜测列表
# 3. 按优先级排序转换器
# 4. 逐个尝试转换器
# 5. 返回第一个成功的结果
4.4 文件类型检测(Magika 集成)
def _get_stream_info_guesses(self, file_stream, base_guess):
# 1. 基于扩展名猜测 MIME 类型
# 2. 使用 Magika 进行内容分析
# 3. 使用 charset-normalizer 检测编码
# 4. 返回兼容的猜测列表
5. 转换器实现示例
5.1 HTML 转换器
class HtmlConverter(DocumentConverter):
def accepts(self, file_stream, stream_info, **kwargs):
# 基于 MIME 类型或扩展名判断
mimetype = (stream_info.mimetype or "").lower()
extension = (stream_info.extension or "").lower()
return extension in [".html", ".htm"] or \
mimetype.startswith("text/html")
def convert(self, file_stream, stream_info, **kwargs):
# 1. 使用 BeautifulSoup 解析
# 2. 移除 script/style 标签
# 3. 使用自定义 markdownify 转换
# 4. 处理递归深度超限的回退
5.2 PDF 转换器(最复杂)
class PdfConverter(DocumentConverter):
def convert(self, file_stream, stream_info, **kwargs):
# 1. 使用 pdfplumber 提取文本和表格
# 2. 将表格转换为 Markdown 格式
# 3. 处理 MasterFormat 部分编号
# 4. 合并文本和表格输出
6. 插件系统
6.1 插件注册机制
使用 Python 的 entry_points 系统:
# pyproject.toml
[project.entry-points."markitdown.plugin"]
ocr = "markitdown_ocr"
6.2 插件接口
__plugin_interface_version__ = 1
def register_converters(markitdown: MarkItDown, **kwargs):
markitdown.register_converter(MyCustomConverter())
6.3 OCR 插件详解
功能:
- 使用 LLM Vision 提取 PDF/DOCX/PPTX/XLSX 中嵌入图片的文字
- 支持扫描 PDF 的全页 OCR
- 保持文档结构和阅读顺序
工作流程:
- 插件以优先级
-1.0注册(高于内置转换器的0.0) - 接受文件并提取嵌入图片
- 将图片发送到 LLM 进行 OCR
- 将识别文本内联插入到文档中
7. MCP 服务器集成
MCP (Model Context Protocol) 是 Anthropic 推出的开放协议,用于标准化 AI 应用与外部工具的集成。
# markitdown-mcp 提供:
# - STDIO 传输(默认)
# - Streamable HTTP 传输
# - SSE 传输
# 暴露的工具:
convert_to_markdown(uri) # 支持 http:, https:, file:, data: URI
Claude Desktop 配置示例:
{
"mcpServers": {
"markitdown": {
"command": "docker",
"args": ["run", "--rm", "-i", "markitdown-mcp:latest"]
}
}
}
8. 测试体系
tests/
├── _test_vectors.py # 测试向量定义
├── test_cli_vectors.py # CLI 测试
├── test_module_vectors.py # 模块 API 测试
├── test_pdf_*.py # PDF 专项测试
└── test_files/ # 测试文件
测试向量模式:
@dataclass
class FileTestVector:
filename: str
mimetype: str | None
charset: str | None
url: str | None
must_include: List[str] # 必须包含的内容
must_not_include: List[str] # 必须不包含的内容
9. 依赖管理策略
采用可选依赖分组(extras):
[project.optional-dependencies]
all = ["..."] # 全部依赖
pdf = ["pdfminer.six", "pdfplumber"]
docx = ["mammoth", "lxml"]
pptx = ["python-pptx"]
xlsx = ["pandas", "openpyxl"]
audio-transcription = ["pydub", "SpeechRecognition"]
youtube-transcription = ["youtube-transcript-api"]
az-doc-intel = ["azure-ai-documentintelligence"]
安装方式:
pip install 'markitdown[all]' # 完整功能
pip install 'markitdown[pdf,docx]' # 仅 PDF 和 Word
10. MarkItDown关键技术
| 技术 | 用途 |
|---|---|
| Magika | Google 的文件类型检测库,基于深度学习 |
| charset-normalizer | 字符编码自动检测 |
| BeautifulSoup + markdownify | HTML → Markdown 转换 |
| pdfplumber | PDF 文本和表格提取 |
| python-pptx/mammoth | Office 文档处理 |
| Entry Points | 插件发现和加载机制 |
11. 使用场景
- RAG 系统:将企业文档转换为 Markdown 供 LLM 处理
- 文档分析:批量提取文档内容进行分析
- 内容迁移:将旧格式文档迁移到 Markdown 系统
- AI 工作流:作为 Claude Desktop 等工具的文档处理能力
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)