GPU 加速的 PDF 解析服务
DocParser 是一个 GPU 加速的 PDF 解析 API 服务,提供两个专用引擎:struct 擅长文档结构分析和公式识别;polyglot 擅长中文及多语言文档解析。通过异步任务队列实现分布式 GPU 调度,支持多机多卡并发处理。
Base URL:
https://docparser.deconbear.cn
除 /health 和 /gpustatus 外,所有接口都需要在 HTTP 请求头中携带 API Key:
X-API-Key: dp_YOUR_API_KEY
API 密钥在 GPU 机器的 管理面板 中创建和管理(仅限本机访问)。密钥采用 SHA-256 哈希存储,创建时仅显示一次明文。
提交 PDF → 轮询状态 → 获取结果,三步完成解析:
curl -X POST https://docparser.deconbear.cn/parse \ -F "file=@paper.pdf" \ -F "engine=struct" \ -H "X-API-Key: dp_YOUR_KEY"
返回 202 状态码和 task_id,任务已加入 GPU 处理队列。
curl -H "X-API-Key: dp_YOUR_KEY" \ https://docparser.deconbear.cn/status/TASK_ID
状态流转:queued → started → success 或 failure,建议每 5 秒轮询一次。
curl -H "X-API-Key: dp_YOUR_KEY" \ https://docparser.deconbear.cn/result/TASK_ID
任务完成后返回 Markdown 格式的解析结果。若任务尚未完成,返回 409 状态码。
/parse提交 PDF 文件进行解析。文件被保存后加入异步任务队列,立即返回 task_id。
需要 API Key
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
file | file (PDF) | 是 | 要解析的 PDF 文件,最大 100 MB |
engine | string | 否 | 解析引擎:struct(默认,适合学术论文)或 polyglot(适合中文/多语言文档) |
{"task_id": "f3a1b9c0d2e4", "status": "queued", "message": "Task submitted"}
/status/{task_id}查询解析任务的当前状态和进度。
需要 API Key
| 参数 | 类型 | 说明 |
|---|---|---|
task_id | string | POST /parse 返回的任务 ID |
{
"task_id": "f3a1b9c0d2e4",
"status": "started",
"engine": "struct",
"created_at": "2025-06-15T14:32:00Z",
"started_at": "2025-06-15T14:32:05Z",
"completed_at": null,
"error": null
}
状态值:queued | started | retrying | success | failure
/result/{task_id}获取已完成的解析结果(Markdown 格式)。任务未完成时返回 409。
需要 API Key
| 参数 | 类型 | 说明 |
|---|---|---|
task_id | string | POST /parse 返回的任务 ID |
{
"task_id": "f3a1b9c0d2e4",
"status": "success",
"markdown": "# Paper Title\n\n## Abstract\n\n...",
"engine": "struct",
"parse_time_s": 42.3,
"error": null
}
/task/{task_id}取消一个排队中或正在执行的任务。已完成的任务不受影响。
需要 API Key
| 参数 | 类型 | 说明 |
|---|---|---|
task_id | string | POST /parse 返回的任务 ID |
{"task_id": "f3a1b9c0d2e4", "status": "revoked"}
/health服务健康检查。返回 GPU 状态、Redis 连接状态和活跃 Worker 数量。
无需认证
{
"status": "healthy",
"gpus": [{"index":0, "name":"NVIDIA GeForce RTX 4090",
"utilization_pct":15.0, "memory_pct":33.3}],
"redis_connected": true,
"workers": 2
}
/gpustatus仅返回 GPU 利用率与显存快照,比 /health 更轻量,适合脚本批量检查 GPU 可用性。
无需认证
| HTTP 状态码 | 含义 |
|---|---|
202 | 任务已接受,排队等待处理 |
400 | 请求格式错误(非 PDF 文件或空文件) |
401 | 缺少或无效的 API Key |
403 | 管理面板仅限本机访问 |
404 | 任务不存在(已过期或 ID 错误) |
409 | 任务存在但尚未完成,请先轮询 /status |
413 | PDF 文件超过 100 MB 大小限制 |
./run_worker.sh 0),所有 Worker 共享同一个 Redis 队列。每个 Worker 在领取任务前通过 NVML 检查 GPU 是否空闲。GPU 繁忙时任务自动重试,可被其他空闲机器的 Worker 接管。
import requests
import time
HOST = "https://docparser.deconbear.cn"
HEADERS = {"X-API-Key": "dp_YOUR_KEY"}
def parse_pdf(filepath: str, engine: str = "struct") -> str | None:
# 1. Submit
with open(filepath, "rb") as f:
r = requests.post(
f"{HOST}/parse",
files={"file": f},
data={"engine": engine},
headers=HEADERS,
)
r.raise_for_status()
task_id = r.json()["task_id"]
print(f"Task submitted: {task_id}")
# 2. Poll until done
while True:
r = requests.get(
f"{HOST}/status/{task_id}",
headers=HEADERS,
)
r.raise_for_status()
status = r.json()["status"]
print(f" {status}")
if status in ("success", "failure"):
break
time.sleep(5)
if status == "failure":
raise RuntimeError(f"Parse failed: {r.json().get('error')}")
# 3. Get result
r = requests.get(
f"{HOST}/result/{task_id}",
headers=HEADERS,
)
r.raise_for_status()
data = r.json()
print(f"Done. engine={data['engine']}, time={data['parse_time_s']:.1f}s")
return data["markdown"]
if __name__ == "__main__":
md = parse_pdf("paper.pdf", "struct")
print(md[:500])