PyMuPDF4LLM vs pdfplumber vs Marker:用真实 PDF 实测

作者 pdftomd.tools 团队 · 更新于 · 阅读约 6 分钟

先说结论:如果能接受 AGPL 许可证,pymupdf4llm 是最稳妥的默认选择,速度快,标题也最干净。pdfplumber 采用 MIT 许可证,有边框表格最准,但完全不生成标题。marker 处理无边框表格最好,还能去掉页面上的多余内容,可在 CPU 上慢好几倍,而且把我们的中文文本弄坏了。如果只转一个文件,Python PDF转Markdown 指南里也有不用安装任何东西的做法。

插图:三支贴着标签的试管,里面是从 PDF 倒出来的 Markdown

PyMuPDF4LLM vs pdfplumber vs Marker:结论

根据我们的测试,该选哪个库
如果你需要……选原因
快速得到带标题的好 Markdownpymupdf4llm三份文档里所有预期标题都识别到了,层级也对
有边框表格的单元格要准,许可证要宽松pdfplumber有边框表格和合并单元格都完全正确;MIT 许可证
无边框表格,去掉重复页眉marker找到了两个简单的无边框示例;删掉了页眉和页码
中文或日文文本pymupdf4llm所有字符和标点都保留;marker 丢了字

没有哪个库在所有测试里都赢。下面给出每一行背后的数据,你可以拿手头真正要处理的 PDF,在 pymupdf4llm vs pdfplumber vs marker 之间做决定。

测试方法:硬件、版本、文档

为了公平,三个库在同一台机器上处理同一批文件,全部只在 CPU 上解析 PDF:Intel(R) Xeon(R) Processor,8 个 vCPU,16 GB 内存,没有 GPU,Linux 6.12.94+ x86_64,Python 3.13.5。版本:pymupdf4llm 1.28.2(PyMuPDF 1.28.2),pdfplumber 0.11.9(pdfminer.six 20251230),marker-pdf 2.0.0(surya-ocr 0.22.1,torch 2.14.1+cpu)。token 用 tiktoken 0.14.0 的 o200k_base 编码统计。测试日期是 2026 年 10 月 19 日。

插图:一台 CPU 机器用三个 Python 库处理同样的三个 PDF 和一组表格示例
三个库用同样的文件、同一台机器、同一套评分。
  • 文档:一份 5 页的英文指南,13 个标题、1 个表格;一份 11 页的中文报告,29 个标题、4 个表格;一份 4 页的英文报告,每页都有同样的页眉和页码。
  • 表格示例:11 个单页 PDF,每个单元格的正确内容我们都知道,其中两个根本没有表格。
  • 设置:都用各库的默认值。pdfplumber 没有 Markdown 输出,所以我们写了二十来行代码,把它的文本行和 find_tables() 的结果按阅读顺序拼起来。marker 用默认设置(CPU 上默认的快速模式)跑一次,再加 --disable_ocr 跑一次。
  • 计时:取三次运行的中位数。marker 的模型预先加载过一次(4.79 秒),并丢掉了一次预热运行。
import pymupdf4llm
md = pymupdf4llm.to_markdown("report.pdf")

import pdfplumber
with pdfplumber.open("report.pdf") as pdf:
    for page in pdf.pages:
        lines = page.extract_text_lines()
        tables = page.find_tables()

from marker.converters.pdf import PdfConverter
from marker.models import create_model_dict
from marker.output import text_from_rendered
converter = PdfConverter(artifact_dict=create_model_dict())
md, _, _ = text_from_rendered(converter("report.pdf"))
每个库的核心调用。加上评分的完整脚本大约 220 行。

在 CPU 上,marker 2.0 还需要 llama.cpp 的 llama-server 程序,要按它的 README 另外安装;第一次启动时,它在我们机器上下载了大约 1.8 GB 的模型文件。我们前两次都失败了:一次是 torch 和 torchvision 版本不匹配,一次是缺了 llama-server。这些是安装问题,不是库的 bug,但最好预留时间。

速度和 token 数

每份文档的中位耗时(秒)和输出的 tiktoken token 数,来自我们的测试
库英文指南(5 页)中文报告(11 页)带重复页眉的英文报告(4 页)token,中文报告
pymupdf4llm0.693 秒1.419 秒0.387 秒8908
pdfplumber0.713 秒3.579 秒0.023 秒8782
marker(默认)3.354 秒4.563 秒2.325 秒10001
marker(--disable_ocr)1.425 秒3.146 秒0.447 秒10001

pymupdf4llm vs pdfplumber vs marker 差别最大的是速度。pdfplumber 在短报告上最快(0.023 秒),但在中文报告上是两个轻量工具里最慢的。pymupdf4llm 很稳定,每页 0.1 到 0.14 秒。即使模型已经加载好,marker 处理英文指南也比 pymupdf4llm 慢 5 倍;加上 --disable_ocr 后差距缩小了。

两个轻量库的 token 数差不多。marker 在中文报告上多出约 12% 的 token,部分来自 <sup> 标签和多余空格;在短报告上反而更少,因为它删掉了重复的页眉。

标题和页面上的多余内容

找到的预期标题数,以及其中层级正确的数量,来自我们的测试
库英文指南(13)中文报告(29)带重复页眉的英文报告(4)
pymupdf4llm13(层级正确 13)29(层级正确 29)4(层级正确 4)
pdfplumber0(层级正确 0)0(层级正确 0)0(层级正确 0)
marker(默认)11(层级正确 4)23(层级正确 14)4(层级正确 3)
marker(--disable_ocr)11(层级正确 4)23(层级正确 14)4(层级正确 3)

第二大差别是标题。pymupdf4llm 找到了所有标题,层级都对。它还把指南里加粗的 FAQ 问题也标成了标题(6 行),有时这反而有用。pdfplumber 不认识标题,只给你平铺的文本。marker 找到了大部分标题,但层级经常不对。

在 4 页报告里,pymupdf4llm 和 pdfplumber 保留了全部 4 处重复页眉和 4 个页码,marker 把两者都删了。这是 pymupdf4llm vs marker 最明显的区别:marker 的版面模型知道什么是页眉,轻量库不知道。pdfplumber 还在一行末尾留下了一个断开的单词。

截图:pymupdf4llm、pdfplumber 和 marker 针对同一份 4 页报告输出的原始 Markdown,分三栏并排
截图:每个库为这份 4 页报告写出的原始 Markdown,未做任何修改。

表格:有边框、无边框、合并单元格

每个表格示例的结果,来自我们的测试
示例pymupdf4llmpdfplumbermarker
有边框表格完全正确完全正确完全正确
Office 导出单元格 81%完全正确单元格 94%
无边框表格单元格 40%未找到单元格 90%
多行单元格完全正确完全正确单元格 83%
无边框、多行未找到未找到单元格 83%
Office、无边框未找到未找到未找到
正文中的表格完全正确未找到完全正确
两个表格完全正确单元格 33%完全正确
合并单元格单元格 83%完全正确单元格 42%
完全正确的表格:9 个里 pymupdf4llm 4 个,pdfplumber 4 个,marker 3 个。在两个没有表格的示例上,没有哪个库凭空造出表格。加 --disable_ocr 的 marker 在每个示例上的结果都和默认 marker 一样。

表格的排名取决于 PDF 里有没有画线。pdfplumber 的 find_tables() 沿着线条找表格,所以只要 PDF 画了网格线,连合并单元格都能完全正确;没有线就什么也找不到。pymupdf4llm 在大多数有边框表格上完全正确,但有一个 Office 表格的单元格里有未转义的 |,被它拆坏了。marker 找到了两个简单的无边框示例,单元格正确率 83% 到 90%;pymupdf4llm 只找到一个,正确率 40%,pdfplumber 一个都没找到。不过在合并单元格示例里,marker 把几列合到了一起。

Office 导出的无边框表格,三个库都没识别出来。如果你最看重表格,我们的 PDF 表格转换指南 解释了为什么无边框版式对任何工具都难。

中文文本:字符保留、空格、标点

11 页中文报告,来自我们的测试
库中文字符保留率句内空格句内换行全角逗号保留率
pymupdf4llm100%1590100%
pdfplumber100%0140100%
marker(默认)98.6%16600%

到了中文,排名又变了。原 PDF 的句子里没有任何空格。pymupdf4llm 保留了每个字和每个全角逗号,但在句子里插了 159 个空格。pdfplumber 也保住了字符,但在句子中间留下了 140 处换行。marker 丢了 1.4% 的字符,包括几个小节标题,把所有全角逗号换成了英文逗号,还加了 152 个 <sup> 标签。在我们的测试里,中文 PDF 用 marker 转出来后要改的地方最多。

许可证:AGPL、MIT、Apache,以及模型条款

插图:三张许可证卡片,每个库一张,另有一张单独的卡片代表 marker 的模型权重
对 marker 来说,代码许可证不是全部:模型权重另有条款。
  • pdfplumber:根据它的 LICENSE 文件,采用 MIT 许可证。只要保留许可声明,就能用在闭源和商业代码里。
  • pymupdf4llm 和 PyMuPDF:仓库附带 GNU AGPL 3.0,包的元数据写着 "Dual Licensed - GNU AFFERO GPL 3.0 or Artifex Commercial License"。简单说:如果你分发依赖它的程序,或者通过网络向用户提供修改过的版本,AGPL 要求你以同样的许可证公开这个程序的源代码,除非你向 Artifex 购买商业许可。
  • marker:代码是 Apache-2.0,但模型权重用的是修改版 AI Pubs Open RAIL-M 许可证。根据 MODEL_LICENSE,研究、个人使用以及总收入或融资低于 500 万美元的组织可以免费使用权重;超过这个规模需要向 Datalab 购买许可。

如果许可证是决定因素,对大多数商业团队来说,两个轻量库之间真正的选择就是 AGPL 还是 MIT,而 marker 还多了一道收入门槛。以上只是摘要,不构成法律意见,发布前请自己读一遍许可证文件。

常见问题

pymupdf4llm vs pdfplumber vs marker,哪个最好?

在我们的测试里,普通文档和中文文本选 pymupdf4llm,想在 MIT 许可下准确提取有边框表格选 pdfplumber,无边框表格和带重复页眉的页面选 marker。

pymupdf4llm 能免费商用吗?

在 AGPL 下可以,但分发程序或作为服务提供时要同时公开你的源代码。做不到的话,Artifex 出售商业许可。

marker 需要 GPU 吗?

不需要。它在我们没有 GPU 的 8 vCPU 机器上能跑,但需要 llama.cpp 的 llama-server,而且比轻量库慢好几倍。

pdfplumber 能直接输出 Markdown 吗?

不能。它返回文本、单词、线条和表格,Markdown 要你自己拼,就像我们这次测试做的那样。

哪个库能处理扫描版 PDF?

marker 是围绕 OCR 模型构建的。pymupdf4llm 和 pdfplumber 默认只读取文本层,所以扫描件会是空的。

我可以复现这个测试吗?

可以。脚本、版本和硬件都写在上面了;换一台机器耗时会不同,但质量结果应该一致。