在 RAG 应用中,处理多样化文件格式是一项常见且充满挑战的任务,其中 PDF 文件的解析尤其让开发者感到棘手。近期,微软开源了 Markitdown 这一 Markdown 转换工具,号称能将任意文件转换为 Markdown 格式。短短数日便飙升至 23K 星标,它究竟有何过人之处?其 PDF 解析能力到底如何?本文将深入探讨该工具的性能与潜力。
1. 简介
Markitdown 不仅支持将微软自家的 Office 文件格式转换为 Markdown,其他常见的 PDF、HTML 格式同样可以处理,甚至还能直接处理 Audio 音频文件,自动将其转写为文本。对于图像类文件,则可配置大模型自动生成描述文本。
- PowerPoint
- Word
- Excel
- Images
- Audio
- HTML
- 各种其他基于文本的格式 (csv, json, xml, 等等)
- ZIP 压缩包 (自动遍历内容)
介绍完毕,开始实测。
2. 安装
安装过程非常简便,只需执行下方命令即可完成。
pip install markitdown
3. 简单使用
使用方法同样简单,既支持命令行调用,也支持 Python API 集成。
- 命令行方式
markitdown path-to-file.pdf > document.md
- API 方式
from markitdown import MarkItDown
from openai import OpenAI
client = OpenAI()
md = MarkItDown(llm_client=client, llm_model="gpt-4o")
result = md.convert("exmaple.pdf")
print(result.text_content)
4. 测试 PDF
大家最关心的还是 PDF 文本的转换效果——之前的测评文章已经讨论过,PDF 解析的难点主要在于表格和复杂布局的提取,纯文本提取基本没有问题。那么 markitdown 在表格提取方面的表现如何?我们不妨以《LightRAG》论文为例进行转换测试。
markitdown lightrag.pdf > lightrag.md
- 原文表格
LightRAG 中包含一个复杂表格,此处不再展示,改用最简单的表格进行对比。
- 提取后表格

可以说样式完全丢失,连最基本的表格框架都没有保留,更严重的是文字内容的排列顺序也出现了错误。为何效果如此之差?这跟 markitdown 的实现机制有关,下面我们来一探究竟。
5. 一探深浅
markitdown 的代码量非常少,核心实现仅包含两个文件:入口文件 __main__.py 和具体转换逻辑 __markitdown.py。入口代码相当简单,主要负责接收文件并调用 convert 方法。
parser.add_argument("filename", nargs="?")
args = parser.parse_args()
if args.filename is None:
markitdown = MarkItDown()
result = markitdown.convert_stream(sys.stdin.buffer)
print(result.text_content)
else:
markitdown = MarkItDown()
result = markitdown.convert(args.filename)
print(result.text_content)
markitdown 会根据文件的扩展名自动选择合适的转换器。下面重点看一下 PDF 转换器的实现。
class PdfConverter(DocumentConverter):
"""
Converts PDFs to Markdown. Most style information is ignored, so the results are essentially plain-text.
"""
def convert(self, local_path, **kwargs) -> Union[None, DocumentConverterResult]:
# Bail if not a PDF
extension = kwargs.get("file_extension", "")
if extension.lower() != ".pdf":
return None
return DocumentConverterResult(
title=None,
text_content=pdfminer.high_level.extract_text(local_path),
)
是的,你没有看错:它实际上只是调用了 pdfminer 的提取函数。因此,这个工具的核心目标其实是集成各类开源工具包,统一输出为 Markdown 格式。看了这两个文件你就会明白,对 markitdown 不必抱有过高期望——它并非某个格式的深度解析器,仅仅是一个轻量级的封装器(Wrapper),而非解析器(Parser)。
