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.
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 8000Dann 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.
| Entscheidung | Optionen | Empfehlung |
|---|---|---|
| Synchron vs. asynchron | Blockierende Anfrage vs. Job-Warteschlange | Synchron für einzelne Bilder unter wenigen Sekunden; asynchrone Job-IDs für große oder gestapelte Dokumente. |
| Eingabe | Multipart-Upload vs. Base64-JSON | Bevorzugen Sie Multipart für Binärbilder; Base64 nur, wenn der Client keine Dateien hochladen kann (fügt ~33 % Größe hinzu). |
| Ausgabe | Klartext, JSON, hOCR/ALTO, durchsuchbares PDF | Standardmäß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.
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.
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.
- Prozess-Pool oder CLI-Subprozesse: Der GIL von Python verhindert, dass ein Thread-Pool OCR beschleunigt. Verwenden Sie
ProcessPoolExecutoroder einen Pool vontesseract-Subprozessen. - Worker vs. Replikate: Führen Sie einige uvicorn-Worker pro Container aus und skalieren Sie Replikate horizontal hinter einem Load Balancer.
- Warteschlangen: Für Lastspitzen oder lange Dokumente den Upload annehmen, eine Job-ID zurückgeben und aus einer Queue verarbeiten (Celery, RQ oder ein Broker).
- Backpressure: Begrenzen Sie die Queue und lehnen Sie mit
429ab, wenn sie gesättigt ist, statt die Latenz steigen zu lassen. - Ressourcenlimits: CPU/Speicher pro Worker festlegen und ein OCR-Timeout setzen, damit ein schlechtes Bild kein Replikat blockiert.
Sicherheit & Datenschutz
Selbst-Hosting ist der Hauptgrund, warum Teams Tesseract wählen.
- Kein Datenabfluss: Bilder bleiben in Ihrem Netzwerk — wichtig für rechtliche, medizinische und finanzielle Dokumente.
- Eingabe validieren: MIME-Typ und Magic Bytes prüfen, nicht nur die Endung; in try/except dekodieren.
- Ressourcen begrenzen: maximale Upload-Größe, Timeout pro Anfrage und eine Speicherobergrenze gegen Dekompressionsbomben.
- Authentifizieren: API-Schlüssel oder Gateway davor setzen; OCR-Endpunkte sind teuer im Missbrauch.
- Metadaten entfernen: Wenn Sie Dateien speichern, EXIF entfernen und Originale regelmäßig löschen.
Serverless- & Container-Plattformen
- Container-Runtimes: Cloud Run, AWS-Lambda-Container-Images und Fly.io führen ein Tesseract-Image ohne Serververwaltung aus.
- Cold Starts: Ein Tesseract-Image mit Sprachpaketen ist groß, daher sind Cold Starts langsam — halten Sie eine Instanz für latenzempfindlichen Verkehr warm.
- Limits: Erhöhen Sie Speicher und Timeout; ein kleines Standard-Timeout beendet große Dokumente.
- Ephemerer Speicher: Schreiben Sie temporäre Dateien nur nach
/tmp; behandeln Sie das Dateisystem als wegwerfbar.
Selbst gehostetes Tesseract vs. verwaltete OCR-APIs
| Dimension | Selbst gehostetes Tesseract | Verwaltete OCR-API |
|---|---|---|
| Kosten | Feste Infrastruktur; keine Gebühr pro Seite | Zahlung pro Anfrage/Seite; skaliert mit dem Volumen |
| Datenschutz | Dokumente verlassen nie Ihr Netzwerk | Dokumente werden an Dritte gesendet |
| Genauigkeit | Stark bei sauberem Druck; pro Domäne abstimmbar | Oft stärker bei schwierigen Scans und Handschrift |
| Kontrolle | Vollständig: Versionen, Sprachen, eigene Modelle | Roadmap und Kontingente des Anbieters |
| Betrieb | Sie betreiben es: Skalierung, Updates, Monitoring | Vollstä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.