# apizt 视觉/OCR 本地练习包

2026-10-08。所有图片为本地代码制作的虚构资料，标准答案不是模型输出。

依赖验证版本：Python 3，Pillow 12.1.1，openpyxl 3.1.5，reportlab 5.0.0；PDF逐页渲染用 PyMuPDF 1.26.4。按用途安装需要的包。生产部署前自行检查依赖许可证、更新和平台安全要求。

## 构造请求，不联网

下载图片、对应 prompt 与 growth-batch7-vision-image-message.py：

```sh
python3 growth-batch7-vision-image-message.py --protocol chat --model YOUR_CONFIRMED_VISION_MODEL --images image_A=table-input.png --prompt growth-batch7-vision-table-prompt.txt --output request.json
```

`chat` 对应 `/v1/chat/completions`，`responses` 对应 `/v1/responses`，`anthropic` 对应已确认的 Messages 端点。脚本只生成请求体，没有Key、认证头、HTTP调用或自动重试。三种输出契约不互换；apizt对应型号、通道和端点的实际支持须单独核对。

脚本的20 MiB、1600万像素与8张图是本地示例保护范围，不是模型支持上限。生成的JSON包含原始图片Base64，不要将私密素材公开上传或提交Git。

## 逐页渲染扫描PDF

```sh
python3 growth-batch7-vision-pdf-to-images.py scanned-table.pdf --dpi 144 --output rendered-pages
```

先检查PDF和每页图片，不需要Key。输出页序、SHA256、实际宽高及文字层字符数。50 MiB/20页/1600万像素为本地示例范围。扫描PDF原生上传尚未在本页承诺通过；转图后使用单独确认的视觉消息接口。

## JSON 到 XLSX

```sh
python3 growth-batch7-vision-table-to-xlsx.py growth-batch7-vision-table-expected.json --output expected-roundtrip.xlsx
```

要求六列表头与CNY契约。编号保存为字符串，金额校验使用Decimal，XLSX写入数值并用0.00显示。空白备注保持空白；不可读的必填字段高亮，算术冲突进入“待确认”。计算通过仍需对原图做逐格人工检查。脚本拒绝公式样文本、重复ID、过大输入与输出覆盖，不联网。

模型结果若没有 document_id，可以在命令中明确加 `--document-id DEMO-TABLE-001`，作为操作者提供的来源标签；工作簿记录 `provided_by_operator`。脚本不改写原始JSON，也不声称该编号由模型读取。若编号与JSON冲突则拒绝导出。

## 票据金额检查

```sh
python3 growth-batch7-vision-invoice-check.py invoice-fixture.expected.json
```

只核对明细、不含税合计、税额与总额之间的算术；不是税务规则判断、发票验真或报销审批。不能从金额平衡反推真实发票。

## 重建练习图片

```sh
python3 growth-batch7-vision-build-fixtures.py --output rebuilt-fixtures --font /path/to/your/Chinese-font.ttf
```

需要自己有权使用的中文字体文件，字体没有随包分发。扫描效果用固定噪声种子，不加入私密资料。字体不同会改变图片字形与哈希，标准字段不变。
