Zum Hauptinhalt springen
Entwickler-Leitfaden

Tesseract als API betreiben
oder als selbst gehosteten Dienst.

Verpacken Sie Tesseract zuversichtlich in einen HTTP-Dienst: ein produktiver FastAPI-Endpunkt, Prozess-Pool-Konkurrenz, ein Docker-Image mit Sprachpaketen und Health-Checks, Skalierung und Backpressure sowie Serverless-Deployment — mit den Datenschutz- und Kostenvorteilen gegenüber verwalteten OCR-APIs.

TL;DR — ein minimaler Dienst

Verpacken Sie die CLI oder das pytesseract-Binding hinter HTTP. Das Bild verlässt niemals Ihre Infrastruktur.

bash
pip install fastapi uvicorn python-multipart pytesseract pillow
# installieren Sie zuerst die Engine + Sprachpakete (siehe Installationsleitfaden)
uvicorn app:app --host 0.0.0.0 --port 8000

Dann aufrufen: curl -F "file=@rechnung.png" "http://localhost:8000/ocr?lang=deu". Tesseract wird gemäß dem Installationsleitfaden installiert.

Zuerst die Designentscheidungen

Drei Entscheidungen prägen den gesamten Dienst.

EntscheidungOptionenEmpfehlung
Synchron vs. asynchronBlockierende Anfrage vs. Job-WarteschlangeSynchron für einzelne Bilder unter wenigen Sekunden; asynchrone Job-IDs für große oder gestapelte Dokumente.
EingabeMultipart-Upload vs. Base64-JSONBevorzugen Sie Multipart für Binärbilder; Base64 nur, wenn der Client keine Dateien hochladen kann (fügt ~33 % Größe hinzu).
AusgabeKlartext, JSON, hOCR/ALTO, durchsuchbares PDFStandardmäßig JSON; hOCR für Layout und eine PDF-Download-URL für Archive anbieten.

Eine primäre Absicht pro Endpunkt. Belassen Sie /ocr bei Text und fügen Sie separate Endpunkte für PDFs und Layoutdaten hinzu, statt eine Antwort zu überladen.

Ein produktiver Python-Dienst (FastAPI)

Validierung, Größenlimits, ein Timeout und OCR außerhalb der 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", "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("deu")):
    if lang not in LANGS:
        raise HTTPException(400, "Nicht unterstützte Sprache")
    data = await file.read()
    if len(data) > MAX_BYTES:
        raise HTTPException(413, "Datei zu groß")
    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-Zeitüberschreitung")
    return {"text": text, "lang": lang}

Wichtige Details: Sprachen per Allow-List, Byte-Limit vor dem Dekodieren durchsetzen, OCR in einem Prozess-Pool ausführen und die Wanduhrzeit begrenzen. Siehe Python-Leitfaden für die vollständige pytesseract-API.

In Container verpacken

Backen Sie Tesseract und die Sprachpakete ins Image, damit Replikate identisch sind.

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

Fügen Sie nur die benötigten Sprachpakete hinzu, um das Image klein zu halten. Der Installationsleitfaden behandelt Docker und die tessdata-Platzierung ausführlicher.

Konkurrenz & Skalierung

OCR ist CPU-gebunden — parallelisieren Sie mit Prozessen, nicht Threads.

Sicherheit & Datenschutz

Selbst-Hosting ist der Hauptgrund, warum Teams Tesseract wählen.

Serverless- & Container-Plattformen

Selbst gehostetes Tesseract vs. verwaltete OCR-APIs

DimensionSelbst gehostetes TesseractVerwaltete OCR-API
KostenFeste Infrastruktur; keine Gebühr pro SeiteZahlung pro Anfrage/Seite; skaliert mit dem Volumen
DatenschutzDokumente verlassen nie Ihr NetzwerkDokumente werden an Dritte gesendet
GenauigkeitStark bei sauberem Druck; pro Domäne abstimmbarOft stärker bei schwierigen Scans und Handschrift
KontrolleVollständig: Versionen, Sprachen, eigene ModelleRoadmap und Kontingente des Anbieters
BetriebSie betreiben es: Skalierung, Updates, MonitoringVollständig verwaltet

Viele Teams hosten Tesseract für volumenstarke, datenschutzsensible Arbeit selbst und greifen nur für die schwierige Minderheit der Dokumente auf eine verwaltete API zurück.

Häufige Fragen zur API

Wie betreibe ich Tesseract OCR als API?

Verpacken Sie die CLI oder pytesseract in FastAPI/Flask, stellen Sie POST /ocr bereit und containerisieren Sie es. Bilder bleiben in Ihrer Infrastruktur.

Threads oder Prozesse?

Prozesse. OCR ist CPU-gebunden und der GIL blockiert Thread-Parallelität; nutzen Sie ProcessPoolExecutor oder CLI-Subprozesse.

Ist eine selbst gehostete API privat?

Ja — hochgeladene Bilder werden lokal verarbeitet und nie an Dritte gesendet, anders als bei verwalteten OCR-APIs.

Kann es serverless laufen?

Ja, auf Container-Plattformen wie Cloud Run, Lambda-Container-Images oder Fly.io; beachten Sie Cold Starts und Image-Größe mit Sprachpaketen.

Welche Formate kann ich zurückgeben?

Klartext, JSON mit Konfidenz, hOCR/ALTO oder ein durchsuchbares PDF über eine Download-URL.