Jalankan Tesseract sebagai API
atau layanan yang dihosting sendiri.
Bungkus Tesseract dalam layanan HTTP dengan percaya diri: endpoint FastAPI produksi, konkurensi process pool, image Docker dengan paket bahasa dan health check, penskalaan dan backpressure, serta penerapan serverless — dengan trade-off privasi dan biaya dibanding API OCR terkelola.
TL;DR — layanan minimal
Bungkus CLI atau binding pytesseract di balik HTTP. Gambar tidak pernah meninggalkan infrastruktur Anda.
pip install fastapi uvicorn python-multipart pytesseract pillow
# pasang dulu mesin + paket bahasa (lihat panduan instalasi)
uvicorn app:app --host 0.0.0.0 --port 8000Lalu panggil: curl -F "file=@faktur.png" "http://localhost:8000/ocr?lang=ind". Tesseract sendiri dipasang sesuai panduan instalasi.
Keputusan desain lebih dulu
Tiga pilihan membentuk seluruh layanan.
| Keputusan | Opsi | Panduan |
|---|---|---|
| Sinkron vs asinkron | Permintaan blocking vs antrean pekerjaan | Sinkron untuk gambar tunggal dalam beberapa detik; ID pekerjaan asinkron untuk dokumen besar atau batch. |
| Input | Unggahan multipart vs JSON base64 | Utamakan multipart untuk gambar biner; base64 hanya bila klien tidak dapat mengunggah file (menambah ~33% ukuran). |
| Output | Teks biasa, JSON, hOCR/ALTO, PDF yang dapat dicari | Kembalikan JSON secara default; tawarkan hOCR untuk tata letak dan URL unduhan PDF untuk arsip. |
Satu niat utama per endpoint. Biarkan /ocr mengembalikan teks dan tambahkan endpoint terpisah untuk PDF dan data tata letak alih-alih membebani satu respons.
Layanan Python produksi (FastAPI)
Validasi, batas ukuran, timeout, dan OCR di luar event loop.
import asyncio, io
from concurrent.futures import ProcessPoolExecutor
from fastapi import FastAPI, File, UploadFile, HTTPException, Query
from PIL import Image
import pytesseract
app = FastAPI(title="Tesseract OCR API")
pool = ProcessPoolExecutor(max_workers=4)
MAX_BYTES = 10 * 1024 * 1024 # 10 MB
LANGS = {"eng", "deu", "fra", "ind"}
def _ocr(data: bytes, lang: str) -> str:
image = Image.open(io.BytesIO(data))
return pytesseract.image_to_string(image, lang=lang)
@app.get("/health")
def health():
return {"status": "ok"}
@app.post("/ocr")
async def ocr(file: UploadFile = File(...), lang: str = Query("ind")):
if lang not in LANGS:
raise HTTPException(400, "Bahasa tidak didukung")
data = await file.read()
if len(data) > MAX_BYTES:
raise HTTPException(413, "File terlalu besar")
loop = asyncio.get_running_loop()
try:
text = await asyncio.wait_for(loop.run_in_executor(pool, _ocr, data, lang), timeout=30)
except asyncio.TimeoutError:
raise HTTPException(504, "OCR melebihi batas waktu")
return {"text": text, "lang": lang}Poin penting: daftar putih bahasa, terapkan batas byte sebelum mendekode, jalankan OCR di process pool, dan batasi waktu nyata. Lihat panduan Python untuk API pytesseract lengkap.
Kontainerisasi
Bakar Tesseract dan paket bahasa ke dalam image agar replika identik.
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
tesseract-ocr tesseract-ocr-eng tesseract-ocr-ind \
libgl1 libglib2.0-0 && rm -rf /var/lib/apt/lists/*
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 8000
HEALTHCHECK CMD python -c "import urllib.request;urllib.request.urlopen('http://localhost:8000/health')"
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "2"]Tambahkan hanya paket bahasa yang diperlukan agar image tetap kecil. Panduan instalasi membahas Docker dan penempatan tessdata lebih mendalam.
Konkurensi & penskalaan
OCR terikat CPU — paralelkan dengan proses, bukan thread.
- Process pool atau subproses CLI: GIL Python membuat thread pool tidak mempercepat OCR. Gunakan
ProcessPoolExecutoratau kumpulan subprosestesseract. - Worker vs replika: jalankan beberapa worker uvicorn per kontainer dan skalakan replika secara horizontal di belakang load balancer.
- Antrean: untuk lonjakan atau dokumen panjang, terima unggahan, kembalikan ID pekerjaan, dan proses dari antrean (Celery, RQ, atau broker).
- Backpressure: batasi antrean dan tolak dengan
429saat jenuh daripada membiarkan latensi melonjak. - Batas sumber daya: tetapkan CPU/memori per worker dan setel timeout OCR agar satu gambar buruk tidak memblokir replika.
Keamanan & privasi
Self-hosting adalah alasan utama tim memilih Tesseract.
- Tidak ada data keluar: gambar tetap di dalam jaringan Anda — penting untuk dokumen hukum, medis, dan keuangan.
- Validasi input: periksa tipe MIME dan magic byte, bukan hanya ekstensi; dekode dalam try/except.
- Batasi sumber daya: ukuran unggahan maksimum, timeout per permintaan, dan batas memori terhadap bom dekompresi.
- Autentikasi: letakkan kunci API atau gateway di depan; endpoint OCR mahal untuk disalahgunakan.
- Hapus metadata: jika menyimpan file, hapus EXIF dan hapus aslinya secara berkala.
Platform serverless & kontainer
- Runtime kontainer: Cloud Run, image kontainer AWS Lambda, dan Fly.io menjalankan image Tesseract tanpa mengelola server.
- Cold start: image Tesseract dengan paket bahasa berukuran besar, jadi cold start lambat — jaga satu instance tetap hangat untuk lalu lintas yang sensitif terhadap latensi.
- Batas: naikkan memori dan timeout; timeout default yang kecil akan menghentikan dokumen besar.
- Disk sementara: tulis file sementara hanya ke
/tmp; perlakukan filesystem sebagai sekali pakai.
Tesseract self-hosted vs API OCR terkelola
| Dimensi | Tesseract self-hosted | API OCR terkelola |
|---|---|---|
| Biaya | Infrastruktur tetap; tanpa biaya per halaman | Bayar per permintaan/halaman; tumbuh dengan volume |
| Privasi | Dokumen tidak pernah meninggalkan jaringan Anda | Dokumen dikirim ke pihak ketiga |
| Akurasi | Kuat pada cetakan bersih; dapat disetel per domain | Sering lebih kuat pada pemindaian sulit dan tulisan tangan |
| Kontrol | Penuh: versi, bahasa, model khusus | Roadmap dan kuota vendor |
| Operasi | Anda menjalankannya: penskalaan, pembaruan, pemantauan | Sepenuhnya terkelola |
Banyak tim melakukan self-host Tesseract untuk pekerjaan bervolume tinggi dan sensitif privasi, dan beralih ke API terkelola hanya untuk minoritas dokumen yang sulit.
FAQ API
Bagaimana cara menjalankan Tesseract OCR sebagai API?
Bungkus CLI atau pytesseract dalam FastAPI/Flask, ekspos POST /ocr, dan kontainerisasi. Gambar tetap di infrastruktur Anda.
Thread atau proses?
Proses. OCR terikat CPU dan GIL menghalangi paralelisme thread; gunakan ProcessPoolExecutor atau subproses CLI.
Apakah API self-hosted privat?
Ya: gambar yang diunggah diproses secara lokal dan tidak pernah dikirim ke pihak ketiga, berbeda dengan API OCR terkelola.
Bisakah berjalan serverless?
Ya, di platform kontainer seperti Cloud Run, image kontainer Lambda, atau Fly.io; perhatikan cold start dan ukuran image dengan paket bahasa.
Format apa yang dapat saya kembalikan?
Teks biasa, JSON dengan keyakinan, hOCR/ALTO, atau PDF yang dapat dicari melalui URL unduhan.