# DotsOCR vLLM 批量处理工具

基于 DotsOCR 的批量文档处理工具，支持 PDF 和图片文件的批量处理。

## 功能特性

- ✅ 统一输入接口：支持 PDF 文件、图片文件、图片目录、文件列表（.txt）、CSV 文件
- ✅ 自动判断输入类型：根据输入路径自动识别文件类型并处理
- ✅ 页面范围支持：PDF 文件和图片目录支持指定页面范围（如 `1-5,7,9-12`）
- ✅ 成功判断优化：基于输出文件存在性判断处理是否成功
- ✅ 数字标准化：自动将全角数字转换为半角（可选）
- ✅ Dry run 模式：验证配置和输入，不执行实际处理
- ✅ 调试模式：保存原始版本用于对比
- ✅ 并发处理：支持多线程并发处理（可选）
- ✅ 进度显示：实时显示处理进度和统计信息

## 安装依赖

```bash
conda activate py312

# 安装 DotsOCR
pip install dots-ocr

# 安装其他依赖
pip install loguru tqdm pillow
```

## 使用方法

### 基本用法

```bash
# 处理单个PDF文件
python main.py --input document.pdf --output_dir ./output

# 处理图片目录
python main.py --input ./images/ --output_dir ./output

# 处理文件列表
python main.py --input file_list.txt --output_dir ./output

# 处理CSV文件（失败的文件）
python main.py --input results.csv --output_dir ./output
```

### 高级用法

```bash
# 指定页面范围（PDF或图片目录）
python main.py --input document.pdf --output_dir ./output --pages "1-5,7"

# 只处理前10页（PDF或图片目录）
python main.py --input document.pdf --output_dir ./output --pages "-10"

# 从第5页到最后（PDF或图片目录）
python main.py --input document.pdf --output_dir ./output --pages "5-"

# 仅验证配置（dry run）
python main.py --input document.pdf --output_dir ./output --dry_run

# 使用 DEBUG 日志级别获取详细错误信息
python main.py --input document.pdf --output_dir ./output --log_level DEBUG

# 指定服务器地址
python main.py --input document.pdf --output_dir ./output --ip 10.192.72.11 --port 8101

# 调整批次大小
python main.py --input ./images/ --output_dir ./output --batch_size 4

# 禁用数字标准化
python main.py --input document.pdf --output_dir ./output --no-normalize

# 启用并发处理
python main.py --input ./images/ --output_dir ./output --use_threading --max_workers 3
```

## 参数说明

### 输入输出参数

- `--input, -i`: 输入路径（必需）
  - PDF 文件：自动转换为图片处理
  - 图片文件：直接处理
  - 图片目录：扫描所有图片文件
  - 文件列表（.txt）：每行一个文件路径
  - CSV 文件：读取失败的文件列表

- `--output_dir, -o`: 输出目录（必需）

### DotsOCR vLLM 参数

- `--ip`: vLLM 服务器 IP（默认: `127.0.0.1`）
- `--port`: vLLM 服务器端口（默认: `8101`）
- `--model_name`: 模型名称（默认: `DotsOCR`）
- `--prompt_mode`: 提示模式（默认: `prompt_layout_all_en`）
  - 可选值：`dict_promptmode_to_prompt.keys()` 中的所有模式
- `--min_pixels`: 最小像素数（默认: `MIN_PIXELS`）
- `--max_pixels`: 最大像素数（默认: `MAX_PIXELS`）
- `--dpi`: PDF 转图片的 DPI（默认: `200`）

### 处理参数

- `--batch_size`: 批次大小（默认: `1`）
- `--pages, -p`: 页面范围（PDF和图片目录有效）
  - 格式：`"1-5,7,9-12"`（第1-5页、第7页、第9-12页）
  - `"1-"`：从第1页到最后
  - `"-10"`：前10页
- `--collect_results`: 收集处理结果到指定CSV文件

### 并发参数

- `--use_threading`: 启用多线程并发处理
- `--max_workers`: 最大并发工作线程数（默认: `3`，应与 vLLM data-parallel-size 匹配）

### 功能开关

- `--no-normalize`: 禁用数字标准化（默认启用）
- `--dry_run`: 仅验证配置，不执行处理

### 日志参数

- `--log_level`: 日志级别（`DEBUG`, `INFO`, `WARNING`, `ERROR`，默认: `INFO`）
- `--log_file`: 日志文件路径

## 输出格式

输出目录结构：

```
output_dir/
├── filename.md              # Markdown 内容
├── filename.json            # Layout info JSON
├── filename_layout.jpg      # 布局可视化图片
├── filename_original.md     # 原始 Markdown（如果启用标准化且发生变化）
└── filename_original.json   # 原始 JSON（如果启用标准化且发生变化）
```

### 成功判断标准

处理成功的判断标准：
- 输出目录中存在对应的 `.md` 文件
- 输出目录中存在对应的 `.json` 文件

如果两个文件都存在，则认为处理成功。

## 统计信息

处理完成后会显示：

- 文件统计：总文件数、成功数、失败数、跳过数
- 性能指标：总耗时、吞吐量、平均处理时间

结果会保存到 `{output_dir}_results.json` 文件中。

## 示例

### 示例1：处理PDF文件

```bash
python main.py \
  --input /path/to/document.pdf \
  --output_dir ./output \
  --pages "1-10" \
  --ip 10.192.72.11 \
  --port 8101 \
  --log_level DEBUG
```

### 示例2：批量处理图片目录（并发）

```bash
python main.py \
  --input /path/to/images/ \
  --output_dir ./output \
  --batch_size 4 \
  --use_threading \
  --max_workers 3 \
  --log_file ./processing.log
```

### 示例3：Dry run 验证

```bash
python main.py \
  --input /path/to/document.pdf \
  --output_dir ./output \
  --dry_run
```

### 示例4：处理失败的文件（从CSV）

```bash
python main.py \
  --input processed_files.csv \
  --output_dir ./output \
  --ip 10.192.72.11 \
  --port 8101
```

## 注意事项

1. **服务器连接**：确保 DotsOCR vLLM 服务器正在运行并可访问
2. **内存使用**：处理大文件时注意内存使用情况
3. **文件命名**：PDF 页面会转换为 `filename_page_001.png` 格式
4. **页面范围**：页面编号从 1 开始（不是 0）
5. **并发处理**：使用 `--use_threading` 时，确保 `--max_workers` 与 vLLM 服务器的 `data-parallel-size` 匹配

## 故障排查

### 问题：连接服务器失败

- 检查服务器地址和端口是否正确
- 确认服务器是否正在运行
- 检查网络连接和防火墙设置

### 问题：处理失败

- 使用 `--log_level DEBUG` 获取详细错误信息和 traceback
- 检查输出目录权限
- 查看日志文件获取更多信息

### 问题：输出文件不存在

- 检查处理是否真的失败（查看错误信息）
- 确认输出目录路径正确
- 检查磁盘空间是否充足

### 问题：并发处理性能不佳

- 确保 `--max_workers` 与 vLLM 服务器的 `data-parallel-size` 匹配
- 检查服务器资源使用情况
- 调整 `--batch_size` 参数

## 相关工具

- `ocr_utils`: OCR 工具包，提供 PDF 处理、文件处理等功能
- DotsOCR: 文档解析框架

## 与 MinerU 工具的差异

1. **输出格式**：DotsOCR 输出 `_layout.jpg`，MinerU 输出 `_layout.pdf`
2. **服务器参数**：DotsOCR 使用 `--ip` 和 `--port`，MinerU 使用 `--server_url`
3. **提示模式**：DotsOCR 支持多种 `prompt_mode`，MinerU 使用固定的提示方式
4. **并发处理**：DotsOCR 支持可选的并发处理（`--use_threading`），MinerU 仅支持单进程

