基于 FastAPI 和 MinerU 2.0 的智能文档转换调度系统,支持 Office 文档转 PDF、PDF 转 Markdown 的异步任务处理,并自动上传到S3存储。
# 拉取镜像
docker pull docker.cnb.cool/l8ai/document/fileconvert:latest
# 启动服务(带数据持久化)
docker run -d \
--name fileconvert \
--gpus all \
-p 8000:8000 \
-v /data/database:/data/database \
-v /data/logs:/data/logs \
-v /data/workspace:/data/workspace \
-v /data/temp:/data/temp \
docker.cnb.cool/l8ai/document/fileconvert:latest
# 健康检查
curl http://localhost:8000/health
| 目录 | 用途 | 说明 |
|---|---|---|
/data/database | 数据库文件 | SQLite数据库文件存储 |
/data/logs | 日志文件 | 应用日志和错误日志 |
/data/workspace | 任务工作空间 | 任务处理临时文件 |
/data/temp | 临时文件 | 文件上传和处理缓存 |
/usr/bin/libreoffice - 用于Office文档转PDF1. 创建任务 (API) → 2. 任务调度 (TaskProcessor) → 3. 任务执行 (DocumentService)
api/main.py: FastAPI应用入口,提供REST API接口processors/task_processor.py: 异步任务调度器,管理任务队列和并发执行services/document_service.py: 文档转换服务,集成LibreOffice和MinerUPOST /api/tasks/{task_id}/retryPOST /api/tasks/retry-failedPUT /api/tasks/{task_id}/task-typepip install -r requirements.txt
# 启动API服务器
python3 start.py
# 或直接运行API模块
python3 api/main.py
# 健康检查
curl http://localhost:8000/health
# 查看API文档
open http://localhost:8000/docs
docker build -t docker.cnb.cool/aiedulab/library/mineru/mineru-api:latest .
docker run -d \
--name mineru-api \
--gpus all \
-p 8000:8000 \
-v $(pwd)/test:/workspace/test \
-v $(pwd)/output:/workspace/output \
docker.cnb.cool/aiedulab/library/mineru/mineru-api:latest
# 检查容器状态
docker ps
# 查看日志
docker logs mineru-api
# 测试API
curl http://localhost:8000/health
curl -X POST "http://localhost:8000/api/tasks/create" \
-F "task_type=office_to_pdf" \
-F "input_path=/path/to/document.docx" \
-F "bucket_name=your-bucket" \
-F "file_path=documents/document.docx" \
-F "platform=your-platform" \
-F "priority=high"
参数说明:
task_type: 固定值 office_to_pdfinput_path: 本地文件路径bucket_name: S3存储桶名称(任意bucket名称)file_path: 文件在bucket中的路径platform: 平台标识(任意值)priority: 优先级 (high, normal, low)curl -X POST "http://localhost:8000/api/tasks/create" \
-F "task_type=pdf_to_markdown" \
-F "input_path=/path/to/document.pdf" \
-F "bucket_name=your-bucket" \
-F "file_path=documents/document.pdf" \
-F "platform=your-platform" \
-F "priority=high"
参数说明:
task_type: 固定值 pdf_to_markdowncurl -X GET "http://localhost:8000/api/tasks/search?bucket_name=your-bucket&file_path=documents/document.pdf"
响应示例:
{
"tasks": [
{
"id": 1,
"task_type": "pdf_to_markdown",
"status": "completed",
"bucket_name": "your-bucket",
"file_path": "documents/document.pdf",
"s3_urls": [
"s3://ai-file/your-bucket/documents/document/markdown/document.md",
"s3://ai-file/your-bucket/documents/document/markdown/document.json"
],
"output_url": "s3://ai-file/your-bucket/documents/document/markdown/document.md",
"created_at": "2025-08-09T12:00:00Z",
"completed_at": "2025-08-09T12:05:00Z"
}
]
}
路径规则: ai-file/{bucket_name}/{文件夹路径}/{文件名(无后缀)}/{类型}/{输出文件}
示例:
documents/report.pdfcompany-docspdf_to_markdowns3://ai-file/company-docs/documents/report/markdown/report.md路径组成:
ai-file: 固定的S3存储桶前缀{bucket_name}: 用户指定的bucket名称{文件夹路径}: 从file_path提取的目录路径{文件名(无后缀)}: 原始文件名去掉扩展名{类型}: 根据任务类型确定 (pdf 或 markdown){输出文件}: 转换后的文件名curl -X GET "http://localhost:8000/api/tasks/1"
响应示例:
{
"id": 1,
"task_type": "pdf_to_markdown",
"status": "completed",
"progress": 100,
"bucket_name": "your-bucket",
"file_path": "documents/document.pdf",
"platform": "your-platform",
"priority": "high",
"s3_urls": [
"s3://ai-file/your-bucket/documents/document/markdown/document.md",
"s3://ai-file/your-bucket/documents/document/markdown/document.json"
],
"output_url": "s3://ai-file/your-bucket/documents/document/markdown/document.md",
"task_processing_time": 45.67,
"created_at": "2025-08-09T12:00:00Z",
"started_at": "2025-08-09T12:01:00Z",
"completed_at": "2025-08-09T12:05:00Z",
"error_message": null
}
curl -X GET "http://localhost:8000/api/tasks?limit=10&offset=0&status=completed"
curl -X GET "http://localhost:8000/api/stats"
| 方法 | 路径 | 功能 | 说明 |
|---|---|---|---|
POST | /api/tasks/create | 创建转换任务 | 支持office_to_pdf和pdf_to_markdown |
GET | /api/tasks/{task_id} | 查看任务状态 | 获取任务详细信息和处理结果 |
GET | /api/tasks | 列出所有任务 | 支持分页和状态过滤 |
GET | /api/tasks/search | 搜索任务 | 根据bucket_name和file_path查询 |
GET | /api/stats | 查看系统统计 | 队列状态和任务统计信息 |
GET | /health | 健康检查 | 服务状态和组件健康状态 |
GET | /docs | API文档 | Swagger交互式文档 |
| 任务类型 | 输入格式 | 输出格式 | S3路径类型 |
|---|---|---|---|
office_to_pdf | .docx, .xlsx, .pptx | pdf | |
pdf_to_markdown | .md, .json | markdown |
格式: s3://ai-file/{bucket_name}/{文件夹路径}/{文件名(无后缀)}/{类型}/{输出文件}
示例:
输入: bucket_name=company, file_path=docs/report.pdf 输出: s3://ai-file/company/docs/report/markdown/report.md
/workspace/ ├── api/ # FastAPI接口层 │ ├── __init__.py │ └── main.py # API主文件 ├── processors/ # 任务处理器 │ ├── __init__.py │ └── task_processor.py # 异步任务调度器 ├── services/ # 业务服务层 │ ├── __init__.py │ └── document_service.py # 文档转换服务 ├── docs/ # 项目文档 │ ├── document_conversion_workflow.md │ └── batch_conversion_test_summary.md ├── test/ # 测试文件目录 ├── output/ # 输出文件目录 ├── task_workspace/ # 任务工作空间 ├── requirements.txt # Python依赖 ├── Dockerfile # Docker构建文件 ├── .gitignore # Git忽略文件 └── start.py # 启动脚本
/docs 下,测试脚本放在 test 目录下max_concurrent_tasks参数# 查看任务队列状态
curl http://localhost:8000/api/stats
# 查看特定任务详情
curl http://localhost:8000/api/tasks/{task_id}
# 查看系统健康状态
curl http://localhost:8000/health
# 查看API文档
open http://localhost:8000/docs
# 检查LibreOffice安装
which libreoffice
libreoffice --version
# 测试转换功能
libreoffice --headless --convert-to pdf --outdir /tmp test.docx
# 检查MinerU安装
pip show mineru
python -c "import mineru; print(mineru.__version__)"
# 检查GPU支持
nvidia-smi
python -c "import torch; print(torch.cuda.is_available())"
# 查看队列状态
curl http://localhost:8000/api/stats
# 重启服务
pkill -f "python.*start.py"
python start.py
max_concurrent_tasks参数# 查看实时日志
python start.py # 控制台输出
# Docker环境日志
docker logs mineru-api -f
# 检查错误日志
grep -i error /var/log/mineru-api.log
本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
欢迎提交 Issue 和 Pull Request 来改进项目!
如有问题或建议,请通过以下方式联系: