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
+23 -9
View File
@@ -1,14 +1,20 @@
---
description: "Ekstrak teks dari dokumen PDF menggunakan OCR bertenaga AI."
i18n_source_hash: 1431fcba180b
description: "Ekstrak teks dari PDF yang dipindai secara lokal dengan Tesseract bawaan atau runtime RapidOCR opsional dengan akurasi tinggi."
i18n_output_hash: 773cab1835b3
i18n_source_hash: a19ba25a1ca8
i18n_provenance: human
i18n_output_hash: ec3055271630
---
# PDF OCR {#pdf-ocr}
Ekstrak teks dari dokumen PDF menggunakan pengenalan karakter optik bertenaga AI. Mendukung beberapa tingkat kualitas dan bahasa. Membutuhkan feature bundle OCR untuk terpasang.
Ekstrak teks dari dokumen PDF yang dipindai halaman demi halaman tanpa mengirim PDF ke layanan eksternal. Tingkat `fast` bawaan menggunakan Tesseract. Tingkat opsional `balanced` dan `best` menggunakan RapidOCR dengan model PP-OCR ONNX yang disematkan.
<!-- korean-ocr-contract:start -->
::: info Kompatibilitas OCR bahasa Korea
OCR Cepat mendukung `auto`, `en`, `de`, `es`, `fr`, `zh`, dan `ja`, tetapi tidak mendukung bahasa Korea (`ko`). Bahasa Korea memerlukan paket OCR Akurat dan `balanced` atau `best`. Paket berjalan pada kontainer resmi Linux amd64 dan arm64, termasuk host NVIDIA dengan OCR tetap memakai CPU. Sistem yang tidak didukung menerima kesalahan kompatibilitas yang jelas dan tidak pernah diam-diam kembali ke `fast`. Bahasa Korea dengan `fast` atau alias lama `tesseract` ditolak sebelum antre dengan `FEATURE_INCOMPATIBLE` dan `fast-korean-unsupported`.
:::
<!-- korean-ocr-contract:end -->
## API Endpoint {#api-endpoint}
`POST /api/v1/tools/pdf/ocr-pdf`
@@ -19,9 +25,14 @@ Menerima data form multipart berisi file PDF dan sebuah field JSON `settings` op
| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| quality | string | No | `"balanced"` | Tingkat kualitas OCR: `fast`, `balanced`, `best` |
| file | file | Ya | - | File PDF (multibagian), hingga 512 MiB dikodekan; batas unggah operator yang lebih rendah masih berlaku |
| quality | string | TIDAK | Dinamis | Tingkat kualitas OCR: `fast`, `balanced`, atau `best` |
| language | string | No | `"auto"` | Bahasa dokumen: `auto`, `en`, `de`, `fr`, `es`, `zh`, `ja`, `ko` |
| pages | string | No | `"all"` | Pemilihan halaman, mis. `"all"`, `"1-3"`, `"1,3,5"` |
| enhance | boolean | TIDAK | Bergantung pada tingkatan | Tingkatkan kontras lokal sebelum pengenalan. Fast menerapkannya secara langsung; Seimbang dan Terbaik mempertahankan varian hanya jika penilaian yang dikalibrasi meningkatkan hasilnya. Defaultnya adalah `true` untuk `best` dan `false` untuk `fast`/`balanced` |
| engine | string | TIDAK | - | Alias kompatibilitas yang tidak digunakan lagi. Gunakan `quality` sebagai gantinya. `tesseract` dipetakan ke `fast`; nilai `paddleocr` lama dipetakan ke `balanced` tetapi tidak memuat PaddlePaddle |
Jika `quality` dan `engine` tidak diberikan, SnapOtter memilih tingkat terbaik yang tersedia dengan urutan `best`, `balanced`, lalu `fast`. Untuk bahasa Korea, `fast` tidak pernah dipilih; sistem memakai `best`, lalu `balanced`, atau mengembalikan kesalahan instalasi maupun kompatibilitas runtime akurat.
## Example Request {#example-request}
@@ -29,7 +40,7 @@ Menerima data form multipart berisi file PDF dan sebuah field JSON `settings` op
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 @@ Mengembalikan `202 Accepted`. Lacak progres melalui SSE di `/api/v1/jobs/{jobId}
## Notes {#notes}
- Format input yang diterima: `.pdf`.
- Ini adalah alat AI yang membutuhkan **feature bundle OCR** untuk terpasang. Jika bundle tidak terpasang, API mengembalikan `501 Not Implemented`.
- Tingkat kualitas `fast` menggunakan model yang lebih ringan untuk pemrosesan lebih cepat; `best` menggunakan model yang lebih akurat dengan mengorbankan kecepatan.
- Pengaturan bahasa `auto` mencoba mendeteksi bahasa dokumen secara otomatis.
- `fast` sudah terpasang dan menambahkan sekitar 25 MiB ke gambar resmi. `balanced` dan `best` memerlukan paket OCR opsional yang akurat (sekitar 208-234 MiB untuk diunduh dan 409-488 MiB diinstal, tergantung pada targetnya).
- Paket akurat mendukung Linux amd64 dan arm64 dan menggunakan ONNX Runtime di CPU, termasuk pada host NVIDIA.
- Tingkat yang diminta secara eksplisit tidak pernah diturunkan secara diam-diam. Jika `balanced` atau `best` tidak tersedia, API mengembalikan `501` dengan `FEATURE_NOT_INSTALLED` atau `FEATURE_INCOMPATIBLE`.
- Halaman PDF diraster pada resolusi tinggi sebelum OCR. `best` menjalankan model PP-OCRv6 medium dengan akurasi lebih tinggi dan menilai varian orientasi dan peningkatan, meningkatkan pengenalan dengan mengorbankan kecepatan.
- Pengaturan bahasa `auto` memungkinkan pengenalan di seluruh kumpulan skrip yang didukung; petunjuk eksplisit dapat meningkatkan hasil untuk bahasa dokumen yang dikenal.
- Anda dapat menargetkan halaman tertentu menggunakan rentang (`"1-3"`), daftar yang dipisahkan koma (`"1,3,5"`), atau `"all"` untuk setiap halaman.
- Permintaan dapat memproses paling banyak 50 halaman. Data awal yang diraster dibatasi pada 512 MiB dan respons agregat UTF-8 OCR dibatasi pada 1.000.000 byte; pekerjaan yang melebihi batas gagal daripada mengembalikan sebagian teks.
- Untuk PDF yang sudah berisi teks yang dapat dipilih, pertimbangkan untuk menggunakan alat [PDF to Text](./pdf-to-text) yang lebih cepat.