Dokumente offline auslesen, wenn der Scan nicht hochgeladen werden darf
Arztbrief, Vertrag, Personalakte. Zehn Schritte zu einer Texterkennung, die auf Deinem Rechner bleibt, inklusive der Unterscheidung zwischen einem Werkzeug, das Zeichen verwechselt, und einem, das ganze Sachverhalte dazudichtet.
Auf Deinem Schreibtisch liegt ein Stapel gescannter Dokumente, und Du sollst etwas damit machen. Die Rechnungen des letzten Quartals sortieren, aus vierzig Verträgen die Kündigungsfristen ziehen, eine Personalakte durchsuchbar machen. Die naheliegende Bewegung wäre, den Stapel bei einem Cloud-Dienst hochzuladen. Bei genau dieser Sorte Material ist das oft die Bewegung, die Du nicht machen darfst.
Dieses Playbook zeigt den Weg, der ohne Hochladen auskommt. Es beginnt mit einer Unterscheidung, die kaum jemand erklärt und die den ganzen Rest entscheidet: Es gibt zwei völlig verschiedene Werkzeuge für das, was von außen wie eine Aufgabe aussieht. Sie machen beide Fehler, aber sie machen völlig verschiedene, und wer das nicht trennt, prüft am Ende die falsche Stelle.
Eins vorweg, weil es sonst untergeht: Dass die Werkzeuge lokal rechnen, hält die Dateien noch nicht im Haus. Der Ordner, in dem sie liegen, und das Programm, das Du dafür anklickst, entscheiden mit. Beides steht in Schritt 10.
1. Trenn zuerst die zwei Aufgaben
Ein Dokument auszulesen zerfällt in zwei Schritte, und für jeden gibt es eine eigene Sorte Werkzeug.
Der erste Schritt ist Zeichen erkennen. Aus einem Bild von Papier wird Text. Das macht eine Texterkennung, auf Englisch OCR. Sie versteht nichts von dem, was sie liest, sie ordnet Formen Buchstaben zu. Daraus folgt ihre Eigenart: Sie argumentiert nicht. Sie leitet keine Klausel her, die nicht im Papier steht, und rechnet keinen Rechnungsposten aus. Fehlerfrei ist sie deshalb nicht. Sie kann Zeichen und ganze Wörter falsch lesen, auslassen oder hinzufügen, und sie kann die Seite falsch aufteilen, sodass ein Betrag in der falschen Spalte landet. Aus einer 3 wird eine 8, aus einem großen I eine 1, und das steht dann unauffällig in der Zeile. Tesseract kann zu jedem Wort einen Konfidenzwert ausgeben. Was es damit nicht liefert, ist eine Fehlerquote: die bekommst Du nur, indem Du die Ausgabe gegen eine von Hand geprüfte Abschrift hältst.
Der zweite Schritt ist verstehen. Was ist das für ein Dokument, wo steht die Kündigungsfrist, welcher Betrag ist die Summe und welcher die Umsatzsteuer. Das macht ein Sprachmodell. Es ist deutlich klüger und hat einen anderen Fehler: Es halluziniert auf der Bedeutungsebene. Bei einem schlecht lesbaren Betrag liefert es nicht Zeichensalat, sondern eine Zahl, die in den Kontext passt, und im Zweifel eine ganze Begründung dazu.
Der Unterschied ist also nicht "fehlerfrei gegen fehleranfällig", sondern die Art des Fehlers. Die Texterkennung verunglückt beim Lesen, und was dabei herauskommt, kannst Du gegen das Papier halten. Das Sprachmodell verunglückt beim Deuten, und was dabei herauskommt, liest sich wie das Ergebnis.
Tipp: Diese eine Unterscheidung ist der Grund für dieses ganze Playbook. Bei allem, wo eine falsche Ziffer teuer wird, willst Du den Schritt sehen können, der die Zahl gelesen hat. Und Du willst jede entscheidungsrelevante Zahl trotzdem am Original prüfen.
2. Prüf, ob Du überhaupt Texterkennung brauchst
Bevor Du irgendetwas installierst, öffne das PDF und versuch, mit der Maus einen Satz zu markieren. Lässt er sich markieren und kopieren, enthält das PDF eine Textschicht, und Du brauchst vielleicht keine Texterkennung. Du brauchst dann nur ein Werkzeug, das den Text herauszieht.
Vorsicht an dieser Stelle, das ist die Falle: Markierbarer Text beweist, dass eine Textschicht da ist, nicht dass sie stimmt. Ein gescanntes Dokument kann aus dem Seitenbild plus einer unsichtbaren, fehlerhaften Textschicht bestehen, die irgendwann jemand daruntergelegt hat. Genau solche durchsuchbaren PDFs erzeugt Tesseract selbst. Kopier deshalb einmal einen Absatz heraus und vergleich ihn mit dem, was auf der Seite zu sehen ist. Passt es, ist die Schicht brauchbar. Passt es nicht, behandelst Du die Datei wie einen Scan.
Ein Punkt, über den viele Anleitungen stillschweigend springen: Tesseract liest kein PDF. Seine Eingabe sind Bilddateien, also TIFF, PNG, JPEG und Verwandte. Für gescannte PDFs brauchst Du deshalb einen Zwischenschritt.
Der bequeme Weg ist OCRmyPDF. Es geht den Umweg intern und gibt Dir am Ende ein durchsuchbares PDF zurück. Bei einer Datei mit fehlerhafter Textschicht, also dem Fall von eben, bricht es allerdings von selbst ab, und zwar mit PriorOcrFoundError: page already has text!. Dafür gibt es einen eigenen Schalter:
ocrmypdf --redo-ocr -l deu scan.pdf scan-neu.pdf
--redo-ocr sucht die versteckte Textschicht, wirft sie weg und liest neu, ohne die Seite zu rastern. Es gibt daneben --force-ocr, das jede Seite in ein Bild verwandelt und dann liest. Das ist der Holzhammer für Fälle, in denen --redo-ocr nicht durchkommt, und es kostet Dich echten Vektortext und Bildqualität. Behalt in beiden Fällen die Originaldatei.
Der andere Weg ist, die Seiten selbst zu Bildern zu rendern, wenn Du gleich mit Tesseract weiterarbeiten willst. Hier ist eine Falle eingebaut, die Dich sonst zehn Minuten kostet:
pdftoppm -r 300 -png scan.pdf seite
pdftoppm gehört zu den Poppler-Werkzeugen. Beide Angaben sind nötig, denn ohne -png schreibt es PPM-Dateien und ohne -r rendert es mit 150 Punkten pro Zoll, der Hälfte dessen, was in Schritt 6 als Untergrenze steht. Für TIFF nimmst Du -tiff statt -png. Und jetzt die Falle: Wie die Dateien am Ende heißen, hängt davon ab, wie viele Seiten das PDF hat. Bei zwei Seiten bekommst Du seite-1.png, bei zwölf Seiten seite-01.png, weil Poppler die Nummer auf die Breite der Gesamtzahl auffüllt. Ein fest getippter Dateiname geht deshalb bei jedem zweiten Stapel ins Leere. Arbeite entweder über ein Muster wie seite-*.png, oder hol Dir für einen Einzeltest genau eine Seite unter einem Namen, den Du kennst:
pdftoppm -f 1 -l 1 -singlefile -r 300 -png scan.pdf seite-1
Beachte außerdem, dass hier in jedem Fall gerastert wird: aus einer Textseite wird ein Bild, und feine Schrift verliert dabei.
Tipp: Ein gemischter Stapel ist der Normalfall. Sortier ihn einmal in "hat brauchbaren Text" und "ist Bild", bevor Du anfängst. Der erste Haufen ist in Minuten erledigt.
3. Nimm Tesseract für die Zeichenerkennung
Der etablierte offene Standard heißt Tesseract. Er wird auf GitHub unter tesseract-ocr/tesseract gepflegt, steht unter der Apache-2.0-Lizenz und läuft vollständig auf Deinem Rechner, ohne irgendetwas irgendwohin zu schicken.
Vortrainierte Sprachdaten gibt es für weit über hundert Sprachen. Installiert ist damit noch keine davon: Engine und Sprachdaten sind zwei getrennte Bestandteile, und je nach Paket bekommst Du mehrere Sprachen, nur Englisch oder gar keine. Was auf Deinem Rechner tatsächlich liegt, sagt Dir tesseract --list-langs.
Apache 2.0 ist wie MIT eine der unkomplizierten Lizenzen. Du darfst kommerziell damit arbeiten und es in eigene Abläufe einbauen, und für die reine Benutzung im Haus verlangt sie nichts von Dir. Pflichten entstehen erst, wenn Du selbst weitergibst: Dann legst Du eine Kopie der Lizenz bei, lässt die vorhandenen Hinweise stehen, kennzeichnest geänderte Dateien, und eine NOTICE-Datei reichst Du nur weiter, wenn das Werk eine mitbringt. Und die Lizenz sagt ohnehin nur, was Du mit der Software darfst. Ob Du damit in einer Kanzlei oder Praxis diese Dokumente verarbeiten darfst, ist eine andere Frage, die Datenschutz, Berufsrecht und Eure internen Freigaben beantworten, nicht Apache 2.0.
Tipp: Wenn Du nicht mit dem Terminal arbeiten willst, such nach einer grafischen Oberfläche, die Tesseract im Bauch hat. Es gibt mehrere, und sie nehmen Dir das Zusammensetzen der Befehle ab.
4. Installier das deutsche Sprachpaket, sonst fehlt es
Der häufigste Stolperstein direkt nach der Installation: Oft ist nur Englisch da. Bei einem deutschen Dokument bekommst Du dann ein Ergebnis, das aussieht, als hätte jemand mit dem Ellbogen getippt, und Du hältst das Werkzeug für schlecht.
Die Sprachdateien liegen getrennt und heißen traineddata. Für Deutsch brauchst Du deu. Auf Debian und Ubuntu heißt das Paket dazu tesseract-ocr-deu, und die drei Werkzeuge dieses Playbooks zusammen sind tesseract-ocr, tesseract-ocr-deu, poppler-utils und ocrmypdf. Die offiziellen Sprachdateien werden im Repository tesseract-ocr/tessdata gepflegt, ebenfalls unter Apache 2.0, und sind bei Google trainiert worden.
Ob Deutsch wirklich da ist, beantwortet ein Befehl, und den solltest Du ausführen, bevor Du irgendetwas anderes probierst:
tesseract --list-langs
Steht deu nicht in der Liste, fehlt das Paket, und jeder Aufruf mit -l deu bricht mit Failed loading language 'deu' ab. Das gilt genauso für OCRmyPDF: -l deu verlangt dieselbe installierte Sprachdatei.
Und jetzt die Stelle, an der die meisten hängenbleiben: Installieren allein schaltet nichts um. Ohne Angabe nimmt Tesseract eng, ganz gleich was sonst noch auf Deinem Rechner liegt. Die Sprache gehört in den Aufruf:
tesseract seite-1.png stdout -l deu
stdout schreibt das Ergebnis ins Terminal. Gibst Du statt dessen einen Namen an, ist das kein Ort neben dem Bild, sondern ein Ausgabepfad, und ein relativer Pfad landet in dem Ordner, in dem Du gerade stehst. Das ist mehr als Ordnungsliebe: Der Scan kann in Deinem geschützten Arbeitsordner liegen und der ausgelesene Klartext trotzdem im Heimatverzeichnis oder in einem synchronisierten Ordner landen. Schreib den Zielpfad deshalb aus, etwa tesseract seite-1.png /arbeit/scans/seite-1 -l deu.
Bei einem Dokument mit deutschem und englischem Teil hängst Du die zweite Sprache mit Plus an, also -l deu+eng.
Tipp: Lad nur, was im Papier wirklich vorkommt. Auswahl und Reihenfolge verändern Laufzeit und Ergebnis, und ob eine zusätzliche Sprache Dir hilft oder schadet, siehst Du erst am eigenen Material. Probier es an fünf Seiten aus, statt einer festen Regel zu folgen.
5. Wähl den passenden Datensatz, es gibt drei
Hier liegt eine Stellschraube, die viele nie finden. Von den Sprachdateien existieren drei offizielle Sätze mit unterschiedlichem Zuschnitt.
tessdata_fast ist der schnellste und der ungenaueste. tessdata liegt in der Mitte und unterstützt zusätzlich die ältere Erkennungs-Engine. tessdata_best ist der langsamste und der genaueste, und es ist der einzige Satz, der sich als Grundlage für eigenes Nachtrainieren eignet.
Für einen Stapel, den Du einmal nachts durchlaufen lässt, nimm tessdata_best. Geschwindigkeit ist dann egal, und jeder Fehler weniger spart Dir Korrekturarbeit am Morgen.
Auch hier gilt: Davon zu wissen genügt nicht. Was Dein Paketverwalter mitgebracht hat, bleibt in Benutzung, bis Du ausdrücklich woanders hinzeigst. Lad die gewünschte deu.traineddata aus dem Repository tessdata_best in einen eigenen Ordner und gib ihn im Aufruf an:
tesseract seite-1.png stdout -l deu --tessdata-dir ./tessdata_best
Ein Detail dazu, das im Alltag beißt: --tessdata-dir legt sich nicht über Deine Systeminstallation, es ersetzt sie. Tesseract sucht dann ausschließlich in diesem Ordner. Wer also oben -l deu+eng gelernt hat und hier nur deu.traineddata hineinlegt, bekommt Failed loading language 'eng' und einen Abbruch. Alle Sprachen, die Du anforderst, müssen in demselben Ordner liegen, und nachsehen kannst Du mit tesseract --list-langs --tessdata-dir ./tessdata_best.
Tipp: Die meisten Anleitungen im Netz erwähnen diese Unterscheidung nicht und Du landest beim Standardsatz. Wenn Deine Ergebnisse knapp unbrauchbar sind, ist ein Wechsel auf tessdata_best der erste Versuch, bevor Du das Werkzeug aufgibst.
6. Die Vorlage entscheidet mehr als die Einstellung
Texterkennung ist gnadenlos gegenüber schlechten Scans, und kein Datensatz gleicht das aus. Ein schief eingelegtes Blatt, ein Schatten in der Mitte, ein Foto mit dem Handy schräg von oben: All das kostet mehr Genauigkeit als jede Einstellung sie zurückholt.
Scanne gerade, mit ausreichend Auflösung und in Graustufen statt in Farbe. Als Faustregel aus der Scan-Praxis gelten 300 Punkte pro Zoll für normalen Fließtext, bei sehr kleiner Schrift mehr. Wer Papier abfotografiert, legt es flach hin und hält die Kamera parallel darüber.
Tipp: Wenn ein einzelnes Dokument partout nicht erkannt wird, während der Rest des Stapels funktioniert, liegt es fast immer an der Vorlage und fast nie an der Einstellung. Scann das eine Blatt neu, statt an den Parametern zu drehen.
7. Für alte Dokumente gibt es eine eigene Sprachdatei
Ein Detail, das im deutschsprachigen Raum überraschend oft gebraucht wird: Alles, was vor der Mitte des zwanzigsten Jahrhunderts gedruckt wurde, steht häufig in Fraktur, und die reguläre deutsche Sprachdatei scheitert daran zuverlässig. Dafür gibt es eine eigene Datei, und sie heißt deu_latf.
Achte hier auf den Namen, denn im Netz steht fast überall noch der alte. Die Datei hieß früher frk, wurde umbenannt, weil das Kürzel nie ISO-konform war, und der alte Name gilt ausdrücklich als veraltet. In den aktuellen Sätzen, auch in tessdata_best, liegt deu_latf.traineddata. Wer nach einer Anleitung von 2019 frk anfordert, bekommt deshalb im schlimmsten Fall eine Fehlermeldung über fehlende Sprachdaten und sucht sie an der falschen Stelle.
Der Unterschied ist der zwischen "unlesbar" und "brauchbar" bei Grundbuchauszügen, alten Urkunden, Kirchenbüchern und Firmenarchiven. Wer schon einmal Ahnenforschung betrieben oder eine Bestandsakte aus den Dreißigern digitalisiert hat, kennt das Problem.
Tipp: Erwarte auch mit deu_latf keine sauberen Ergebnisse bei handschriftlichen Passagen. Handschrift ist eine andere Disziplin, und Tesseract ist für Druck gebaut.
8. Erst wenn Verstehen nötig wird, kommt ein Sprachmodell dazu
Jetzt hast Du Text, aber noch keine Antwort auf "welche Verträge laufen im März aus". Dafür brauchst Du den zweiten Schritt, und der gehört einem lokalen Sprachmodell.
Für den Weg dieses Playbooks genügt ein reines Textmodell. Es bekommt den Text, den Tesseract gelesen hat, und muss das Papier nie sehen. Das ist der Normalfall und die schonendere Variante, weil ein Textmodell auf bescheidener Ausstattung noch läuft. Welche Größe zu Deinem Rechner passt, klärt Welches lokale Modell zu Deiner Hardware passt.
Modelle mit Bildverstehen, erkennbar an der Kennzeichnung als Vision-Variante oder am Kürzel VL im Namen, sind ein anderer Weg: Sie bekommen das Seitenbild direkt und machen Lesen und Verstehen in einem Zug. Das kann bei Formularen und Tabellen praktisch sein, wo die Anordnung auf der Seite Bedeutung trägt. Es kostet deutlich mehr Speicher, und es hebt die Trennung aus Schritt eins wieder auf. Welche Familien und Größen es aktuell gibt, wechselt schnell, deshalb steht hier bewusst keine Empfehlung, die in drei Monaten falsch wäre.
Tipp: Fang mit dem Textmodell an. Den Bildweg nimmst Du erst, wenn Du merkst, dass die reine Textfassung die Struktur der Seite verliert, und dann bewusst und für diese eine Sorte Dokument.
9. Kombinier beides in der richtigen Reihenfolge
Der sicherste Ablauf für alles, wo Zahlen zählen, sieht so aus. Tesseract liest die Zeichen. Der so gewonnene Text geht an das Sprachmodell, nicht das Bild. Das Modell sortiert, fasst zusammen und beantwortet Fragen, aber es liest die Beträge nicht selbst vom Papier ab.
Der Grund ist die Arbeitsteilung aus Schritt eins. Gibst Du dem Modell das Bild, macht es beides in einem Zug, und Du kannst hinterher nicht mehr unterscheiden, ob eine Zahl gelesen oder ergänzt wurde. Trennst Du die Schritte, hast Du ein Zwischenergebnis, das Du ansehen kannst.
Die Konfidenzwerte bekommst Du dabei nicht geschenkt. Die Aufrufe von oben liefern reinen Text und sonst nichts. Wenn Du sehen willst, wie sicher sich die Erkennung je Wort war, verlang die Tabellenausgabe:
tesseract seite-1.png stdout -l deu tsv
Das ergibt eine Tabelle mit einer Spalte conf und dem erkannten Wort daneben. Kleine Werte zeigen Dir, wo Du zuerst hinschauen solltest.
Tipp: Nimm die Konfidenzwerte als Sortierhilfe, nicht als Freibrief. Ein hoher Wert heißt, dass die Erkennung sich sicher war, nicht dass sie recht hatte.
10. Automatisier den Ablauf und denk an die Löschung
Ein Ordner, in den die Scans wandern, ein kleines Skript, das alles darin durchläuft und die Textdateien daneben legt. Damit wird aus dem Experiment eine Routine, die Du in sechs Monaten noch benutzt.
Bevor Du Dich darauf verlässt, lass zehn Dokumente durchlaufen und vergleich die extrahierten Angaben von Hand mit dem Original. Das ist ein Pilot, keine Abnahme. Ziehst Du zehn aus vierzig Dokumenten zufällig heraus und genau eines davon ist fehlerhaft, erwischst Du es mit einer Wahrscheinlichkeit von einem Viertel. Als Prüfung ist das wertlos, als erster Eindruck nützlich, und wer statt dessen "die ersten zehn" oder "ein paar typische" nimmt, hat nicht einmal diese Zahl. Für den Betrieb gilt deshalb die härtere Regel: Jede Zahl und jede Frist, auf die hin Du eine Entscheidung triffst, wird am Original gesehen. Der Ablauf spart Dir das Abtippen, nicht das Prüfen.
Und jetzt der Teil, der über das Versprechen dieses Playbooks entscheidet. Ein lokal rechnendes Werkzeug heißt nicht, dass die Datei lokal bleibt.
Der Ordner ist die erste Frage. Schreibtisch und Dokumente werden unter Windows von OneDrive gesichert, unter macOS von iCloud Drive, jeweils wenn die Funktion eingeschaltet ist, und sie ist es oft, ohne dass es jemand bewusst gesetzt hat. Ein Scan, der dort landet, geht bei der nächsten Synchronisierung mit. Leg den Arbeitsordner deshalb außerhalb der synchronisierten Bereiche an und sieh in den Einstellungen von OneDrive, iCloud und Dropbox nach, was wirklich gesichert wird. Denk dabei an das Backup-Programm im Hintergrund und daran, dass zwischen Scan und Textdatei noch Zwischendateien liegen.
Das Programm ist die zweite. Eine grafische Oberfläche mit Tesseract im Bauch kann trotzdem nach Aktualisierungen sehen, Nutzungsdaten senden oder einzelne Funktionen über einen Dienst anbieten. Trenn den Rechner einmal vom Netz und lass einen Stapel durchlaufen. Kommt Text heraus, weißt Du, dass der Ablauf keine Verbindung braucht. Das ist ein Funktionstest, kein Beweis: ein Programm kann eine Übertragung auch aufheben und beim nächsten Verbinden nachholen. Wenn es wirklich darauf ankommt, sperr das Programm dauerhaft für ausgehende Verbindungen oder halt den ganzen Ablauf netzgetrennt.
Dass die Dokumente Deinen Rechner nicht verlassen, ist ein echter Vorteil, weil die Übermittlung an einen Dritten entfällt. Es macht die Verarbeitung nicht automatisch zulässig. Du verarbeitest weiterhin personenbezogene Daten und brauchst weiterhin eine Rechtsgrundlage und Löschfristen, und Du solltest prüfen, ob die Verarbeitung in Euer Verarbeitungsverzeichnis gehört. Bei Personalakten und Gesundheitsdaten ist das der Regelfall, und es kommen weitere Anforderungen dazu.
Tipp: Nimm die Löschfrist gleich in den Ablauf mit auf, und zwar für alles, was dabei entsteht: Scans, Textdateien, gerenderte Zwischenbilder, temporäre Dateien. Ein Ordner mit Scans von Ausweisen, den niemand mehr braucht und den alle vergessen haben, ist genau die Sorte Altlast, die bei einer Prüfung unangenehm wird. Die saubere Trennung zwischen "bleibt im Haus" und "ist deshalb erlaubt" steht in Lokale KI und die DSGVO.
Was als nächstes
Der Zwilling zu diesem Playbook ist Gespräche offline transkribieren, also derselbe Gedanke für Ton statt Papier. Wenn Du noch gar kein lokales Modell laufen hast, fang mit Dein erstes lokales KI-Modell in 30 Minuten an. Wie Cloud-Modelle Bilder verarbeiten und warum ein zugeschnittener Ausschnitt dort besser funktioniert als ein 4K-Screenshot, erklärt Warum dein Screenshot schrumpft. Und für die Auswertung der gewonnenen Zahlen führt Zahlen und Tabellen mit KI auswerten weiter.
Quellen
Lizenz-, Sprach- und Datensatz-Angaben stammen aus der offiziellen Tesseract-Dokumentation, Stand August 2026. Die Auflösungsempfehlung ist eine Faustregel aus der Scan-Praxis und keine Vorgabe des Projekts.
- Tesseract, Hauptrepository und Lizenz: https://github.com/tesseract-ocr/tesseract
- Tesseract, unterstützte Eingabeformate: https://tesseract-ocr.github.io/tessdoc/InputFormats.html
- Tesseract, Kommandozeile inklusive Konfidenzausgabe und durchsuchbarem PDF: https://tesseract-ocr.github.io/tessdoc/Command-Line-Usage.html
- Tesseract, Fehlerquoten aus dem UNLV-Benchmark, gemessen gegen eine geprüfte Referenzabschrift: https://tesseract-ocr.github.io/tessdoc/UNLV-Testing-of-Tesseract.html
- Tesseract, wie Erkennungsfehler entstehen: https://tesseract-ocr.github.io/tessdoc/ImproveQuality.html
- tessdata, offizielle Sprachdateien: https://github.com/tesseract-ocr/tessdata
- Umbenennung von
frkzudeu_latf: https://github.com/tesseract-ocr/tessdata_fast - Übersicht der drei Datensätze und Sprachkürzel: https://tesseract-ocr.github.io/tessdoc/Data-Files.html
- OCRmyPDF, vorhandene Textschicht ersetzen: https://ocrmypdf.readthedocs.io/en/latest/cookbook.html
- pdftoppm, Format- und Auflösungsschalter: https://manpages.debian.org/testing/poppler-utils/pdftoppm.1.en.html