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
This commit is contained in:
SnapOtter
2026-07-15 03:34:24 +08:00
committed by GitHub
parent 58121f205f
commit 991c981529
409 changed files with 67151 additions and 8076 deletions
+56 -24
View File
@@ -1,31 +1,39 @@
---
description: "Wyodrębniaj tekst z obrazów za pomocą optycznego rozpoznawania znaków wspomaganego AI."
i18n_source_hash: 3d85d423b82c
description: "Wyodrębnij lokalnie tekst z obrazów za pomocą wbudowanego Tesseract lub opcjonalnego środowiska wykonawczego RapidOCR o wysokiej dokładności."
i18n_output_hash: c79924df54eb
i18n_source_hash: 0d453b49db02
i18n_provenance: human
i18n_output_hash: 41c5d748cf54
---
# OCR / Wyodrębnianie tekstu {#ocr-text-extraction}
Wyodrębniaj tekst z obrazów za pomocą optycznego rozpoznawania znaków wspomaganego AI. Obsługuje wiele języków i poziomów jakości.
Wyodrębnij tekst z obrazów bez wysyłania obrazu do usługi zewnętrznej. Wbudowana warstwa `fast` wykorzystuje Tesseract. Opcjonalne warstwy `balanced` i `best` wykorzystują RapidOCR z przypiętymi modelami PP-OCR ONNX.
<!-- korean-ocr-contract:start -->
::: info Zgodność OCR dla języka koreańskiego
Szybki OCR obsługuje `auto`, `en`, `de`, `es`, `fr`, `zh` i `ja`, ale nie język koreański (`ko`). Koreański wymaga dokładnego pakietu OCR i `balanced` lub `best`. Pakiet działa w oficjalnych kontenerach Linux amd64 i arm64, także na hostach NVIDIA, gdzie OCR nadal używa CPU. Nieobsługiwany system otrzymuje jawny błąd zgodności i nigdy po cichu nie przechodzi na `fast`. Koreański z `fast` lub starszym aliasem `tesseract` jest odrzucany przed zakolejkowaniem z `FEATURE_INCOMPATIBLE` i `fast-korean-unsupported`.
:::
<!-- korean-ocr-contract:end -->
## Punkt końcowy API {#api-endpoint}
`POST /api/v1/tools/image/ocr`
**Przetwarzanie:** Synchroniczna odpowiedź JSON. Jeśli podano `clientJobId`, postęp jest też raportowany przez SSE.
**Przetwarzanie:** OCR zawsze działa asynchronicznie. Po sprawdzeniu danych i dodaniu zadania do kolejki punkt końcowy natychmiast zwraca `202 Accepted` z `jobId`. Śledź strumień postępu SSE zadania aż do końcowego zdarzenia `complete` lub `failed`; `result` zdarzenia zakończonego powodzeniem zawiera pola OCR.
**Pakiet modeli:** `ocr` (5-6 GB)
**Dokładny pakiet OCR:** Opcjonalne środowisko wykonawcze `ocr` (około 208-234 MiB do pobrania i 409-488 MiB zainstalowanego, w zależności od celu). `fast` nie wymaga tego pakietu; instalator sprawdza dokładne rozmiary powiązane z podpisanym indeksem.
## Parametry {#parameters}
| Parametr | Typ | Wymagany | Domyślnie | Opis |
|-----------|------|----------|---------|-------------|
| file | file | Tak | - | Plik obrazu (multipart) |
| quality | string | Nie | `"balanced"` | Poziom jakości: `fast` (Tesseract), `balanced` (PaddleOCR v5), `best` (PaddleOCR VL) |
| file | file | Tak | - | Plik obrazu (wieloczęściowy), do 512 zakodowanych w MiB i dekodowanych w rozdzielczości 40 megapikseli; nadal obowiązuje niższy limit przesyłania przez operatora |
| quality | string | NIE | Dynamiczny | Poziom jakości: `fast` (Tesseract), `balanced` (RapidOCR z małymi modelami PP-OCRv6) lub `best` (średnie modele PP-OCRv6 o wyższej dokładności z kalibrowaną punktacją wariantów) |
| language | string | Nie | `"auto"` | Podpowiedź językowa: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
| enhance | boolean | Nie | `true` | Wstępnie przetwórz obraz dla lepszej dokładności OCR |
| engine | string | Nie | - | Przestarzały. Użyj `quality`. Mapuje `tesseract` na `fast`, `paddleocr` na `balanced` |
| enhance | boolean | NIE | Zależne od poziomu | Popraw lokalny kontrast przed rozpoznaniem. Fast stosuje go bezpośrednio; Zrównoważony i Najlepszy zachowują wariant tylko wtedy, gdy skalibrowana punktacja poprawia wynik. Domyślnie `true` dla `best` i `false` dla `fast`/`balanced` |
| engine | string | NIE | - | Przestarzały alias zgodności. Zamiast tego użyj `quality`. `tesseract` mapuje do `fast`; starsza wartość `paddleocr` jest odwzorowywana na `balanced`, ale nie ładuje PaddlePaddle |
Gdy pominięto `quality` i `engine`, SnapOtter wybiera najlepszy dostępny poziom w kolejności `best`, `balanced`, `fast`. Dla języka koreańskiego nigdy nie wybiera `fast`; używa `best`, następnie `balanced`, albo zwraca błąd instalacji lub zgodności dokładnego środowiska.
## Przykładowe żądanie {#example-request}
@@ -35,31 +43,55 @@ curl -X POST http://localhost:1349/api/v1/tools/image/ocr \
-F 'settings={"quality":"best","language":"en","enhance":true}'
```
## Odpowiedź (200 OK) {#response-200-ok}
## Zaakceptowana odpowiedź (202) {#accepted-response-202}
```json
{
"jobId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"filename": "document.png",
"text": "Extracted text content from the image...",
"engine": "paddleocr-vl"
"async": true
}
```
### Postęp (SSE, opcjonalnie) {#progress-sse-optional}
### Postęp i wynik (SSE) {#progress-sse-optional}
Jeśli podano pole formularza `clientJobId`, zdarzenia postępu są strumieniowane:
Połącz się z `GET /api/v1/jobs/{jobId}/progress`, używając `jobId` zwróconego w odpowiedzi `202` (lub podanego `clientJobId`). Utrzymuj strumień otwarty aż do końcowego zdarzenia `complete` lub `failed`. Pomyślna ramka końcowa zawiera wynik OCR w polu `result`:
```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"
}
}
```
event: progress
data: {"phase":"processing","stage":"Recognizing text...","percent":50}
```
Błędy przetwarzania są przekazywane w polu `error` końcowego zdarzenia `failed`; po dodaniu do kolejki nie są zwracane jako HTTP `422`.
## Uwagi {#notes}
- Wymaga zainstalowania pakietu modeli `ocr` (5-6 GB).
- OCR zwraca wyodrębniony tekst bezpośrednio, a nie adres URL do pobrania obrazu.
- Używa łańcucha awaryjnego: jeśli poziom o wyższej jakości ulegnie awarii (np. segfault PaddleOCR), automatycznie ponawia próbę z kolejnym niższym poziomem.
- Jeśli poziom zwróci pusty tekst bez awarii, również przełącza się na kolejny poziom.
- Poziomy jakości mapują się na silniki: `fast` = Tesseract, `balanced` = PaddleOCR v5, `best` = PaddleOCR VL.
- `fast` jest zawsze dostępny w obsługiwanych obrazach SnapOtter. `balanced` i `best` wymagają opcjonalnego, dokładnego pakietu OCR.
- Wbudowany Tesseract dodaje około 25 MiB do oficjalnego obrazu. Dokładny pakiet jest przechowywany w `/data/ai`, a nie wtapiany w obraz.
- Dokładny pakiet został opublikowany dla oficjalnych kontenerów Linux amd64 i arm64. Celowo korzysta z dostawcy CPU firmy ONNX Runtime, w tym na hostach NVIDIA, więc nie zależy to od bibliotek CUDA ani kompatybilności GPU. Instalacje źródłowe i prekompilowane bare-metal korzystają z Fast OCR, chyba że zapewniają własne kompatybilne środowisko wykonawcze.
- Pomyślne końcowe `result` zawiera zarówno wyodrębniony tekst w `text`, jak i artefakt `.txt` do pobrania w `downloadUrl`.
- SnapOtter honoruje wyraźnie żądany poziom. Jeśli `balanced` lub `best` jest niedostępne, API zwraca `501` z `FEATURE_NOT_INSTALLED` lub `FEATURE_INCOMPATIBLE`; nigdy po cichu nie obniża poziomu żądania do innego poziomu.
- Pomyślny pusty wynik pozostaje pustym wynikiem. Błędy w czasie wykonywania zwracają błąd zamiast ponawiania próby z aparatem o niższej jakości.
— Pomyślne końcowe `result` podaje zarówno `requestedQuality`, jak i `actualQuality`, a także wersję silnika, urządzenia, dostawcy, środowiska wykonawczego i modelu oraz wszelkie ostrzeżenia.
- Obsługuje formaty wejściowe HEIC/HEIF, RAW, TGA, PSD, EXR i HDR poprzez automatyczne dekodowanie.
- Ponadwymiarowe zakodowane wejścia zwracają `413`. Obrazy o rozdzielczości powyżej 40 megapikseli i odpowiedzi OCR przekraczające ograniczone limity wyjściowe są odrzucane zamiast częściowo przetwarzane.
+23 -9
View File
@@ -1,14 +1,20 @@
---
description: "Wyodrębnij tekst z dokumentów PDF za pomocą OCR opartego na AI."
i18n_source_hash: 1431fcba180b
description: "Wyodrębnij lokalnie tekst ze zeskanowanych plików PDF za pomocą wbudowanego Tesseract lub opcjonalnego, bardzo dokładnego środowiska wykonawczego RapidOCR."
i18n_output_hash: d4e2a591634d
i18n_source_hash: a19ba25a1ca8
i18n_provenance: human
i18n_output_hash: 7cd3408b836e
---
# PDF OCR {#pdf-ocr}
Wyodrębnij tekst z dokumentów PDF za pomocą optycznego rozpoznawania znaków (OCR) opartego na AI. Obsługuje wiele poziomów jakości i języków. Wymaga zainstalowania pakietu funkcji OCR.
Wyodrębnij tekst ze zeskanowanych dokumentów PDF strona po stronie bez wysyłania PDF do usługi zewnętrznej. Wbudowana warstwa `fast` wykorzystuje Tesseract. Opcjonalne warstwy `balanced` i `best` wykorzystują RapidOCR z przypiętymi modelami PP-OCR ONNX.
<!-- korean-ocr-contract:start -->
::: info Zgodność OCR dla języka koreańskiego
Szybki OCR obsługuje `auto`, `en`, `de`, `es`, `fr`, `zh` i `ja`, ale nie język koreański (`ko`). Koreański wymaga dokładnego pakietu OCR i `balanced` lub `best`. Pakiet działa w oficjalnych kontenerach Linux amd64 i arm64, także na hostach NVIDIA, gdzie OCR nadal używa CPU. Nieobsługiwany system otrzymuje jawny błąd zgodności i nigdy po cichu nie przechodzi na `fast`. Koreański z `fast` lub starszym aliasem `tesseract` jest odrzucany przed zakolejkowaniem z `FEATURE_INCOMPATIBLE` i `fast-korean-unsupported`.
:::
<!-- korean-ocr-contract:end -->
## API Endpoint {#api-endpoint}
`POST /api/v1/tools/pdf/ocr-pdf`
@@ -19,9 +25,14 @@ Przyjmuje dane formularza multipart z plikiem PDF oraz opcjonalnym polem JSON `s
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| quality | string | No | `"balanced"` | Poziom jakości OCR: `fast`, `balanced`, `best` |
| file | file | Tak | - | plik PDF (wieloczęściowy), zakodowany do 512 MiB; nadal obowiązuje niższy limit przesyłania przez operatora |
| quality | string | NIE | Dynamiczny | Poziom jakości OCR: `fast`, `balanced` lub `best` |
| language | string | No | `"auto"` | Język dokumentu: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
| pages | string | No | `"all"` | Wybór stron, np. `"all"`, `"1-3"`, `"1,3,5"` |
| enhance | boolean | NIE | Zależne od poziomu | Popraw lokalny kontrast przed rozpoznaniem. Fast stosuje go bezpośrednio; Zrównoważony i Najlepszy zachowują wariant tylko wtedy, gdy skalibrowana punktacja poprawia wynik. Domyślnie `true` dla `best` i `false` dla `fast`/`balanced` |
| engine | string | NIE | - | Przestarzały alias zgodności. Zamiast tego użyj `quality`. `tesseract` mapuje do `fast`; starsza wartość `paddleocr` jest odwzorowywana na `balanced`, ale nie ładuje PaddlePaddle |
Gdy pominięto `quality` i `engine`, SnapOtter wybiera najlepszy dostępny poziom w kolejności `best`, `balanced`, `fast`. Dla języka koreańskiego nigdy nie wybiera `fast`; używa `best`, następnie `balanced`, albo zwraca błąd instalacji lub zgodności dokładnego środowiska.
## Example Request {#example-request}
@@ -29,7 +40,7 @@ Przyjmuje dane formularza multipart z plikiem PDF oraz opcjonalnym polem JSON `s
curl -X POST http://localhost:1349/api/v1/tools/pdf/ocr-pdf \
-H "Authorization: Bearer si_your-api-key" \
-F "file=@scanned.pdf" \
-F 'settings={"quality": "best", "language": "en", "pages": "1-5"}'
-F 'settings={"quality": "best", "language": "en", "pages": "1-5", "enhance": true}'
```
## Example Response {#example-response}
@@ -46,8 +57,11 @@ Zwraca `202 Accepted`. Śledź postęp przez SSE pod `/api/v1/jobs/{jobId}/progr
## Notes {#notes}
- Akceptowany format wejściowy: `.pdf`.
- To narzędzie AI, które wymaga zainstalowania **pakietu funkcji OCR**. Jeśli pakiet nie jest zainstalowany, API zwraca `501 Not Implemented`.
- Poziom jakości `fast` używa lżejszego modelu do szybszego przetwarzania; `best` używa dokładniejszego modelu kosztem szybkości.
- Ustawienie języka `auto` próbuje automatycznie wykryć język dokumentu.
- `fast` jest wbudowany i dodaje około 25 MiB do oficjalnego obrazu. `balanced` i `best` wymagają opcjonalnego, dokładnego pakietu OCR (około 208-234 MiB do pobrania i 409-488 MiB zainstalowanego, w zależności od celu).
- Dokładny pakiet obsługuje Linux amd64 i arm64 i używa ONNX Runtime na CPU, w tym na hostach NVIDIA.
— Wyraźnie żądany poziom nigdy nie jest dyskretnie obniżany. Jeśli `balanced` lub `best` jest niedostępne, API zwraca `501` z `FEATURE_NOT_INSTALLED` lub `FEATURE_INCOMPATIBLE`.
- Strony PDF są rasteryzowane w wysokiej rozdzielczości przed OCR. `best` obsługuje modele średniej wielkości PP-OCRv6 o wyższej dokładności i ocenia warianty orientacji i ulepszeń, poprawiając rozpoznawanie kosztem szybkości.
- Ustawienie języka `auto` umożliwia rozpoznawanie w obrębie obsługiwanego zestawu skryptów; wyraźna wskazówka może poprawić wyniki w przypadku znanego języka dokumentu.
- Możesz wskazać konkretne strony za pomocą zakresów (`"1-3"`), list rozdzielonych przecinkami (`"1,3,5"`) lub `"all"` dla każdej strony.
- Żądanie może objąć maksymalnie 50 stron. Rasteryzowane dane tymczasowe są ograniczone do 512 MiB, a zagregowana odpowiedź UTF-8 OCR jest ograniczona do 1 000 000 bajtów; zadania przekraczające limit kończą się niepowodzeniem zamiast zwracać częściowy tekst.
- W przypadku plików PDF, które już zawierają zaznaczalny tekst, rozważ użycie szybszego narzędzia [PDF to Text](./pdf-to-text).