Aller au contenu principal
Guide développeur

Exécuter Tesseract comme API
ou service auto-hébergé.

Enveloppez Tesseract dans un service HTTP en toute confiance : un endpoint FastAPI de production, une concurrence par pool de processus, une image Docker avec packs de langues et health checks, la mise à l'échelle et la contre-pression, et un déploiement serverless — avec les compromis de confidentialité et de coût face aux API OCR managées.

En bref — un service minimal

Enveloppez la CLI ou le binding pytesseract derrière HTTP. L'image ne quitte jamais votre infrastructure.

bash
pip install fastapi uvicorn python-multipart pytesseract pillow
# installez d'abord le moteur + les packs de langues (voir le guide d'installation)
uvicorn app:app --host 0.0.0.0 --port 8000

Puis appelez-le : curl -F "file=@facture.png" "http://localhost:8000/ocr?lang=fra". Tesseract s'installe selon le guide d'installation.

D'abord, les décisions de conception

Trois choix façonnent tout le service.

DécisionOptionsRecommandation
Synchrone vs asynchroneRequête bloquante vs file de tâchesSynchrone pour des images individuelles de quelques secondes ; ID de tâche asynchrones pour des documents volumineux ou par lots.
EntréeUpload multipart vs JSON base64Préférez le multipart pour les images binaires ; base64 uniquement si le client ne peut pas téléverser de fichiers (ajoute ~33 % de taille).
SortieTexte brut, JSON, hOCR/ALTO, PDF recherchableRenvoyez du JSON par défaut ; proposez hOCR pour la mise en page et une URL de téléchargement PDF pour les archives.

Une intention principale par endpoint. Gardez /ocr pour le texte et ajoutez des endpoints distincts pour les PDF et les données de mise en page.

Un service Python de production (FastAPI)

Validation, limites de taille, un timeout et l'OCR hors de la boucle d'événements.

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 Mo
LANGS = {"eng", "deu", "fra", "spa"}

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("fra")):
    if lang not in LANGS:
        raise HTTPException(400, "Langue non prise en charge")
    data = await file.read()
    if len(data) > MAX_BYTES:
        raise HTTPException(413, "Fichier trop volumineux")
    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, "Délai d'OCR dépassé")
    return {"text": text, "lang": lang}

Points clés : liste blanche de langues, appliquez une limite d'octets avant de décoder, exécutez l'OCR dans un pool de processus et bornez le temps réel. Voir le guide Python pour l'API pytesseract complète.

Conteneurisez-le

Intégrez Tesseract et les packs de langues dans l'image pour que les répliques soient identiques.

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

N'ajoutez que les packs de langues nécessaires pour garder l'image petite. Le guide d'installation couvre Docker et l'emplacement de tessdata plus en détail.

Concurrence et mise à l'échelle

L'OCR est gourmand en CPU : parallélisez avec des processus, pas des threads.

Sécurité et confidentialité

L'auto-hébergement est la principale raison pour laquelle les équipes choisissent Tesseract.

Plateformes serverless et de conteneurs

Tesseract auto-hébergé vs API OCR managées

DimensionTesseract auto-hébergéAPI OCR managée
CoûtInfrastructure fixe ; pas de frais par pagePaiement par requête/page ; évolue avec le volume
ConfidentialitéLes documents ne quittent jamais votre réseauLes documents sont envoyés à un tiers
PrécisionSolide sur l'impression nette ; ajustable par domaineSouvent plus fort sur les scans difficiles et l'écriture manuscrite
ContrôleTotal : versions, langues, modèles personnalisésFeuille de route et quotas du fournisseur
OpérationsVous l'exploitez : mise à l'échelle, mises à jour, supervisionEntièrement managé

De nombreuses équipes auto-hébergent Tesseract pour les volumes élevés et les données sensibles et ne recourent à une API managée que pour la minorité difficile de documents.

FAQ API

Comment exécuter Tesseract OCR comme API ?

Enveloppez la CLI ou pytesseract dans FastAPI/Flask, exposez POST /ocr et conteneurisez-le. Les images restent dans votre infrastructure.

Threads ou processus ?

Des processus. L'OCR est gourmand en CPU et le GIL bloque le parallélisme des threads ; utilisez ProcessPoolExecutor ou des sous-processus de la CLI.

Une API auto-hébergée est-elle privée ?

Oui : les images téléversées sont traitées localement et jamais envoyées à un tiers, contrairement aux API OCR managées.

Peut-elle tourner en serverless ?

Oui, sur des plateformes de conteneurs comme Cloud Run, les images de conteneur Lambda ou Fly.io ; attention aux démarrages à froid et à la taille de l'image avec les packs de langues.

Quels formats puis-je renvoyer ?

Texte brut, JSON avec confiance, hOCR/ALTO ou un PDF recherchable via une URL de téléchargement.