MinerU PDF解析工具:从安装配置到本地部署与API调用的全流程指南
@[TOC](MinerU PDF解析工具:从安装配置到本地部署与API调用的全流程指南)
MinerU
由上海人工智能实验室开源的高质量PDF解析工具,能精准地将包含图片、公式、表格的复杂PDF转换为Markdown和JSON等机器可读的格式。
💻 安装准备
在开始安装前,需要做好以下准备工作:
系统环境:确保你的系统是 Windows、Linux 或 macOS。
Python版本:请安装 Python 3.10 到 3.13 之间的版本,这是稳定运行的前提。
虚拟环境(推荐):强烈建议使用Conda或Venv创建一个独立的Python虚拟环境,以避免包冲突。
1
2
3# 使用Conda创建环境示例
conda create -n mineru_env python=3.11
conda activate mineru_env硬件要求:
- CPU:推荐8核心以上。
- 内存:推荐32GB。
- GPU(可选):如果需要进行GPU加速,推荐使用NVIDIA Turing架构及以上(如RTX 20/30/40系列)且显存不小于8GB的显卡,并确保已安装合适版本的CUDA驱动。
📦 详细安装步骤
MinerU使用 HuggingFace 和 ModelScope 作为模型仓库,用户可以根据需要切换模型源或使用本地模型。
HuggingFace是默认的模型源,在全球范围内提供了优异的加载速度和极高稳定性。ModelScope是中国大陆地区用户的最佳选择,提供了无缝兼容的SDK模块,适用于无法访问HuggingFace的用户。
方法一:使用pip或uv安装MinerU
安装MinerU
在激活的虚拟环境中,执行以下命令安装MinerU。国内用户建议使用国内镜像源以加速下载。1
2
3
4
5# 使用阿里云镜像安装
pip install --upgrade pip -i https://mirrors.aliyun.com/pypi/simple
pip install uv -i https://mirrors.aliyun.com/pypi/simple
uv pip install -U "mineru[core]" -i https://mirrors.aliyun.com/pypi/simple
# uv 是一个用 Rust 编写的高速 Python 包管理器和项目工作流工具,由 Astral 公司开发(也是 Ruff 的开发者)。它旨在替代 pip、pip-tools、virtualenv、poetry 等工具,提供极快的性能和现代化的开发体验。下载模型
MinerU的功能依赖预训练模型,安装后需要下载模型文件。1
2# 默认从Huggingface下载,国内网络可能较慢
mineru-models-download国内用户,更推荐使用Modelscope源,速度更快:
1
2
3
4
5
6
7
8
9# 通过环境变量切换
# 在任何情况下可以通过设置环境变量来切换模型源,这适用于所有命令行工具和API调用。
export MINERU_MODEL_SOURCE=modelscope
# 查看
echo $MINERU_MODEL_SOURCE
mineru-models-download
# 或
import os
os.environ["MINERU_MODEL_SOURCE"] = "modelscope"
其余方法可参考官网:快速开始 - MinerU
⚙️ 配置本地模型路径
让MINERU使用本地模型,主要通过修改其配置文件来实现。
找到或创建配置文件:MINERU的配置文件通常是
mineru.json或magic-pdf.json。它可能位于你的用户主目录(例如C:\Users\用户名\mineru.json)或项目目录下。如果不存在,你可以根据模板创建一个 。编辑配置文件:在配置文件中,你需要指定本地模型文件的位置。关键在于正确设置
models-dir字段 。如果你的Pipeline模式和VLM模式模型存放在不同路径,可以这样配置:
1
2
3
4
5
6{
"models-dir": {
"pipeline": "/path/to/your/pipeline/models",
"vlm": "/path/to/your/vlm/models"
}
}如果所有模型都在同一个目录下,可以直接指定根路径:
1
2
3{
"models-dir": "/path/to/your/all/models"
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38{
"bucket_info": {
"bucket-name-1": [
"ak",
"sk",
"endpoint"
],
"bucket-name-2": [
"ak",
"sk",
"endpoint"
]
},
"latex-delimiter-config": {
"display": {
"left": "$$",
"right": "$$"
},
"inline": {
"left": "$",
"right": "$"
}
},
"llm-aided-config": {
"title_aided": {
"api_key": "your_api_key",
"base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
"model": "qwen3-next-80b-a3b-instruct",
"enable_thinking": false,
"enable": false
}
},
"models-dir": {
"pipeline": "D:\\modelscope\\hub\\models\\OpenDataLab\\PDF-Extract-Kit-1___0",
"vlm": "D:\\modelscope\\hub\\models\\OpenDataLab\\MinerU2___5-2509-1___2B"
},
"config_version": "1.3.1"
}
🚀 使用本地模型
设置环境变量:通过设置环境变量
MINERU_MODEL_SOURCE=local,告诉MINERU从本地路径读取模型 。1
export MINERU_MODEL_SOURCE=localDocker部署时的注意事项:如果你通过Docker部署,需要在启动容器时,将存放本地模型的目录挂载到容器内部,并在容器内正确设置上述环境变量和配置文件路径 。
配置选项
语言支持
1 | |
后端选项详解
Pipeline 后端
- 特点:通用性强,支持多种文档类型
- 方法选项:
auto:自动选择txt:文本提取ocr:OCR识别
VLM 后端(视觉语言模型)
vlm-transformers:通用VLMvlm-vllm-engine:高性能推理引擎vlm-http-client:HTTP客户端模式vlm-mlx-engine:macOS优化引擎
输出文件类型
可视化文件:
{filename}_layout.pdf- 布局边界框{filename}_span.pdf- 文本跨度边界框
内容文件:
{filename}.md- Markdown格式{filename}_content_list.json- 结构化内容
中间文件:
{filename}_middle.json- 中间结果{filename}_model.json- 模型原始输出
Python调用示例
1 | |
核心函数解析
1. do_parse() - 主解析函数
1 | |
支持两种后端模式:
- pipeline 后端:通用解析,支持 OCR 和文本提取
- vlm 后端:基于视觉语言模型,支持多种推理引擎
2. _process_output() - 输出处理函数
1 | |
3. parse_doc() - 用户接口函数
1 | |
提供简化的用户接口,支持多种语言和解析配置。
使用Docker部署Mineru
一、Docker镜像构建
1.1 下载与构建镜像
1 | |
1.2 Dockerfile配置说明
1 | |
GPU架构说明:
- 查看GPU计算能力:CUDA GPU列表
- vLLM v0.10.1.1 支持计算能力≥8.0的显卡
- vLLM v0.10.2 支持更早架构的显卡
二、启动Docker容器
2.1 基础启动命令
1 | |
2.2 端口映射说明
30000: OpenAI兼容服务器端口7860: Gradio WebUI端口8000: FastAPI接口端口
2.3 vLLM加速要求
使用vLLM加速VLM模型推理需满足:
- 硬件要求:Volta及以上架构GPU,显存≥8GB
- 驱动要求:NVIDIA驱动支持CUDA 12.8+
- 容器配置:已正确挂载GPU设备
2.4 容器停止后如何重新启动服务
1 | |
2.5 通过配置环境变量来使用本地模型
1 | |
三、服务启动与使用
3.1 启动OpenAI兼容服务器
1 | |
3.2 启动FastAPI服务
1 | |
访问API文档:http://127.0.0.1:8000/docs
3.3 启动Gradio WebUI
1 | |
访问WebUI:http://127.0.0.1:7860
3.4 HTTP客户端调用
1 | |
3.5 所有vllm/lmdeploy官方支持的参数都可用通过命令行参数传递给 MinerU,包括以下命令:mineru、mineru-openai-server、mineru-gradio、mineru-api
1 | |
MinerU 在 Docker 中部署时出现 CUDA 错误:flash-attn 兼容性问题与解决方案
在 Windows 系统下使用 RTX 5060 显卡通过 Docker 部署 MinerU 时,可能出现以下 CUDA 相关错误,导致服务启动失败:
1 | |
该错误通常与 vllm-flash-attn 在视觉模块中存在兼容性问题有关,系统已自动回退至 xformers 后端。为解决此问题,可尝试手动安装正确版本的 flash-attn。
解决方案:安装 flash-attn
通过以下命令安装指定版本的 flash-attn:
1 | |
若安装过程缓慢,可直接从以下链接下载预编译的 wheel 文件,并放入 Docker 容器中安装:
1 | |
下载后,在 Docker 内执行:
1 | |
MinerU 输出文件说明
mineru 命令执行后,除了输出主要的 markdown 文件外,还会生成多个辅助文件用于调试、质检和进一步处理。
可视化调试文件
- 模型输出(使用原始输出):
- model.json
- 调试和验证(使用可视化文件):
- layout.pdf
- spans.pdf
- 内容提取(使用简化文件):
- *.md
- content_list.json
- 二次开发(使用结构化文件):
- middle.json
布局分析文件 (layout.pdf)
文件命名格式:{原文件名}_layout.pdf
功能说明:
- 可视化展示每一页的布局分析结果
- 每个检测框右上角的数字表示阅读顺序
- 使用不同背景色块区分不同类型的内容块
使用场景:
- 检查布局分析是否正确
- 确认阅读顺序是否合理
- 调试布局相关问题

文本片段文件 (spans.pdf)
仅适用于 pipeline 后端
文件命名格式:{原文件名}_spans.pdf
功能说明:
- 根据 span 类型使用不同颜色线框标注页面内容
- 用于质量检查和问题排查
使用场景:
- 快速排查文本丢失问题
- 检查行内公式识别情况
- 验证文本分割准确性

结构化数据文件
pipeline 后端 输出结果
模型推理结果 (model.json)
文件命名格式:{原文件名}_model.json
数据结构定义
1 | |
坐标系统说明
poly 坐标格式:[x0, y0, x1, y1, x2, y2, x3, y3]
- 分别表示左上、右上、右下、左下四点的坐标
- 坐标原点在页面左上角

示例数据
1 | |
中间处理结果 (middle.json)
文件命名格式:{原文件名}_middle.json
顶层结构
| 字段名 | 类型 | 说明 |
|---|---|---|
pdf_info |
list[dict] |
每一页的解析结果数组 |
_backend |
string |
解析模式:pipeline 或 vlm |
_version_name |
string |
MinerU 版本号 |
页面信息结构 (pdf_info)
| 字段名 | 说明 |
|---|---|
preproc_blocks |
PDF 预处理后的未分段中间结果 |
page_idx |
页码,从 0 开始 |
page_size |
页面的宽度和高度 [width, height] |
images |
图片块信息列表 |
tables |
表格块信息列表 |
interline_equations |
行间公式块信息列表 |
discarded_blocks |
需要丢弃的块信息 |
para_blocks |
分段后的内容块结果 |
块结构层次
1 | |
一级块字段
| 字段名 | 说明 |
|---|---|
type |
块类型:table 或 image |
bbox |
块的矩形框坐标 [x0, y0, x1, y1] |
blocks |
包含的二级块列表 |
二级块字段
| 字段名 | 说明 |
|---|---|
type |
块类型(详见下表) |
bbox |
块的矩形框坐标 |
lines |
包含的行信息列表 |
二级块类型
| 类型 | 说明 |
|---|---|
image_body |
图像本体 |
image_caption |
图像描述文本 |
image_footnote |
图像脚注 |
table_body |
表格本体 |
table_caption |
表格描述文本 |
table_footnote |
表格脚注 |
text |
文本块 |
title |
标题块 |
index |
目录块 |
list |
列表块 |
interline_equation |
行间公式块 |
行和片段结构
行 (line) 字段: - bbox:行的矩形框坐标 - spans:包含的片段列表
片段 (span) 字段: - bbox:片段的矩形框坐标 - type:片段类型(image、table、text、inline_equation、interline_equation) - content | img_path:文本内容或图片路径
示例数据
1 | |
内容列表 (content_list.json)
文件命名格式:{原文件名}_content_list.json
功能说明
这是一个简化版的 middle.json,按阅读顺序平铺存储所有可读内容块,去除了复杂的布局信息,便于后续处理。
内容类型
| 类型 | 说明 |
|---|---|
image |
图片 |
table |
表格 |
text |
文本/标题 |
equation |
行间公式 |
文本层级标识
通过 text_level 字段区分文本层级:
- 无
text_level或text_level: 0:正文文本 text_level: 1:一级标题text_level: 2:二级标题- 以此类推…
通用字段
- 所有内容块都包含
page_idx字段,表示所在页码(从 0 开始)。 - 所有内容块都包含
bbox字段,表示内容块的边界框坐标[x0, y0, x1, y1]映射在0-1000范围内的结果。
示例数据
1 | |
VLM 后端 输出结果
模型推理结果 (model.json)
文件命名格式:{原文件名}_model.json
文件格式说明
- 该文件为 VLM 模型的原始输出结果,包含两层嵌套list,外层表示页面,内层表示该页的内容块
- 每个内容块都是一个dict,包含
type、bbox、angle、content字段
支持的内容类型
1 | |
坐标系统说明
bbox 坐标格式:[x0, y0, x1, y1]
- 分别表示左上、右下两点的坐标
- 坐标原点在页面左上角
- 坐标为相对于原始页面尺寸的百分比,范围在0-1之间
示例数据
1 | |
中间处理结果 (middle.json)
文件命名格式:{原文件名}_middle.json
文件格式说明
vlm 后端的 middle.json 文件结构与 pipeline 后端类似,但存在以下差异:
- list变成二级block,增加
sub_type字段区分list类型:text(文本类型)ref_text(引用类型)
- 增加code类型block,code类型包含两种”sub_type”:
- 分别是
code和algorithm - 至少有
code_body, 可选code_caption
- 分别是
discarded_blocks内元素type增加以下类型:header(页眉)footer(页脚)page_number(页码)aside_text(装订线文本)page_footnote(脚注)
- 所有block增加
angle字段,用来表示旋转角度,0,90,180,270
示例数据
list block 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80{
"bbox": [
174,
155,
818,
333
],
"type": "list",
"angle": 0,
"index": 11,
"blocks": [
{
"bbox": [
174,
157,
311,
175
],
"type": "text",
"angle": 0,
"lines": [
{
"bbox": [
174,
157,
311,
175
],
"spans": [
{
"bbox": [
174,
157,
311,
175
],
"type": "text",
"content": "H.1 Introduction"
}
]
}
],
"index": 3
},
{
"bbox": [
175,
182,
464,
229
],
"type": "text",
"angle": 0,
"lines": [
{
"bbox": [
175,
182,
464,
229
],
"spans": [
{
"bbox": [
175,
182,
464,
229
],
"type": "text",
"content": "H.2 Example: Divide by Zero without Exception Handling"
}
]
}
],
"index": 4
}
],
"sub_type": "text"
}code block 示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79{
"type": "code",
"bbox": [
114,
780,
885,
1231
],
"blocks": [
{
"bbox": [
114,
780,
885,
1231
],
"lines": [
{
"bbox": [
114,
780,
885,
1231
],
"spans": [
{
"bbox": [
114,
780,
885,
1231
],
"type": "text",
"content": "1 // Fig. H.1: DivideByZeroNoExceptionHandling.java \n2 // Integer division without exception handling. \n3 import java.util.Scanner; \n4 \n5 public class DivideByZeroNoExceptionHandling \n6 { \n7 // demonstrates throwing an exception when a divide-by-zero occurs \n8 public static int quotient( int numerator, int denominator ) \n9 { \n10 return numerator / denominator; // possible division by zero \n11 } // end method quotient \n12 \n13 public static void main(String[] args) \n14 { \n15 Scanner scanner = new Scanner(System.in); // scanner for input \n16 \n17 System.out.print(\"Please enter an integer numerator: \"); \n18 int numerator = scanner.nextInt(); \n19 System.out.print(\"Please enter an integer denominator: \"); \n20 int denominator = scanner.nextInt(); \n21"
}
]
}
],
"index": 17,
"angle": 0,
"type": "code_body"
},
{
"bbox": [
867,
160,
1280,
189
],
"lines": [
{
"bbox": [
867,
160,
1280,
189
],
"spans": [
{
"bbox": [
867,
160,
1280,
189
],
"type": "text",
"content": "Algorithm 1 Modules for MCTSteg"
}
]
}
],
"index": 19,
"angle": 0,
"type": "code_caption"
}
],
"index": 17,
"sub_type": "code"
}
内容列表 (content_list.json)
文件命名格式:{原文件名}_content_list.json
文件格式说明
vlm 后端的 content_list.json 文件结构与 pipeline 后端类似,伴随本次middle.json的变化,做了以下调整:
- 新增
code类型,code类型包含两种”sub_type”:- 分别是
code和algorithm - 至少有
code_body, 可选code_caption
- 分别是
- 新增
list类型,list类型包含两种”sub_type”:textref_text
- 增加所有所有
discarded_blocks的输出内容headerfooterpage_numberaside_textpage_footnote
示例数据
code 类型 content
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15{
"type": "code",
"sub_type": "algorithm",
"code_caption": [
"Algorithm 1 Modules for MCTSteg"
],
"code_body": "1: function GETCOORDINATE(d) \n2: $x \\gets d / l$ , $y \\gets d$ mod $l$ \n3: return $(x, y)$ \n4: end function \n5: function BESTCHILD(v) \n6: $C \\gets$ child set of $v$ \n7: $v' \\gets \\arg \\max_{c \\in C} \\mathrm{UCTScore}(c)$ \n8: $v'.n \\gets v'.n + 1$ \n9: return $v'$ \n10: end function \n11: function BACK PROPAGATE(v) \n12: Calculate $R$ using Equation 11 \n13: while $v$ is not a root node do \n14: $v.r \\gets v.r + R$ , $v \\gets v.p$ \n15: end while \n16: end function \n17: function RANDOMSEARCH(v) \n18: while $v$ is not a leaf node do \n19: Randomly select an untried action $a \\in A(v)$ \n20: Create a new node $v'$ \n21: $(x, y) \\gets \\mathrm{GETCOORDINATE}(v'.d)$ \n22: $v'.p \\gets v$ , $v'.d \\gets v.d + 1$ , $v'.\\Gamma \\gets v.\\Gamma$ \n23: $v'.\\gamma_{x,y} \\gets a$ \n24: if $a = -1$ then \n25: $v.lc \\gets v'$ \n26: else if $a = 0$ then \n27: $v.mc \\gets v'$ \n28: else \n29: $v.rc \\gets v'$ \n30: end if \n31: $v \\gets v'$ \n32: end while \n33: return $v$ \n34: end function \n35: function SEARCH(v) \n36: while $v$ is fully expanded do \n37: $v \\gets$ BESTCHILD(v) \n38: end while \n39: if $v$ is not a leaf node then \n40: $v \\gets$ RANDOMSEARCH(v) \n41: end if \n42: return $v$ \n43: end function",
"bbox": [
510,
87,
881,
740
],
"page_idx": 0
}list 类型 content
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17{
"type": "list",
"sub_type": "text",
"list_items": [
"H.1 Introduction",
"H.2 Example: Divide by Zero without Exception Handling",
"H.3 Example: Divide by Zero with Exception Handling",
"H.4 Summary"
],
"bbox": [
174,
155,
818,
333
],
"page_idx": 0
}discarded 类型 content
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22[{
"type": "header",
"text": "Journal of Hydrology 310 (2005) 253-265",
"bbox": [
363,
164,
623,
177
],
"page_idx": 0
},
{
"type": "page_footnote",
"text": "* Corresponding author. Address: Forest Science Centre, Department of Sustainability and Environment, P.O. Box 137, Heidelberg, Vic. 3084, Australia. Tel.: +61 3 9450 8719; fax: +61 3 9450 8644.",
"bbox": [
71,
815,
915,
841
],
"page_idx": 0
}]