Files
SnapOtter/apps/docs/zh-CN/tools/image/ocr.md
T
SnapOtterandGitHub 991c981529 fix: make OCR portable and reliable across AMD64 and ARM64 (#519)
* fix: make OCR portable and reliable

* fix: harden OCR installation portability

* fix: pin OCR partials across downloads

* fix: make OCR execution reliably asynchronous

* fix: harden OCR portability and docs routes

* fix: preserve decoder and docs safeguards
2026-07-15 03:34:24 +08:00

98 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
description: "使用内置 Tesseract 或可选的高精度 RapidOCR 运行时从本地图像中提取文本。"
i18n_output_hash: b452e084e28a
i18n_source_hash: 0d453b49db02
i18n_provenance: human
---
# OCR / 文本提取 {#ocr-text-extraction}
从图像中提取文本,而不将图像发送到外部服务。内置 `fast` 层使用 Tesseract。可选的 `balanced``best` 层使用 RapidOCR 和固定的 PP-OCR ONNX 模型。
<!-- korean-ocr-contract:start -->
::: info 韩语 OCR 兼容性
快速 OCR 支持 `auto``en``de``es``fr``zh``ja`,但不支持韩语 (`ko`)。韩语需要精确 OCR 包以及 `balanced``best`。该包可在官方 Linux amd64 和 arm64 容器上运行;即使是 NVIDIA 主机,OCR 仍使用 CPU。不受支持的系统会返回明确的兼容性错误,绝不会静默回退到 `fast`。韩语与 `fast` 或旧版 `tesseract` 别名的组合会在入队前以 `FEATURE_INCOMPATIBLE``fast-korean-unsupported` 拒绝。
:::
<!-- korean-ocr-contract:end -->
## API 端点 {#api-endpoint}
`POST /api/v1/tools/image/ocr`
**处理:** OCR 始终异步运行。验证并加入队列后,端点会立即返回带有 `jobId``202 Accepted`。请通过作业的 SSE 进度流跟踪至最终的 `complete``failed` 事件;成功事件的 `result` 包含 OCR 字段。
**准确的 OCR 包:** 可选的 `ocr` 运行时(大约下载 208-234 MiB 并安装 409-488 MiB,具体取决于目标)。 `fast` 不需要此包;安装程序会验证签名索引所限制的确切大小。
## 参数 {#parameters}
| 参数 | 类型 | 是否必填 | 默认值 | 说明 |
|-----------|------|----------|---------|-------------|
| file | file | 是的 | - | 图像文件(多部分),最多 512 MiB 编码和 40 兆像素解码;较低的运营商上传限制仍然适用 |
| quality | string | 不 | 动态的 | 质量等级:`fast` (Tesseract)、`balanced`(带有小型 PP-OCRv6 模型的 RapidOCR)或 `best`(具有校准变量评分的更高精度中型 PP-OCRv6 模型) |
| language | string | 否 | `"auto"` | 语言提示:`auto``en``de``fr``es``zh``ja``ko` |
| enhance | boolean | 不 | 取决于层级 | 提高识别前的局部对比度。快速直接应用;仅当校准评分改善结果时,平衡和最佳才会保留变体。对于 `best` 默认为 `true`,对于 `fast`/`balanced` 默认为 `false` |
| engine | string | 不 | - | 已弃用的兼容性别名。请改用 `quality``tesseract` 映射到 `fast`;旧版 `paddleocr` 值映射到 `balanced` 但不加载 PaddlePaddle |
省略 `quality``engine` 时,SnapOtter 会按 `best``balanced``fast` 的顺序选择可用的最高质量层。韩语绝不会选择 `fast`;它会使用 `best`,其次是 `balanced`,否则返回精确运行时的安装或兼容性错误。
## 请求示例 {#example-request}
```bash
curl -X POST http://localhost:1349/api/v1/tools/image/ocr \
-F "file=@document.png" \
-F 'settings={"quality":"best","language":"en","enhance":true}'
```
## 已接受的响应(202 {#accepted-response-202}
```json
{
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"async": true
}
```
### 进度和结果(SSE {#progress-sse-optional}
使用 `202` 响应返回的 `jobId`(或已提供的 `clientJobId`)连接到 `GET /api/v1/jobs/{jobId}/progress`。请保持流连接,直至收到最终的 `complete``failed` 事件。成功的最终帧会在 `result` 中包含 OCR 输出:
```json
{
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"type": "single",
"phase": "complete",
"stage": "complete",
"percent": 100,
"result": {
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"downloadUrl": "/api/v1/download/a1b2c3d4-e5f6-7890-abcd-ef1234567890/document_ocr.txt",
"originalSize": 12345,
"processedSize": 47,
"text": "Extracted text content from the image...",
"engine": "rapidocr-onnx",
"requestedQuality": "best",
"actualQuality": "best",
"device": "cpu",
"provider": "CPUExecutionProvider",
"degraded": false,
"warnings": [],
"runtimeVersion": "2.1.0",
"modelVersion": "PP-OCRv6-best-v1-medium"
}
}
```
处理失败会通过最终 `failed` 事件的 `error` 字段传递;加入队列后不会以 HTTP `422` 响应返回。
## 说明 {#notes}
- `fast` 在支持的 SnapOtter 映像中始终可用。 `balanced``best` 需要可选的精确 OCR 包。
- 内置 Tesseract 在官方镜像上增加了约25个 MiB。准确的包存储在 `/data/ai` 中,而不是烘焙到映像中。
- 官方 Linux amd64 和 arm64 容器的准确包装已发布。 它特意使用 ONNX Runtime 的 CPU 提供程序(包括在 NVIDIA 主机上),因此它不依赖于 CUDA 库或 GPU 兼容性。 源和预构建的 bare-metal 安装使用 Fast OCR,除非它们提供自己的兼容运行时。
- 成功的最终 `result` 同时包含 `text` 中的提取文本和 `downloadUrl` 中可下载的 `.txt` 产物。
- SnapOtter 遵循明确要求的等级。如果`balanced``best`不可用,则 API 返回`501``FEATURE_NOT_INSTALLED``FEATURE_INCOMPATIBLE`;它永远不会默默地将请求降级到另一层。
- 成功的空结果仍然是空结果。运行时失败会返回错误,而不是使用较低质量的引擎重试。
- 成功的最终 `result` 会报告 `requestedQuality``actualQuality`,以及引擎、设备、提供程序、运行时和模型版本及所有警告。
- 通过自动解码支持 HEIC/HEIF、RAW、TGA、PSD、EXR 和 HDR 输入格式。
- 超大编码输入返回 `413`。超过 40 兆像素的图像和超过其有限输出限制的 OCR 响应将被拒绝,而不是部分处理。