# PP-StructureV3 批量处理工具

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

本工具提供两种处理方式：
- **本地处理** (`main.py`)：直接调用本地 PaddleX pipeline 进行处理
- **API 客户端** (`api_client.py`)：通过 HTTP API 调用远程服务进行处理

## 功能特性

- ✅ 统一输入接口：支持 PDF 文件、图片文件、图片目录、文件列表（.txt）、CSV 文件
- ✅ 自动判断输入类型：根据输入路径自动识别文件类型并处理
- ✅ 页面范围支持：PDF 文件和图片目录支持指定页面范围（如 `1-5,7,9-12`）
- ✅ 成功判断优化：基于输出文件存在性判断处理是否成功
- ✅ 数字标准化：自动将全角数字转换为半角（可选）
- ✅ Dry run 模式：验证配置和输入，不执行实际处理
- ✅ 增强适配器：支持表格识别和文档预处理的增强功能（可选）
- ✅ 进度显示：实时显示处理进度和统计信息
- ✅ 全面文档分析：支持布局检测、表格识别、公式识别、图表识别、印章识别等

## 安装依赖

### 本地处理模式（main.py）

```bash
conda activate paddle_env  # 或 py312

# 安装 PaddleX
pip install paddlex

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

### API 客户端模式（api_client.py）

```bash
# 只需要安装基础依赖，不需要安装 PaddleX
pip install loguru tqdm pillow requests
```

## 使用方法

### 本地处理模式（main.py）

#### 基本用法

```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
```

### API 客户端模式（api_client.py）

#### 基本用法

```bash
# 处理单个PDF文件
python api_client.py --input document.pdf --output_dir ./output --api_url http://localhost:8080/layout-parsing

# 处理图片目录
python api_client.py --input ./images/ --output_dir ./output --api_url http://10.192.72.11:8111/layout-parsing

# 处理文件列表
python api_client.py --input file_list.txt --output_dir ./output --api_url http://localhost:8080/layout-parsing

# 处理CSV文件（失败的文件）
python api_client.py --input results.csv --output_dir ./output --api_url http://localhost:8080/layout-parsing
```

#### 高级用法（本地处理）

```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

# 指定 Pipeline 配置文件
python main.py --input document.pdf --output_dir ./output --pipeline ../paddle_common/config/PP-StructureV3-RT-DETR-H_layout_17cls.yaml

# 指定设备
python main.py --input document.pdf --output_dir ./output --device cpu

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

# 禁用增强适配器
python main.py --input document.pdf --output_dir ./output --no-adapter
```

#### 高级用法（API 客户端）

```bash
# 指定页面范围（PDF或图片目录）
python api_client.py --input document.pdf --output_dir ./output --pages "1-5,7" --api_url http://localhost:8080/layout-parsing

# 只处理前10页（PDF或图片目录）
python api_client.py --input document.pdf --output_dir ./output --pages "-10" --api_url http://localhost:8080/layout-parsing

# 从第5页到最后（PDF或图片目录）
python api_client.py --input document.pdf --output_dir ./output --pages "5-" --api_url http://localhost:8080/layout-parsing

# 仅验证配置（dry run）
python api_client.py --input document.pdf --output_dir ./output --api_url http://localhost:8080/layout-parsing --dry_run

# 使用 DEBUG 日志级别获取详细错误信息
python api_client.py --input document.pdf --output_dir ./output --api_url http://localhost:8080/layout-parsing --log_level DEBUG

# 设置 API 超时时间
python api_client.py --input document.pdf --output_dir ./output --api_url http://localhost:8080/layout-parsing --timeout 600

# 禁用数字标准化
python api_client.py --input document.pdf --output_dir ./output --api_url http://localhost:8080/layout-parsing --no-normalize
```

## 参数说明

### 通用参数（两种模式都支持）

#### 输入输出参数

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

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

#### 处理参数

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

#### 功能开关

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

#### 日志参数

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

### 本地处理模式特有参数（main.py）

#### PP-StructureV3 Pipeline 参数

- `--pipeline`: Pipeline 名称或配置文件路径（默认: `PP-StructureV3`）
  - 可以是内置 pipeline 名称（如 `PP-StructureV3`）
  - 也可以是配置文件路径（如 `../paddle_common/config/PP-StructureV3-RT-DETR-H_layout_17cls.yaml`）

- `--device`: 设备字符串（默认: `gpu:0`）
  - 格式：`gpu:0`, `gpu:1`, `cpu` 等

- `--batch_size`: 批次大小（默认: `1`，PaddleX 通常单张处理）
- `--no-adapter`: 禁用增强适配器（默认启用）

### API 客户端模式特有参数（api_client.py）

#### API 参数

- `--api_url`: API URL（默认: `http://localhost:8080/layout-parsing`）
  - 远程服务的完整 URL 地址
  - 示例：`http://10.192.72.11:8111/layout-parsing`

- `--timeout`: API 调用超时时间（秒，默认: `300`）
  - 单个 API 请求的最大等待时间

## 输出格式

输出目录结构：

```
output_dir/
├── filename.md              # Markdown 内容
├── filename.json            # Content list JSON
├── filename_*.jpg           # 输出图像（如 layout、table 等）
├── 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" \
  --pipeline ../paddle_common/config/PP-StructureV3-RT-DETR-H_layout_17cls.yaml \
  --device cpu \
  --log_level DEBUG
```

#### 示例2：批量处理图片目录

```bash
python main.py \
  --input /path/to/images/ \
  --output_dir ./output \
  --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 \
  --pipeline PP-StructureV3
```

### API 客户端模式示例

#### 示例1：通过 API 处理PDF文件

```bash
python api_client.py \
  --input /path/to/document.pdf \
  --output_dir ./output \
  --pages "1-10" \
  --api_url http://10.192.72.11:8111/layout-parsing \
  --timeout 600 \
  --log_level DEBUG
```

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

```bash
python api_client.py \
  --input /path/to/images/ \
  --output_dir ./output \
  --api_url http://localhost:8080/layout-parsing \
  --log_file ./processing.log
```

#### 示例3：Dry run 验证（API）

```bash
python api_client.py \
  --input /path/to/document.pdf \
  --output_dir ./output \
  --api_url http://localhost:8080/layout-parsing \
  --dry_run
```

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

```bash
python api_client.py \
  --input processed_files.csv \
  --output_dir ./output \
  --api_url http://localhost:8080/layout-parsing
```

## 注意事项

1. **Pipeline 配置**：确保 Pipeline 配置文件路径正确，或使用内置的 pipeline 名称
2. **设备配置**：根据实际情况设置 `--device` 参数（GPU 或 CPU）
3. **内存使用**：处理大文件时注意内存使用情况
4. **文件命名**：PDF 页面会转换为 `filename_page_001.png` 格式
5. **页面范围**：页面编号从 1 开始（不是 0）
6. **增强适配器**：默认启用增强适配器，可以提升表格识别和文档预处理的效果
7. **功能模块**：PP-StructureV3 支持布局检测、表格识别、公式识别、图表识别、印章识别等功能，可通过配置文件控制

## 故障排查

### 问题：Pipeline 初始化失败

- 检查 Pipeline 配置文件路径是否正确
- 确认 PaddleX 已正确安装
- 检查设备配置（GPU/CPU）是否正确

### 问题：处理失败

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

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

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

### 问题：适配器应用失败（仅本地处理模式）

- 检查 PaddleX 版本是否支持适配器
- 可以尝试使用 `--no-adapter` 禁用适配器
- 查看日志获取详细错误信息

### 问题：API 调用失败（仅 API 客户端模式）

- 检查 API URL 是否正确
- 确认远程服务是否正常运行
- 检查网络连接是否正常
- 尝试增加 `--timeout` 参数值
- 使用 `--log_level DEBUG` 获取详细错误信息
- 检查 API 服务返回的错误信息

## 相关工具

- `ocr_utils`: OCR 工具包，提供 PDF 处理、文件处理等功能
- `paddle_common`: PaddleX 共享核心模块（处理器、工具函数、适配器）
- PaddleX: 文档解析框架

## 本地处理 vs API 客户端

| 特性 | `main.py`（本地处理） | `api_client.py`（API 客户端） |
|------|---------------------|---------------------------|
| **处理方式** | 本地 PaddleX pipeline | HTTP API 远程服务 |
| **主要参数** | `--pipeline`, `--device` | `--api_url`, `--timeout` |
| **依赖** | 需要本地安装 PaddleX | 只需要网络连接和 requests |
| **适用场景** | 本地处理、GPU 加速 | 远程服务、分布式处理 |
| **优势** | 无需网络、性能可控 | 无需本地资源、可扩展 |
| **劣势** | 需要本地 GPU/CPU 资源 | 依赖网络和服务可用性 |

### 选择建议

- **使用本地处理** (`main.py`) 当：
  - 有本地 GPU 资源
  - 需要离线处理
  - 对处理速度有较高要求
  - 需要自定义 pipeline 配置

- **使用 API 客户端** (`api_client.py`) 当：
  - 没有本地 GPU 资源
  - 需要分布式处理
  - 服务端已有部署好的 PP-StructureV3 服务
  - 需要统一管理和调度

## 与 PaddleOCR-VL 工具的差异

1. **默认 Pipeline**：PP-StructureV3 工具默认使用 `PP-StructureV3` pipeline
2. **参数命名**：PP-StructureV3 使用下划线命名（如 `use_layout_detection`），PaddleOCR-VL 使用驼峰命名（如 `useLayoutDetection`）
3. **功能差异**：PP-StructureV3 提供更全面的文档结构分析（布局检测、表格识别、公式识别、图表识别、印章识别等），PaddleOCR-VL 专注于视觉语言模型
4. **处理方式**：PP-StructureV3 支持本地处理和 API 客户端两种模式，PaddleOCR-VL layout 调用本地模型，VLRecognition 调用服务端 VL 模型进行处理

