Lewati ke konten utama
Panduan developer

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.

bash
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 8000

Lalu 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.

KeputusanOpsiPanduan
Sinkron vs asinkronPermintaan blocking vs antrean pekerjaanSinkron untuk gambar tunggal dalam beberapa detik; ID pekerjaan asinkron untuk dokumen besar atau batch.
InputUnggahan multipart vs JSON base64Utamakan multipart untuk gambar biner; base64 hanya bila klien tidak dapat mengunggah file (menambah ~33% ukuran).
OutputTeks biasa, JSON, hOCR/ALTO, PDF yang dapat dicariKembalikan 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.

app.py
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.

Dockerfile
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.

Keamanan & privasi

Self-hosting adalah alasan utama tim memilih Tesseract.

Platform serverless & kontainer

Tesseract self-hosted vs API OCR terkelola

DimensiTesseract self-hostedAPI OCR terkelola
BiayaInfrastruktur tetap; tanpa biaya per halamanBayar per permintaan/halaman; tumbuh dengan volume
PrivasiDokumen tidak pernah meninggalkan jaringan AndaDokumen dikirim ke pihak ketiga
AkurasiKuat pada cetakan bersih; dapat disetel per domainSering lebih kuat pada pemindaian sulit dan tulisan tangan
KontrolPenuh: versi, bahasa, model khususRoadmap dan kuota vendor
OperasiAnda menjalankannya: penskalaan, pembaruan, pemantauanSepenuhnya 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.