Kurzfassung: Unternehmensarchive, Kanzleien und Finanzinstitute verwalten oft Zehntausende PDFs — darunter born-digital-Dateien mit echter Textschicht und „Fake-PDFs" aus Scannern von 2005 (Vollbild-JPEG, kein Kopieren). Vollvolumen-OCR auf 100.000 Dateien verbrennt Geld und verarbeitet bereits durchsuchbare Dokumente erneut. Der richtige Weg: zuerst per Batch erkennen, welche PDFs wirklich OCR brauchen, dann nach Typ an lokale oder Cloud-Erkennungsengines routen.
Was „OCR nötig" bedeutet
Im Engineering-Kontext bedeutet „OCR nötig" nicht „die Datei hat Bilder":
| Zustand | Merkmale | OCR nötig? |
|---|---|---|
| Born-digital | Eingebettete Schriften, kopierbarer Text, > 100 Zeichen/Seite | Nein |
| Durchsuchbar, schlechte OCR | Textschicht vorhanden, aber fehlerhaft | Teilseiten |
| Reiner Scan | Vollbild-JPEG/TIFF pro Seite, keine Textschicht | Ja |
| Hybrid | Bild-Cover, Text im Hauptteil | Meist nein |
Kernpunkt: Erkennung geht nicht um Inhaltsverständnis, sondern um günstiges Sortieren von 100k Dateien in Skip / Partial / Full-OCR — vor jedem bezahlten API-Aufruf.
Dreistufige Erkennungspipeline
L1: Schnelle Textschicht-Sonde (< 50ms/Datei)
PyMuPDF oder pdftotext zählt druckbare Zeichen. avg_chars >= 80 → SKIP; avg_chars < 20 → OCR_REQUIRED; Grauzone → L2.
L2: Bildflächenanteil pro Seite
Für L1-Grauzone: Bildfläche / Seitenfläche. Anteil > 85 % + wenig L1-Zeichen → OCR_REQUIRED; Anteil < 30 % → SKIP; Rest → L3.
L3: Render-Stichprobe + leichtes OCR
Unsichere Dateien: nur Seite 1, Mitte, Ende rendern (3 Seiten). macOS Vision oder Tesseract. L3 betrifft nur ~5–8 % der Grauzone.
Parallele Architektur für 100.000 Dateien
Manifest-getrieben + Message Queue: S3/MinIO → manifest.jsonl → Redis/RabbitMQ → N × Worker → SQLite/Parquet.
Durchsatz (Cloud Mac mini M4, 24 GB):
| Stufe | Geschwindigkeit | 100k Dauer |
|---|---|---|
| Nur L1 | 12–18 Dateien/Sek. | ~1,5–2,5 Std. |
| L1 + L2 | 8–12 Dateien/Sek. | ~2,5–3,5 Std. |
| L1 + L2 + L3 | 6–9 Dateien/Sek. | ~3–5 Std. |
Dreistufiges Routing
| Verdict | Typischer Anteil | Aktion |
|---|---|---|
SKIP |
55–70 % | Direkt indexieren |
PARTIAL |
10–20 % | Nur Seiten mit min_chars < 20 |
OCR_REQUIRED |
15–30 % | Voll-OCR → lokales Vision oder Cloud-API |
SHA-256-Deduplizierung Pflicht. 90-Tage-Cache spart weitere 20–40 % Rechenleistung.
Tool-Auswahl
Reine PDFs: PyMuPDF + pdftotext Kreuzvalidierung. Gemischte Dokumente: Apache Tika (JVM-Overhead beachten).
Häufige Fallstricke
- Verschlüsselte PDFs →
qpdf --decryptauf Kopie - CID-Schrift-Garble → L3 Unicode-Druckbarkeitsquote
- Doppelschicht-PDF →
pdffontsprüfen - Beschädigte Dateien →
CORRUPT-Bucket - NAS-Zufalls-I/O → erst
rsyncauf lokale NVMe
Warum Cloud Mac
- tmux 24/7, Laptop zuklappen unterbricht die Queue nicht
- Apple Silicon Unified Memory: PyMuPDF 20–40 % schneller als vergleichbare x86-VPS
- Erkennen → OCR auf demselben Knoten, kein Transfer von 100k Dateien
- Compliance: Erkennung und lokales OCR auf dem Mietknoten, Cloud-API nur für komplexe Seiten
7-Schritte-Checkliste
- manifest.jsonl aus Object Storage exportieren
- poppler, qpdf, PyMuPDF auf Cloud Mac installieren
- L1-Vollerkennung → Parquet
- 200 Dateien aus PARTIAL manuell prüfen, Schwellenwerte kalibrieren
- OCR_REQUIRED → ocrmypdf-Queue; PARTIAL → seitenweises OCR
- Sidecar-JSON für RAG/ES-Indexierung
- Tägliche Inkrement-Erkennung, kein Voll-Rescan
Fazit: Mindestens die Hälfte der OCR-Kosten für 100k PDFs fließt in Dateien, die nie OCR brauchten. Sortieren Sie zuerst mit der dreistufigen Pipeline — dann lokales Vision oder Cloud Document AI. So sieht Dokumentendigitalisierung 2026 aus.
ZavCloud Developer Infrastructure
100k-PDF-Erkennung & OCR-Queues auf Cloud Mac
Dedizierter M4-Knoten, tmux 24/7-Batch, Erkennung und OCR auf einer Maschine
Tagesmiete zur Pipeline-Validierung, dann Wochen-/Monatsmiete