Zum Inhalt springen

Texterkennung (OCR)

maKI erkennt Text in Bildern und PDF-Dokumenten und liefert ihn als Markdown zurück, seitenweise. Dahinter läuft PaddleOCR-VL auf der GPU-Infrastruktur der Uni Mannheim; die Dokumente verlassen das Universitätsnetz nicht.

Der Endpoint folgt dem Schema der Mistral-OCR-API. Er ist kein Chat-Endpoint: Es gibt keinen Prompt, keine Nachrichten und keine Token, sondern Dokument rein, Text raus.

EndpointPOST https://maki.uni-mannheim.de/v1/ocr
Modellpaddleocr-vl
Zugriffsgruppeocr (bei der Key-Beantragung auswählen)
EingabePNG, JPEG oder PDF, als Data-URL im Request-Body
AusgabeMarkdown je Seite

Das Bild wird Base64-kodiert als Data-URL im Feld document übergeben:

Terminal-Fenster
MAKI_API_KEY="..."
IMAGE=$(base64 -i scan.png | tr -d '\n')
curl https://maki.uni-mannheim.de/v1/ocr \
-H "Authorization: Bearer ${MAKI_API_KEY}" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"paddleocr-vl\",
\"document\": {
\"type\": \"image_url\",
\"image_url\": \"data:image/png;base64,${IMAGE}\"
}
}"

Antwort:

{
"object": "ocr",
"model": "paddleocr-vl",
"pages": [
{
"index": 0,
"markdown": "Rechnung Nr. 2026-0815\n\nUniversität Mannheim, Schloss\n\nBetrag: 1.234,56 EUR",
"images": [],
"dimensions": { "dpi": null, "height": null, "width": null }
}
],
"usage_info": { "pages_processed": 1 }
}

Für PDFs heißt der Dokumenttyp document_url. Jede Seite des PDFs wird ein Eintrag in pages, in Reihenfolge, mit index ab 0:

Terminal-Fenster
PDF=$(base64 -i protokoll.pdf | tr -d '\n')
curl https://maki.uni-mannheim.de/v1/ocr \
-H "Authorization: Bearer ${MAKI_API_KEY}" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"paddleocr-vl\",
\"document\": {
\"type\": \"document_url\",
\"document_url\": \"data:application/pdf;base64,${PDF}\"
}
}"

Der Endpoint ist im OpenAI-SDK nicht enthalten; ein einfacher HTTP-Aufruf genügt:

import base64
import requests
MAKI_API_KEY = "..."
with open("protokoll.pdf", "rb") as f:
data = base64.b64encode(f.read()).decode()
response = requests.post(
"https://maki.uni-mannheim.de/v1/ocr",
headers={"Authorization": f"Bearer {MAKI_API_KEY}"},
json={
"model": "paddleocr-vl",
"document": {
"type": "document_url",
"document_url": f"data:application/pdf;base64,{data}",
},
},
timeout=120,
)
response.raise_for_status()
for page in response.json()["pages"]:
print(f"--- Seite {page['index'] + 1} ---")
print(page["markdown"])

Für Bilder: "type": "image_url", "image_url": "data:image/png;base64,...".

  • Nur Data-URLs. Eine https://-Adresse als image_url oder document_url wird derzeit nicht abgerufen und mit HTTP 400 abgewiesen. Laden Sie das Dokument selbst und übergeben Sie es Base64-kodiert.
  • Alle Seiten. Das Feld pages zur Seitenauswahl wird noch ignoriert, ebenso include_image_base64; images bleibt leer. Die Antwort enthält immer alle Seiten des Dokuments.
  • Laufzeit. Eine Seite braucht etwa ein bis zwei Sekunden. Dokumente werden in Blöcken von zwölf Seiten verarbeitet; sehr lange PDFs teilen Sie besser vorher auf, da eine Anfrage nach 75 Sekunden abgebrochen wird.
  • Größe. Base64 vergrößert die Datei um ein Drittel. Bilder vor dem Senden auf eine sinnvolle Auflösung skalieren (Text gut lesbar, etwa 150 bis 300 dpi).
  • Kein Prompt. Wer erkannten Text weiterverarbeiten will (zusammenfassen, Felder extrahieren), schickt das Markdown in einem zweiten Schritt an ein Chat-Modell, siehe Strukturierte Ausgabe.