
一个强大的OCR解决方案,使用DeepSeek-OCR配合FastAPI后端将PDF文档转换为Markdown格式。本项目提供批处理脚本和REST API,实现灵活的文档转换功能。
data/目录bashpython pdf_to_markdown_processor.py
创建模型权重目录并下载DeepSeek-OCR模型:
bash# 创建模型目录 mkdir -p models # 使用Hugging Face CLI下载 pip install huggingface_hub huggingface-cli download deepseek-ai/DeepSeek-OCR --local-dir models/deepseek-ai/DeepSeek-OCR # 或使用git git clone https://huggingface.co/deepseek-ai/DeepSeek-OCR models/deepseek-ai/DeepSeek-OCR
Windows用户
cmdREM 构建Docker镜像 build.bat REM 启动服务 docker-compose up -d REM 查看日志 docker-compose logs -f deepseek-ocr
Linux/macOS用户
bash# 构建Docker镜像 docker-compose build # 启动服务 docker-compose up -d # 查看日志 docker-compose logs -f deepseek-ocr
bash# 健康检查 curl http://localhost:8000/health # 预期响应: { "status": "healthy", "model_loaded": true, "model_path": "/app/models/deepseek-ai/DeepSeek-OCR", "cuda_available": true, "cuda_device_count": 1 }
本项目提供多个PDF处理脚本,适用于不同使用场景。所有脚本扫描data/目录中的PDF文件,并使用不同的提示和后处理选项将其转换为Markdown格式。
所有处理器在输出文件名后添加后缀,指示所使用的处理方法:
例如,处理document.pdf将创建:
document-MD.md(markdown处理器)document-OCR.md(OCR处理器)document-CUSTOM.md(自定义提示处理器)用途:使用标准markdown提示进行基本PDF转Markdown转换
特点:
'<image>\n<|grounding|>Convert the document to markdown.'-MD.md后缀使用方法:
bash# 将PDF文件放入data目录 cp your_document.pdf data/ # 运行处理器 python pdf_to_markdown_processor.py # 查看结果 ls data/*-MD.md
用途:带后处理的增强型PDF转Markdown转换
特点:
data/images/文件夹-MD.md后缀使用方法:
bash# 将PDF文件放入data目录 cp your_document.pdf data/ # 运行增强型处理器 python pdf_to_markdown_processor_enhanced.py # 查看结果(包括提取的图像) ls data/*-MD.md ls data/images/
用途:无markdown格式的纯OCR文本提取
特点:
'<image>\nFree OCR.'-OCR.md后缀使用方法:
bash# 将PDF文件放入data目录 cp your_document.pdf data/ # 运行OCR处理器 python pdf_to_ocr_enhanced.py # 查看结果 ls data/*-OCR.md
用途:使用自定义提示处理PDF(原始输出)
特点:
custom_prompt.yaml加载的自定义提示-CUSTOM.md后缀配置:
编辑custom_prompt.yaml自定义提示:
yaml# PDF处理的自定义提示 prompt: '<image>\n<|grounding|>Convert the document to markdown.'
使用方法:
bash# 编辑custom_prompt.yaml中的提示 nano custom_prompt.yaml # 将PDF文件放入data目录 cp your_document.pdf data/ # 运行自定义提示处理器 python pdf_to_custom_prompt.py # 查看结果 ls data/*-CUSTOM.md
用途:使用自定义提示和完整后处理的PDF处理
特点:
custom_prompt.yaml加载的自定义提示-CUSTOM.md后缀配置:
与pdf_to_custom_prompt.py相同 - 编辑custom_prompt.yaml自定义提示。
使用方法:
bash# 编辑custom_prompt.yaml中的提示 nano custom_prompt.yaml # 将PDF文件放入data目录 cp your_document.pdf data/ # 运行增强型自定义提示处理器 python pdf_to_custom_prompt_enhanced.py # 查看结果(包括提取的图像) ls data/*-CUSTOM.md ls data/images/
| 处理器 | 提示 | 后处理 | 图像提取 | 输出后缀 | 用例 |
|---|---|---|---|---|---|
pdf_to_markdown_processor.py | Markdown | ❌ | ❌ | -MD.md | 快速markdown转换 |
pdf_to_markdown_processor_enhanced.py | Markdown | ✅ | ✅ | -MD.md | 带图像的全功能markdown转换 |
pdf_to_ocr_enhanced.py | Free OCR | ✅ | ✅ | -OCR.md | 原始文本提取 |
pdf_to_custom_prompt.py | 自定义(YAML) | ❌ | ❌ | -CUSTOM.md | 测试自定义提示 |
pdf_to_custom_prompt_enhanced.py | 自定义(YAML) | ✅ | ✅ | -CUSTOM.md | 带全功能的自定义提示 |
要比较不同处理器处理同一文档的效果:
bash# 将PDF放入data目录 cp test_document.pdf data/ # 运行所有处理器 python pdf_to_markdown_processor.py python pdf_to_markdown_processor_enhanced.py python pdf_to_ocr_enhanced.py python pdf_to_custom_prompt.py # 比较输出 ls data/test_document-*.md
custom_prompt.yaml设置所需提示:yamlprompt: '<image>\nExtract all tables and format as CSV.'
bashpython pdf_to_custom_prompt_enhanced.py
bashcat data/your_document-CUSTOM.md
FastAPI后端提供多个文档处理端点。
健康检查
bashGET http://localhost:8000/health
处理单张图像
bashcurl -X POST "http://localhost:8000/ocr/image" \ -H "accept: application/json" \ -H "Content-Type: multipart/form-data" \ -F "file=@your_image.jpg"
处理PDF
bashcurl -X POST "http://localhost:8000/ocr/pdf" \ -H "accept: application/json" \ -H "Content-Type: multipart/form-data" \ -F "file=@your_document.pdf"
批处理
bashcurl -X POST "http://localhost:8000/ocr/batch" \ -H "accept: application/json" \ -H "Content-Type: multipart/form-data" \ -F "files=@image1.jpg" \ -F "files=@document.pdf" \ -F "files=@image2.png"
单图像响应
json{ "success": true, "result": "# 文档标题\n\n这是Markdown格式的OCR结果...", "page_count": 1 }
PDF响应
json{ "success": true, "results": [ { "success": true, "result": "# 第1页内容\n...", "page_count": 1 }, { "success": true, "result": "# 第2页内容\n...", "page_count": 2 } ], "total_pages": 2, "filename": "document.pdf" }
pythonimport requests class DeepSeekOCRClient: def __init__(self, base_url="http://localhost:8000"): self.base_url = base_url def process_image(self, image_path): with open(image_path, 'rb') as f: response = requests.post( f"{self.base_url}/ocr/image", files={"file": f} ) return response.json() def process_pdf(self, pdf_path): with open(pdf_path, 'rb') as f: response = requests.post( f"{self.base_url}/ocr/pdf", files={"file": f} ) return response.json() # 使用示例 client = DeepSeekOCRClient() result = client.process_pdf("document.pdf") if result["success"]: for page_result in result["results"]: print(f"第{page_result['page_count']}页:") print(page_result["result"]) print("---")
javascriptclass DeepSeekOCR { constructor(baseUrl = 'http://localhost:8000') { this.baseUrl = baseUrl; } async processImage(file) { const formData = new FormData(); formData.append('file', file); const response = await fetch(`${this.baseUrl}/ocr/image`, { method: 'POST', body: formData }); return await response.json(); } async processPDF(file) { const formData = new FormData(); formData.append('file', file); const response = await fetch(`${this.baseUrl}/ocr/pdf`, { method: 'POST', body: formData }); return await response.json(); } } // 浏览器中使用示例 const ocr = new DeepSeekOCR(); document.getElementById('fileInput').addEventListener('change', async (e) => { const file = e.target.files[0]; const result = await ocr.processPDF(file); if (result.success) { result.results.forEach(page => { console.log(`第${page.page_count}页:`, page.result); }); } });
本项目包含自定义文件,替换原始DeepSeek-OCR库代码以修复关键问题并提供增强功能。这些替换在Docker构建过程中自动应用。
🚨 关键提示参数修复
问题:原始DeepSeek-OCR库在模型初始化期间调用tokenize_with_images()方法时缺少必需的prompt参数,导致服务器启动失败。
解决方案:已创建自定义运行脚本来正确处理prompt参数,防止启动错误。
自定义文件及其用途
项目根目录中的以下自定义文件在Docker构建期间替换其对应文件:
custom_config.py:带有可自定义默认提示和设置的自定义配置custom_image_process.py:修复版图像处理模块,正确处理prompt参数custom_run_dpsk_ocr_pdf.py:增强型PDF脚本,接受--prompt参数并修复初始化问题custom_run_dpsk_ocr_image.py:增强型图像脚本,接受--prompt参数并修复初始化问题custom_run_dpsk_ocr_eval_batch.py:增强型批处理脚本,接受--prompt参数并修复初始化问题这些自定义文件在Docker构建过程中自动复制到原始库文件上,确保无需手动干预即可应用修复。
使用自定义配置
编辑默认提示:
python# 编辑custom_config.py PROMPT = '<image>\n<|grounding|>此处为您的自定义默认提示。'
通过直接脚本使用自定义提示:
bash# 使用custom_config.py中的默认提示 python custom_run_dpsk_ocr_pdf.py --input your_file.pdf --output output_dir # 通过命令行使用自定义提示 python custom_run_dpsk_ocr_pdf.py --prompt "<image>\n<|grounding|>将表格提取为CSV格式。" --input your_file.pdf
通过API使用自定义提示:
bash# 使用默认提示 curl -X POST "http://localhost:8000/ocr/pdf" -F "file=@your_file.pdf" # 使用自定义提示 curl -X POST "http://localhost:8000/ocr/pdf" -F "file=@your_file.pdf" -F "prompt=<image>\n<|grounding|>此处为您的自定义提示。"
构建并运行:
bash# 使用自定义配置和修复重建 docker-compose build # 启动容器 docker-compose up -d
Docker构建过程
Dockerfile在构建过程中自动应用自定义文件:
dockerfile# 复制自定义文件替换原始文件(透明替换方法) COPY custom_config.py ./DeepSeek-OCR-vllm/config.py COPY custom_image_process.py ./DeepSeek-OCR-vllm/process/image_process.py # 复制自定义运行脚本替换原始文件 COPY custom_run_dpsk_ocr_pdf.py ./DeepSeek-OCR-vllm/run_dpsk_ocr_pdf.py COPY custom_run_dpsk_ocr_image.py ./DeepSeek-OCR-vllm/run_dpsk_ocr_image.py COPY custom_run_dpsk_ocr_eval_batch.py ./DeepSeek-OCR-vllm/run_dpsk_ocr_eval_batch.py
这种透明替换方法确保:
详细文档请参见**CUSTOM_CONFIG_README.md**。
编辑docker-compose.yml调整以下设置:
yamlenvironment: - CUDA_VISIBLE_DEVICES=0 # 要使用的GPU设备 - MODEL_PATH=/app/models/deepseek-ai/DeepSeek-OCR # 模型路径 - MAX_CONCURRENCY=50 # 最大并发请求数 - GPU_MEMORY_UTIL
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
docker search 限制
站内搜不到镜像
离线 save/load
插件要用 plugin install
WSL 拉取慢
安全与 digest
新手拉取配置
镜像合规机制
manifest unknown
no matching manifest(架构)
invalid tar header(解压)
TLS 证书失败
DNS 超时
域名连通性排查
410 Gone 排查
402 与流量用尽
401 认证失败
429 限流
D-Bus 凭证提示
413 与超大单层
来自真实用户的反馈,见证轩辕镜像的优质服务