乐于分享
好东西不私藏

AI工具介绍和测评 – 今日分享微软markitdown

AI工具介绍和测评 – 今日分享微软markitdown

什么是markitdown

一个将文件(pdf/word/xls等)转换为 Markdown 的 Python 工具,官方反馈还支持Youtube URL地址、图片、音频等。 因为Markdown格式是现在AI的通用语言格式。

Github 地址 https://github.com/microsoft/markitdown


如何安装

因为要测评这个工具,所以我们先初始化一个干净的Python环境

1、初始化环境

cd test-mitd
# 使用uv 初始化环境(当前前提是在电脑上已经安装了 uv 管理工具 )

# 要求Python 3.8+ 

# pip install uv 

uv venv --python=3.12 .venv
# 激活环境

source
 .venv/bin/activate

2、安装markitdown 及依赖

# 这里选择安装全部依赖,另外注意,如果你用的是 zsh ,请使用 uv pip install 'markitdown[all]' ,主要需要用引号括起来
uv pip install markitdown[all]
# 如果是安装指定的依赖

uv pip install markitdown[docx]
# 或者指定多个

uv pip install markitdown[docx, pdf, xlsx, xls]

3、验证安装

# markitdown --version
markitdown 0.1.5

测评

Tip

在正式测试之前我们先准备几个样例文件

测试文件介绍

├── Word转Markdown测试.docx  # 简单的Word,包含标题一、标题二、正文、有序无序列表和图片
├── PDF转Markdown测试.pdf # 基于上面的docx另存为的PDF文件
├── ai_dify_llm.csv  # 两列的QA问答样例数据
├── ai_dify_llm.xls # 基于上面的csv 另存为 xlx
├── ai_dify_llm.xlsx # 基于上面的csv 另存为 xlx 
├── 微软MarkItDown工具介绍.pdf # 基于豆包生成的pptx 另存为的 pdf (为了测试更复杂的pdf)
└── 微软MarkItDown工具介绍.pptx # 基于豆包生成的pptx

我们这里直接使用 markitdown 的命令行模式来测评。

# 测试基本的Word
markitdown Word转Markdown测试.docx -o Word转Markdown测试-v1.md

# 测试基本的PDF

markitdown PDF转Markdown测试.pdf -o PDF转Markdown测试-v1.md

# 测试 cvs/xls/xlsx

markitdown ai_dify_llm.csv -o ai_dify_llm-from-csv.md
markitdown ai_dify_llm.xls -o ai_dify_llm-from-xls.md
markitdown ai_dify_llm.xlsx -o ai_dify_llm-from-xlsx.md

# 测试pptx

markitdown 微软MarkItDown工具介绍.pptx -o 微软MarkItDown工具介绍-from-pptx.md

上面的这些基本文档类型测试都没有问题,打开对应的markdown文件,发现也都是基本解析成功的,

为啥说基本解析成功,因为

  • • docx 中的图片 默认解析出来是 ![compressed_3fe724bd978498](data:image/jpeg;base64...) 是截断的图片base64编码。 需要添加--keep-data-uris 参数可以获取到完整的base64编码
  • • pdf 中的图片直接是没有解析到

然后测试下特殊的PDF

# 测试负载的PDF
markitdown 微软MarkItDown工具介绍.pdf -o 微软MarkItDown工具介绍-from-pdf.md

Could not get FontBBox from font descriptor because None cannot be parsed as 4 floats
Could not get FontBBox from font descriptor because None cannot be parsed as 4 floats
... ...

发现是报错的,这里的 FontBBox 的含义是

Font Bounding Box,字体边界框,格式为 [x_min, y_min, x_max, y_max] 的 4 个浮点数

某些特殊 PDF(尤其是由 Google Docs、Canva 等 生成的文件)会使用 Type3 自定义字体,这类字体的 FontBBox 可能只存在于字体规格(spec)中,不在 FontDescriptor 里。

参考资料 https://github.com/pdfminer/pdfminer.six/issues/1162

提示让升级 pdfminer.six 到最新版本

uv pip install --force-reinstall  pdfminer-six

最终升级到最新版本 pdfminer-six==20260107 再次执行还是同样的问题

特殊PDF解决方案

Tip

使用第三方包 pymupdf4llm

这里给出可运行的验证程序

import sys
from
 pymupdf4llm import to_markdown

pdf_path = sys.argv[1]
md_output = sys.argv[2] if len(sys.argv) > 2 else pdf_path.replace(".pdf", ".md")

# 直接输出 Markdown(自动处理表格/标题/列表)

markdown_text = to_markdown(pdf_path)

with
 open(md_output, "w", encoding="utf-8") as f:
    f.write(markdown_text)

print
(f"✅ 转换完成: {md_output}")

再次测试转化

uv run python convert_with_llm.py 微软MarkItDown工具介绍.pdf 微软MarkItDown工具介绍-pdf-v2.md
warning: No `requires-python` value found in the workspace. Defaulting to `>=3.12`.
Image too small to scale!! (2x36 vs min width of 3)
Line cannot be recognized!!
=== Document parser messages ===
Using Tesseract for OCR processing.
OCR on page.number=0/1.
OCR on page.number=1/2.
OCR on page.number=2/3.
OCR on page.number=3/4.

✅ 转换完成: 微软MarkItDown工具介绍-pdf-v2.md

pptx / pdf 转化的限制

  • • pptx 和之前的 docx 一样,它知道有图片,但是无法获取到具体的图片,给出来给你图片的引用 ![](Picture4.jpg) 但实际当前目录下根本没有 Picture4.jpg 这个图片
  • • pdf 也和前面提到的一样,感知不到图片的存在,而且这种复杂的PDF解析出来和原文想要的结果差异较大

  • • 另外pdf 无法获取到“格式” 比如一级标题、二级标题、无序列表等

音视频转化

其实针对音视频转化不能说是转化,应该说是转写 transcribe

这里拿mp3音频做测试,在测试之前先说明几点

1、音视频转写依赖于 openai的whisper模型
2、markitdown 命令行工具无法加载本地的whisper模型, 要联网但是又受限于国外网络环境

接下来我们就测试下mp3 转写

准备工作

# 安装对应的模块
pip install openai-whisper

# 下载对应的量化模型,这里用base模型

mkdir
 -p ~/.cache/whisper
curl -L -o ~/.cache/whisper/base.pt https://openaipublic.azureedge.net/main/whisper/models/ed3a0b6b1c0edf879ad9b11b1af5a0e6ab5db9205f891f668f8b0e6c6326e34e/base.pt

脚本测试

# translate_mp3.py

import
 whisper

# 加载基础模型 (会自动加载 ~/.cache/whisper/base.pt )

# 这里名字一定要是 base.pt

model = whisper.load_model("base")

# 转录音频文件

result = model.transcribe("your_audio.mp3")
print
(result["text"])

Tip

这里有个细节需要主要下

  • • 如果是常规的录音问题,比如会议录音,或者自己录制的一段话之类的都是没有问题。
  • • 但如果是类似歌曲这种,除了语音内容之外,掺杂了很长的配乐之类的。
    • • 第一 transcribe 建议加上 language="zh"
    • • 第二转写出来的结果和实际感觉还是有点差异(难道是有隐藏的语音被检测出来了?)

比如这里我用 《星月神话》这首歌的MP3 来测试的结果如下

{'text': ' Yea我爱你我爱你我爱你我爱你我爱你我爱你我爱你我的一生最美好的长情我的一生最美好的长情..... '

如果这篇文章对你有帮助,欢迎:

  1. 1. 收藏 – 方便以后查找
  2. 2.  分享、点赞 – 让更多人知道

有问题? 欢迎在评论区留言,看到后会第一时间回复!