Vai al contenuto principale
Guida per sviluppatori

Esegui Tesseract come API
o servizio self-hosted.

Avvolgi Tesseract in un servizio HTTP con sicurezza: un endpoint FastAPI di produzione, concorrenza con pool di processi, un'immagine Docker con pacchetti lingua e health check, scalabilità e backpressure, e deployment serverless — con i compromessi di privacy e costo rispetto alle API OCR gestite.

In breve — un servizio minimo

Avvolgi la CLI o il binding pytesseract dietro HTTP. L'immagine non lascia mai la tua infrastruttura.

bash
pip install fastapi uvicorn python-multipart pytesseract pillow
# installa prima il motore + i pacchetti lingua (vedi la guida all'installazione)
uvicorn app:app --host 0.0.0.0 --port 8000

Poi chiamalo: curl -F "file=@fattura.png" "http://localhost:8000/ocr?lang=ita". Tesseract si installa secondo la guida all'installazione.

Prima le decisioni di progettazione

Tre scelte plasmano l'intero servizio.

DecisioneOpzioniIndicazione
Sincrono vs asincronoRichiesta bloccante vs coda di jobSincrono per immagini singole di pochi secondi; ID job asincroni per documenti grandi o in batch.
InputUpload multipart vs JSON base64Preferisci multipart per immagini binarie; base64 solo quando il client non può caricare file (aggiunge ~33% di dimensione).
OutputTesto semplice, JSON, hOCR/ALTO, PDF ricercabileRestituisci JSON per impostazione predefinita; offri hOCR per il layout e un URL di download PDF per gli archivi.

Una sola intenzione principale per endpoint. Mantieni /ocr per il testo e aggiungi endpoint separati per PDF e dati di layout invece di sovraccaricare una risposta.

Un servizio Python di produzione (FastAPI)

Validazione, limiti di dimensione, un timeout e OCR fuori dall'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", "ita"}

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("ita")):
    if lang not in LANGS:
        raise HTTPException(400, "Lingua non supportata")
    data = await file.read()
    if len(data) > MAX_BYTES:
        raise HTTPException(413, "File troppo grande")
    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, "Timeout OCR")
    return {"text": text, "lang": lang}

Dettagli chiave: lista bianca delle lingue, applica un limite di byte prima di decodificare, esegui l'OCR in un pool di processi e limita il tempo reale. Vedi la guida Python per l'API pytesseract completa.

Mettilo in container

Includi Tesseract e i pacchetti lingua nell'immagine così le repliche sono identiche.

Dockerfile
FROM python:3.12-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
      tesseract-ocr tesseract-ocr-eng tesseract-ocr-ita \
      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"]

Aggiungi solo i pacchetti lingua necessari per mantenere l'immagine piccola. La guida all'installazione copre Docker e la posizione di tessdata in maggiore dettaglio.

Concorrenza e scalabilità

L'OCR è intensivo di CPU: parallelizza con processi, non thread.

Sicurezza e privacy

Il self-hosting è il motivo principale per cui i team scelgono Tesseract.

Piattaforme serverless e di container

Tesseract self-hosted vs API OCR gestite

DimensioneTesseract self-hostedAPI OCR gestita
CostoInfrastruttura fissa; nessun costo per paginaPagamento per richiesta/pagina; scala con il volume
PrivacyI documenti non lasciano mai la tua reteI documenti vengono inviati a terzi
PrecisioneSolido su stampa pulita; regolabile per dominioSpesso più forte su scansioni difficili e scrittura a mano
ControlloTotale: versioni, lingue, modelli personalizzatiRoadmap e quote del fornitore
OperazioniLo gestisci tu: scalabilità, aggiornamenti, monitoraggioCompletamente gestito

Molti team self-hostano Tesseract per lavori ad alto volume e sensibili alla privacy e ricorrono a un'API gestita solo per la minoranza difficile di documenti.

FAQ API

Come eseguo Tesseract OCR come API?

Avvolgi la CLI o pytesseract in FastAPI/Flask, esponi POST /ocr e mettilo in container. Le immagini restano nella tua infrastruttura.

Thread o processi?

Processi. L'OCR è intensivo di CPU e il GIL blocca il parallelismo dei thread; usa ProcessPoolExecutor o sottoprocessi della CLI.

Un'API self-hosted è privata?

Sì: le immagini caricate sono elaborate localmente e mai inviate a terzi, a differenza delle API OCR gestite.

Può girare serverless?

Sì, su piattaforme di container come Cloud Run, immagini di container Lambda o Fly.io; attenzione agli avvii a freddo e alla dimensione dell'immagine con i pacchetti lingua.

Quali formati posso restituire?

Testo semplice, JSON con confidenza, hOCR/ALTO o un PDF ricercabile tramite URL di download.