实战指南:部署MinerU多模态文档解析API与Dify深度集成(实现解析PDF/JPG/PNG)
MinerU web api部署
MinerU 能够将包含图片、公式、表格等元素的多模态 PDF、PPT、DOCX 等文档转化为易于分析的 Markdown 格式。
-
克隆 MinerU 的仓库
git clone https://github.com/opendatalab/MinerU.git
-
cd 到 projects/web-api
cd projects/web-api
-
在可以科学上网的情况下可以直接运行
docker build -t mineru-api .
-
如果不能科学上网,使用 modelscope
修改改 requirement.txt,添加
modelscope==1.25.0
修改 download_models.py,删掉所有旧代码,改成这个
#!/usr/bin/env python import os from modelscope.hub.snapshot_download import snapshot_download# 配置模型下载路径(Windows路径示例:r'C:\MinerU') MAIN_MODEL_DIR = "/opt/" os.makedirs(MAIN_MODEL_DIR, exist_ok=True)if __name__ == "__main__":# PDF-Extract-Kit的模型下载(需替换为ModelScope对应ID)pdf_extract_patterns = ["models/Layout/YOLO/**","models/MFD/YOLO/**","models/MFR/unimernet_hf_small_2503/**","models/OCR/paddleocr_torch/**",]pdf_model_path = snapshot_download('opendatalab/PDF-Extract-Kit-1.0', # ModelScope模型IDallow_patterns=pdf_extract_patterns,cache_dir=os.path.join(MAIN_MODEL_DIR, "models"),revision='master' # 指定模型版本)# LayoutReader模型下载(需替换为ModelScope对应模型)layout_model_path = snapshot_download('ppaanngggg/layoutreader', # 替换为实际ModelScope IDcache_dir=os.path.join(MAIN_MODEL_DIR, "layoutreader"),allow_patterns=["*.json", "*.safetensors"])print(f"主模型目录:{pdf_model_path}")print(f"布局模型目录:{layout_model_path}")
再运行
docker build -t mineru-api .
-
编写 docker-compose.yml
services:mineru-api:image: mineru-apirestart: alwaysports:- "8920:8920"stdin_open: true # 对应 -i 参数tty: true # 对应 -t 参数runtime: nvidia # 使用 NVIDIA 容器运行时environment:- NVIDIA_VISIBLE_DEVICES=all # 允许访问所有 GPU
-
如果没有 nvidia 的 runtime,先备份自己的 daemon.json 文件 (/etc/docker/),通过
yum install -y nvidia-docker2
安装,这个命令会生成一个新的 daemon.json 文件,覆盖掉原来旧的,安装后之后比较一下新旧两个 daemon 文件,合并在一起。 -
启动
systemctl daemon-reload systemctl restart docker docker compose up -d
-
访问 localhost:8000/docs
-
进入mineru容器目录,编写app.py,保证images字段的正常输出
async def file_parse(file: UploadFile = None,file_path: str = Form(None),parse_method: str = Form("auto"),is_json_md_dump: bool = Form(False),output_dir: str = Form("output"),return_layout: bool = Form(False),return_info: bool = Form(False),return_content_list: bool = Form(False),# 此处修改为 Truereturn_images: bool = Form(False), ):
-
重启mineRu容器
使用MineRu插件
-
Dify配置
-
配置http://api:5001,端口地址暴露给宿主机
docker-compose.yaml:文本搜索services:
services:# API serviceapi:image: langgenius/dify-api:1.4.1restart: always# 添加以下端口映射 ↓ports:- "5001:5001" # 将API 5001 端口映射到宿主机的 5001 端口environment:# Use the shared environment variables.<<: *shared-api-worker-env# Startup mode, 'api' starts the API server.MODE: apiSENTRY_DSN: ${API_SENTRY_DSN:-}SENTRY_TRACES_SAMPLE_RATE: ${API_SENTRY_TRACES_SAMPLE_RATE:-1.0}SENTRY_PROFILES_SAMPLE_RATE: ${API_SENTRY_PROFILES_SAMPLE_RATE:-1.0}PLUGIN_REMOTE_INSTALL_HOST: ${EXPOSE_PLUGIN_DEBUGGING_HOST:-localhost}PLUGIN_REMOTE_INSTALL_PORT: ${EXPOSE_PLUGIN_DEBUGGING_PORT:-5003}PLUGIN_MAX_PACKAGE_SIZE: ${PLUGIN_MAX_PACKAGE_SIZE:-52428800}INNER_API_KEY_FOR_PLUGIN: ${PLUGIN_DIFY_INNER_API_KEY:-QaHbTe77CtuXmsfyhR7+vRjI/+XbV1AaFy691iy+kGDv2Jvy0/eAh8Y1}depends_on:db:condition: service_healthyredis:condition: service_started
其他部署方式:FILES_URL 设置为 ‘http://Dify宿主机IP:5001’
(如 http://192.168.1.100:5001,这里的 IP 通常是运行 Dify 的机器的 IP,即前文提到的 “本地 IP” 端口。5001 是 Dify API 服务的默认端口)。 -
设置Dify文件预览/下载地址:Files_URL
.env:
# File preview or download Url prefix. # used to display File preview or download Url to the front-end or as Multi-model inputs; # Url is signed and has expiration time. # Setting FILES_URL is required for file processing plugins. # - For https://example.com, use FILES_URL=https://example.com # - For http://example.com, use FILES_URL=http://example.com # Recommendation: use a dedicated domain (e.g., https://upload.example.com). # Alternatively, use http://<your-ip>:5001 or http://api:5001, # ensuring port 5001 is externally accessible (see docker-compose.yaml). FILES_URL=http://api:5001
-
重启Dify
- 进入 Dify 源码 docker目录
- 地址栏输入cmd,打开命令行
- 停止旧容器:
docker-compose down
- 重新构建(仅当 Dockerfile 或 build 参数变更时):
docker-compose build
- 启动服务:
docker-compose up -d
-
-
Dify插件市场安装MineRu插件,并打开插件目录
-
点击该插件详情,出现授权界面
Base URL配置为http://host.docker.internal:8920
令牌为空,服务类型选择本地部署,点击保存,显示已授权即可
编辑解析测试工作流
-
创建单轮工作流应用,设置基本信息
-
配置PDF文件下载地址的HTTP请求节点
-
配置MineRu插件的解析节点
注意:以上只有解析变量及其解析方法可以使用,其他都是官方API使用参数
输出变量:text : 解析后的 Markdown 文本
files: 额外的导出格式文件(html,docx,latex)
json:解析后的内容列表
full_zip_url: 仅限官方 API,完整解析结果的 zip URL
images: 从 PDF 中提取的图片
-
获取PDF文件第一个大标题作为文件名的代码执行节点
import re def main(mdText: str) -> dict:match = re.search(r'^#\s+(.*)$', mdText, re.MULTILINE)if match:return {'result': match.group(1)}else:return {'result': ""}
-
插件市场安装Markdown转换器插件,并使用
-
结束节点:结果存在文件下载地址
注意:dify保存文件存在过期时间,可能会导致md文件图片链接失效,建议,给予LLM模型解析使用即可,如需本地,保存图片本地使用