# Python脚本说明

## 目录结构

```
python/
├── README.md                      # 本文件
├── requirements.txt               # Python依赖列表
├── install.bat                    # Windows安装脚本
├── install.sh                     # Linux/macOS安装脚本
├── add_page_numbers.py            # 给PDF添加页码
├── check_template_structure.py   # 检查Word模板结构
├── company_particulars_detector.py # 检测香港查册文件
├── credit_report_detector.py     # 检测企业信用报告
├── debug_pdf_pages.py            # 调试PDF页面
├── extract_placeholders.py       # 提取Word占位符
├── image_to_pdf.py               # 图片转A4 PDF
├── keep_first_pages.py           # 保留PDF前N页
├── normalize_pdf.py              # PDF标准化
├── rpa_030_get.py                # 030生成前取任务并加工字段（RPA调用，source/API 都支持）
├── rpa_030_save.py               # 030文件上传COS并回填任务表（RPA调用）
├── qrcode.py                     # 二维码提取
├── qrcode_opencv.py              # 二维码提取（OpenCV）
├── qrcode_unicode_safe.py        # 二维码提取（Unicode安全）
├── qrcode_universal.py           # 二维码提取（通用）
├── remove_blank_pages.py         # 删除空白页
└── remove_pdf_page.py            # 删除指定页面
```

## 快速开始

### 1. 安装依赖

**Windows**:
```bash
cd python
install.bat
```

**Linux/macOS**:
```bash
cd python
chmod +x install.sh
./install.sh
```

**手动安装**:
```bash
pip install -r requirements.txt
```

### 2. 验证安装

```bash
python -c "import fitz; print('PyMuPDF installed!')"
```

## 脚本说明

### PDF处理脚本

#### 1. normalize_pdf.py - PDF标准化
将PDF标准化为A4尺寸

```bash
python normalize_pdf.py input.pdf output.pdf
```

**依赖**: PyMuPDF

#### 2. remove_pdf_page.py - 删除指定页面
删除PDF的指定页面

```bash
# 删除第4页
python remove_pdf_page.py input.pdf output.pdf 4

# 删除多页
python remove_pdf_page.py input.pdf output.pdf 3 4 5
```

**依赖**: PyMuPDF

#### 3. remove_blank_pages.py - 删除空白页
自动删除PDF中的空白页

```bash
python remove_blank_pages.py input.pdf output.pdf
```

**依赖**: PyMuPDF

#### 4. debug_pdf_pages.py - 调试PDF
显示PDF每一页的内容

```bash
python debug_pdf_pages.py input.pdf
```

**依赖**: PyMuPDF

#### 5. credit_report_detector.py - 检测企业信用报告
检测PDF是否为企业信用报告

```bash
python credit_report_detector.py input.pdf
```

**依赖**: PyMuPDF

### Word模板脚本

#### 6. extract_placeholders.py - 提取占位符
从Word模板中提取所有占位符

```bash
python extract_placeholders.py template.docx
```

**依赖**: 无（使用标准库）

#### 7. check_template_structure.py - 检查模板结构
检查Word模板的XML结构

```bash
python check_template_structure.py template.docx
```

**依赖**: 无（使用标准库）

### 图像处理脚本

#### 8. qrcode.py - 二维码提取
从PDF中提取二维码

```bash
python qrcode.py input.pdf qrcode.png 0
```

**依赖**: PyMuPDF, Pillow, opencv-python, numpy, pyzbar

**注意**: 需要系统安装zbar库

#### 9. rpa_030_get.py - 030生成前取任务并加工字段（RPA调用）

RPA 030 程序生成 030 前调用本脚本取任务：查 `TaskStatus=2 AND pdf_result IN (0,1)` 的任务（**source/API 都支持**：source 要求 `EPRRegInfoId` 非空，API 任务 `DataSource='api'` 单独放行），校验必填字段（缺失置 `pdf_result=3`）、置 `pdf_result=1`（处理中），并把字段加工为 RPA 表单格式（出生日期分解年月日、拼音姓名分解姓/名、城市/省份大写去后缀、LegalSignedFile 转为可下载完整 URL 等）。

**API 任务字段检查失败/处理异常时**调用异步结果通知接口把错误信息发给调用方（信封与 PHP AsyncResultNotifier 一致：`{code:500, msg:错误原因, data:null, bizParam}`，非 200 时 data=null、错误原因放 msg；发送失败自动重试 `CALLBACK_MAX_RETRIES`（总尝试=1+重试次数）+ `CALLBACK_RETRY_DELAY` 间隔；URL 默认 `DEFAULT_CALLBACK_URL`（test-cloud 回调地址，与 .env/es_haiya 一致），可传 `callback_url` 覆盖；通知失败不阻断主流程；本脚本无 Notify* 落库——字段检查失败已置 `pdf_result=3` 在任务行可见，落库仅 rpa_030_save 侧实现）。

**LegalSignedFile 按任务来源分流**：
- `API` 任务：字段存 `[{"fileUrl":...,"fileName":...}]` JSON，解析取 `fileUrl`（相对路径拼 `SOURCE_OSS_BASE_URL`，完整 URL 原样使用），不查 vat_db
- `SOURCE` 任务：字段存 vat_db 附件表 `F_Id`，查 `Base_AnnexesFile.F_FilePath` 并把 `G:/fileAnnexes` 前缀替换为 `https://file.usaeu.com`；查不到置空

**注意**: `vat_database` 默认 `'vat_db'`（不传时与原脚本行为一致），生产/测试环境不同库名时显式传入；两处连接均带 `charset='utf8'`。

**依赖**: pymssql

#### 10. rpa_030_save.py - 030文件上传COS并回填任务表（RPA调用）

RPA 030 程序生成 030 文件后调用本脚本：上传 COS → 回填 `EPRHaiyaProcessingTasks.pdf030_fid/pdf_result/pdf_result_url`，并按 `EPRBusinessRecordId` 清理 301/352 两套流程旧 030 文件（只保留最新一份）。

**按任务 `DataSource` 分流**：
- `SOURCE` 任务（原逻辑）：`cos_path` + 时间戳文件夹 + `bucket_name`（vat 桶）拼完整 URL；同时写 vat_db 附件表 `Base_AnnexesFile` + 更新 `EPRRegInfo.PushTaxBureauStatus=6`
- `API` 任务（公共接口受理的外部项目数据）：上传桶按 COS 桶分流（`api_bucket_name` 参数 > `API_FLOW_BUCKET_DEFAULT` 默认 usaeu-1259285998）；COS 对象键 = 文件级常量 `API_FLOW_OSS_PREFIX`（测试 `common-test/generatefile/`、正式 `common-prod/generatefile/`，部署到对应服务器保持对应环境常量）+ 当前年份 + 子目录常量 `API_FLOW_OSS_MODULE_DIR`（`es_epr_haiya`）+ 文件名，即 `{前缀}{当前年}/es_epr_haiya/{业务流水号}/{文件名}`（2026-08-31 契约 + 2026-09-02 唯一性子目录：业务流水号 = bizParam.BusinessSerialNumber（受理必填）、兜底任务ID，不含时间戳子文件夹，与 PHP 生成的海牙/APODERAMIENTO 同子目录，文件命名不变）；**只回填任务表**，不写附件表与 EPRRegInfo（API 流程不依赖 source 库）；同时把 030 相对路径 merge 进 `ResultData.file4`（含被跨流程重定向的其他 API 任务，统一契约 file4=030文件）；**030 处理完成后调用异步结果通知接口**（成功：`data.files` 文件数组 `[{url,name,type}]`，url=OSS 相对路径（不带域名，非 usaeu 桶对象完整 URL 透传），文件槽顺序 file1 盖章要求（2026-09-09 起 API 流程已上传 API 桶、为固定路径 `{prefix}es_epr_haiya/static/{文件名}`（不带年份/业务流水号）同桶 OSS 相对路径；上传失败回退时 vat 完整 URL 透传）→file2 海牙→file3 APODERAMIENTO→file4 030 非空项 + bizParam；失败：`data=null` 错误原因放 `msg`，对齐 es_haiya §13.2；URL 默认 `DEFAULT_CALLBACK_URL`（test-cloud 回调地址，与 .env/es_haiya 一致）可传 `callback_url` 覆盖；**发送失败自动重试 + 每次尝试即时落库 `Notify*` 字段**（对齐 es_haiya 2026-08-29 线上问题修复：重试链阻塞可达 55s，期间进程被杀通知痕迹也不丢；列未迁移自动跳过）；**失败置死（对齐 es_haiya fail_api_task）**：本地文件不存在或上传/回填失败时置 `pdf_result=3` 终结任务（rpa_030_get 捞取条件 `pdf_result IN (0,1)`，置 3 后不再被反复重捞）+ 通知调用方；例外：任务回填已提交（pdf_result=2）后的辅助步骤失败不回改 3，只通知异常；通知失败不影响主流程）

**依赖**: pymssql, qcloud_cos

## 依赖说明

### 核心依赖（必需）

- **PyMuPDF** (>=1.23.0) - PDF处理

### 可选依赖

- **Pillow** (>=10.0.0) - 图像处理（仅qrcode.py需要）
- **opencv-python** (>=4.8.0) - 图像处理（仅qrcode.py需要）
- **numpy** (>=1.24.0) - 数值计算（仅qrcode.py需要）
- **pyzbar** (>=0.1.9) - 二维码识别（仅qrcode.py需要）

### 最小化安装

如果不需要二维码功能，只需安装：

```bash
pip install PyMuPDF
```

## 常见问题

### Q: PyMuPDF安装失败？
A: 尝试升级pip或使用国内镜像
```bash
pip install --upgrade pip
pip install PyMuPDF -i https://pypi.tuna.tsinghua.edu.cn/simple
```

### Q: pyzbar导入错误？
A: 需要安装系统级的zbar库
- Windows: http://zbar.sourceforge.net/
- macOS: `brew install zbar`
- Linux: `sudo apt-get install libzbar0`

### Q: 如何在虚拟环境中使用？
A: 
```bash
python -m venv venv
source venv/bin/activate  # Linux/macOS
venv\Scripts\activate     # Windows
pip install -r requirements.txt
```

## 使用示例

### 示例1: 标准化PDF
```bash
python normalize_pdf.py original.pdf normalized.pdf
```

### 示例2: 删除PDF第4页
```bash
python remove_pdf_page.py input.pdf output.pdf 4
```

### 示例3: 提取Word模板占位符
```bash
python extract_placeholders.py template.docx
```

### 示例4: 检测企业信用报告
```bash
python credit_report_detector.py report.pdf
```

## 相关文档

- [PyMuPDF文档](https://pymupdf.readthedocs.io/)

## 技术支持

如果遇到问题，请检查：
1. Python版本是否>=3.8
2. 依赖包是否正确安装
3. 系统库（如zbar）是否安装

## 总结

大多数脚本只需要 **PyMuPDF** 一个依赖包，安装非常简单：

```bash
pip install PyMuPDF
```

只有二维码功能需要额外的图像处理库。
