Install
openclaw skills install @kaarl92/sm-ocr-scannerLokale OCR für Rasterbilder (jpg, png, bmp, gif, tiff, webp) und PDF-Dateien mit dem systemeigenen tesseract-Binary. PDF-Seiten werden lokal mit pdftoppm gerastert, vorhandene PDF-Textlayer mit pdftotext gelesen. Ausgabe als Klartext, TSV mit Konfidenzwerten oder durchsuchbares PDF. Die OCR läuft ohne Netzwerkverbindung, ohne Cloud-Dienst und ohne API-Key. Nur der optionale, vom Nutzer gestartete Installer lädt Abhängigkeiten über den Paketmanager der Distribution (optional PyPI mit --allow-pip); Systempakete installiert er nur, wenn der Nutzer ihn selbst als root startet, und erst nach Bestätigung am Paketmanager. Das Paket enthält nur Text.
openclaw skills install @kaarl92/sm-ocr-scannerSprache / Language: Dieser Skill ist bewusst deutschsprachig (Zielgruppe DACH). Dokumentation, Meldungen und Default-OCR-Sprache (
deu+eng) folgen dieser Zielgruppe. An English summary follows below; every installed Tesseract language can be selected.
Local OCR for raster images (jpg, png, bmp, gif, tiff, webp) and PDFs using the system
tesseract binary. Run it with bash scripts/ocr.sh [options] <file>...; choose the OCR
language with -l eng, -l fra, etc., or $OCR_LANG (default deu+eng, because the skill
targets German-speaking users). Output: plain text, TSV with confidence values, or a
searchable PDF (-f pdf -o out.pdf).
scripts/ocr.sh uses no network, no cloud service and no API key.
It reads only the files you name and writes only to STDOUT, the --out file and a private
temporary directory.scripts/install.sh is the only component that uses the network
(distribution package manager; PyPI only with --allow-pip). It never escalates privileges
itself; system packages are installed only if you start it as root yourself, and the
package manager asks for confirmation first.tesseract, file; poppler-utils for PDFs.Extrahiert Text aus Rasterbildern und PDFs mit dem lokal installierten Tesseract-OCR.
Die OCR (scripts/ocr.sh) kontaktiert keinen externen Dienst, die Daten verlassen das
System nicht. Netzzugriff hat nur der optionale Installer, siehe unten.
Unterstützte Eingaben, geprüft über den MIME-Typ und nicht über die Dateiendung:
| Eingabe | Verarbeitung |
|---|---|
image/png, image/jpeg, image/tiff, image/bmp, image/gif, image/webp | direkt mit tesseract |
application/pdf ohne Textlayer | Seiten lokal mit pdftoppm rastern, danach tesseract |
application/pdf mit Textlayer | verlustfrei mit pdftotext, kein OCR nötig |
Alles andere, auch SVG, wird abgelehnt.
Das Paket enthält keine Binärdateien, nur Skripte und Dokumentation. Die
Sprachmodelle kommen signiert aus dem Paketmanager (tesseract-ocr-deu, -eng, -osd).
Ohne Root-Rechte legt bash scripts/install.sh --portable sie unter assets/tessdata/ ab.
ocr.sh bindet sie von dort automatisch ein, wenn das System sie nicht mitbringt.
ocr.sh installiert selbst nichts. Fehlt eine Abhängigkeit, bricht es mit Exit 2 ab und
nennt das passende Paket.
Vollständige Erklärung dessen, was scripts/ocr.sh tut. Mehr greift das Skript nicht zu.
| Bereich | Umfang |
|---|---|
| Dateien lesen | ausschließlich die als Argument übergebenen Dateien, dazu die Sprachmodelle in assets/tessdata/ und im System-tessdata |
| Dateien schreiben | STDOUT, die mit --out benannte Datei, ein privates Temp-Verzeichnis (mktemp -d, Modus 700) |
| Prozesse | tesseract, file, pdfinfo, pdftotext, pdftoppm, pdfunite, optional ocrmypdf und timeout, dazu env |
| Netzwerk | keines. Das Skript enthält kein Netzwerkwerkzeug und keine URL. Der Selbsttest prüft das. |
| Rechte | keine Root-Rechte, kein sudo |
| Umgebungsvariablen | nur die im Frontmatter unter envVars deklarierten, alle optional. Keine Zugangsdaten. |
scripts/install.sh ist der einzige Teil mit Netzzugriff. Er nutzt nur den
Paketmanager der Distribution (signierte Repositories). PyPI kontaktiert er nur mit
ausdrücklichem --allow-pip.
Rechte des Installers: Er ruft selbst nie sudo auf und erhöht seine Rechte nicht.
Ohne root arbeitet er immer portabel, also ohne Systemänderung. Systempakete installiert er
nur, wenn der Nutzer ihn bewusst als root startet. Auch dann zeigt der Paketmanager die
Pakete und wartet auf Bestätigung. Ohne Terminal bricht die Systeminstallation ab.
Vorab erlaubte Werkzeuge (allowed-tools im Frontmatter): nur bash scripts/ocr.sh,
bash scripts/selftest.sh und Read. scripts/install.sh fehlt dort bewusst, damit jeder
Aufruf die normale Rückfrage des Agenten auslöst.
scripts/install.sh nur auf ausdrücklichen
Wunsch des Nutzers auf, und dann nur ohne root (--portable oder --dry-run). Die
Systeminstallation als root führt der Nutzer selbst in seinem Terminal aus. Setze
--allow-pip nie eigenmächtig ein.--out nur mit einem Ziel, das der Nutzer genannt hat.
--overwrite nur, wenn er es verlangt.-l ausdrücklich,
zum Beispiel -l fra. Der Default deu+eng gilt nur, wenn nichts bekannt ist.# Variante A - systemweit: der Nutzer startet selbst als root, der Paketmanager fragt nach
sudo bash scripts/install.sh
# Variante B - ohne root: Sprachmodelle nach assets/tessdata (tesseract muss schon da sein)
bash scripts/install.sh --portable
# Variante B mit ocrmypdf aus PyPI nach ~/.local (ausdrückliche Freigabe)
bash scripts/install.sh --portable --allow-pip
# vorher ansehen, was passieren würde
bash scripts/install.sh --dry-run
# weitere Sprachen
sudo bash scripts/install.sh --lang "deu eng fra ita"
Der Installer erkennt apt, dnf, yum, zypper, pacman, apk und brew.
Er ist idempotent und prüft am Ende die Umgebung. Danach:
bash scripts/ocr.sh --check # Abhängigkeiten, Sprachmodelle, Grenzen anzeigen
bash scripts/selftest.sh # Funktionstest mit synthetischen Daten
| Paket | Zweck | Pflicht |
|---|---|---|
bash ≥ 4.4 | Skriptumgebung (mapfile, leere Arrays unter set -u) | ja. Ältere Versionen werden mit Exit 2 abgewiesen |
tesseract-ocr | OCR-Engine | ja |
file | MIME-Typerkennung | ja |
tesseract-ocr-deu / -eng | Sprachmodelle | mindestens eines. Für den Default deu+eng beide |
tesseract-ocr-osd | Orientierungserkennung für --psm 0/1 | nur dafür. Unter Debian/Ubuntu Abhängigkeit von tesseract-ocr |
poppler-utils (pdfinfo, pdftoppm, pdftotext, pdfunite) | PDF-Verarbeitung | nur für PDF |
coreutils (timeout) | Zeitlimit je Seite | empfohlen |
ghostscript + ocrmypdf | bevorzugter Weg für durchsuchbare PDFs | optional |
tesseract lässt sich ohne Root-Rechte nicht nachrüsten. Dafür ist einmalig
sudo apt install tesseract-ocr poppler-utils nötig.
bash scripts/ocr.sh [OPTIONEN] <datei> [<datei> ...]
Aufruf immer über bash. Pakete von ClawHub kommen ohne Unix-Ausführungsrechte an,
ein direkter Aufruf scripts/ocr.sh scheitert dann mit Permission denied.
| Option | Bedeutung | Default |
|---|---|---|
-l, --lang <code> | Sprache(n), z. B. deu, eng, deu+eng | deu+eng ($OCR_LANG) |
-r, --dpi <zahl> | Rasterauflösung für PDF-Seiten, 70–1200 | 300 ($OCR_DPI) |
--psm <0-13> | Page Segmentation Mode | 3 ($OCR_PSM) |
--oem <0-3> | OCR Engine Mode | 3 ($OCR_OEM) |
-f, --format <fmt> | txt | pdf (durchsuchbar) | tsv | txt |
-o, --out <datei> | Ausgabedatei statt STDOUT | — |
--overwrite | vorhandene Ausgabedatei überschreiben | aus |
--force-ocr | PDFs mit vorhandenem Textlayer trotzdem rastern | aus |
--max-pages <n> | höchstens n Seiten je PDF, 1–10000 | 200 ($OCR_MAX_PAGES) |
--timeout <s> | Zeitlimit je Seite in Sekunden, 0 = aus | 300 ($OCR_TIMEOUT) |
--check | Umgebung prüfen und beenden | — |
-q, --quiet | Hinweise zu temporären Dateien unterdrücken | aus |
-v, --verbose | Diagnose auf STDERR | aus |
# Einzelnes Bild, deutsche Schrift
bash scripts/ocr.sh -l deu rechnung.png
# Gescanntes PDF -> Klartext in Datei
bash scripts/ocr.sh -l deu -o rechnung.txt scan.pdf
# Gescanntes PDF -> durchsuchbares PDF (Textlayer wird eingebettet)
bash scripts/ocr.sh -l deu -f pdf -o scan_ocr.pdf scan.pdf
# Mehrere ausdrücklich genannte Bilder, Ergebnis gesammelt
bash scripts/ocr.sh -l deu+eng seite1.jpg seite2.jpg > alle.txt
# Sprache per Umgebungsvariable, z. B. in einem Cronjob
OCR_LANG=eng bash scripts/ocr.sh screenshot.png
# Großes Archiv-PDF: Seitengrenze bewusst anheben
bash scripts/ocr.sh -l deu --max-pages 800 archiv.pdf
# Tabellarische Ausgabe inkl. Konfidenzwerten (Qualitätsprüfung)
bash scripts/ocr.sh -f tsv -l deu scan.png | awk -F'\t' '$11!=""{print $11"\t"$12}'
Der Default deu+eng ist bewusst gewählt: Der Skill ist ein regionales Werkzeug für den
deutschsprachigen Raum. Die Zielgruppe arbeitet überwiegend mit deutschen Dokumenten,
und eng deckt die üblichen englischen Einsprengsel ab (Produktnamen, Fachbegriffe).
Aus demselben Grund sind Dokumentation und Meldungen deutsch, die Kurzfassung oben ist
englisch. Der Default ist keine
Einschränkung: Jede installierte Tesseract-Sprache lässt sich pro Aufruf mit -l oder
dauerhaft mit $OCR_LANG wählen. Fehlt ein Default-Modell, wird es mit Warnung
übersprungen. Fehlt ein ausdrücklich gewähltes Modell, endet der Lauf mit Exit 2 und
nennt das Paket, das zu installieren ist.
file --mime-type), nicht über die Dateiendung. Eine als
.png benannte PDF wird korrekt behandelt. Nur die oben gelisteten Typen werden angenommen.assets/tessdata/ über ein
Merge-Verzeichnis aus Symlinks im Temp-Verzeichnis eingebunden (TESSDATA_PREFIX). So sind
System- und Paketmodelle gemeinsam verfügbar.pdftotext -layout
ausgelesen statt neu gerastert. --force-ocr erzwingt OCR.ocrmypdf, falls installiert, sonst den Fallback
pdftoppm + tesseract … pdf + pdfunite. Das Ergebnis entsteht im Temp-Verzeichnis
und wird erst danach unter dem Namen aus --out abgelegt, und zwar exakt unter diesem Namen.pdfinfo die Seitenzahl. PDFs über
--max-pages werden abgewiesen, nicht stillschweigend gekürzt. Jeder Aufruf von tesseract,
pdfinfo, pdftotext, pdftoppm, pdfunite und ocrmypdf läuft unter timeout, sofern vorhanden (je Seite --timeout Sekunden, für ganze Dokumente
das Vielfache). Das schützt vor präparierten PDFs mit Tausenden Seiten oder Endlosschleifen.mktemp -d-Verzeichnis mit Modus 700. Seitenbilder
werden nach jedem PDF sofort gelöscht, das ganze Verzeichnis über trap … EXIT bei Erfolg,
Fehler und Signal (INT, TERM, HUP). Beim Rastern steht ein Hinweis auf STDERR (-q schaltet ab).0 Erfolg, 1 Nutzungs- oder Eingabefehler (auch Seitengrenze
überschritten), 2 fehlende Abhängigkeit, 3 OCR-Fehler oder Zeitlimit, 130 Abbruch.mktemp-Verzeichnisses gelöscht, über
find -P … -delete, das keinem Symlink folgt. Ein rekursives rm kommt nicht vor.umask 077 gilt für den ganzen Lauf. Alle Ausgaben, auch durchsuchbare PDFs, und alle
Temp-Dateien sind nur für den ausführenden Benutzer lesbar.--overwrite wird über
noclobber (O_EXCL) geschrieben: Eine vorhandene Datei oder ein Symlink am Zielort wird
weder überschrieben noch verfolgt. Mit --overwrite ersetzt mv den Eintrag selbst und
schreibt nicht in ein Symlink-Ziel.-- von Optionen getrennt. Relative Dateinamen mit
führendem - bekommen ./ vorangestellt, damit kein Werkzeug sie als Option liest.
--lang ist gegen Shell-Metazeichen validiert, Zahlen sind ohne führende Null und mit
Obergrenze validiert.set -Eeuo pipefail ist aktiv. Fehler werden gemeldet und nicht verschluckt./tmp empfiehlt sich TMPDIR=/verschluesselter/pfad bash scripts/ocr.sh ….-r 400 nehmen.--psm 6, für einzelne Wörter --psm 7, für Formulare --psm 4.-l deu (Umlaute, ß), gemischte Dokumente mit -l deu+eng.-f tsv liefert pro Wort einen Konfidenzwert (Spalte 11).1.2.1 bestand das ClawHub-Audit (ClawScan clean). SkillSpector meldete noch 15 Mustertreffer,
davon 3 HIGH. Zwei davon verursachte der Selbsttest selbst: Seine Prüfungen nannten die
verbotenen Muster wörtlich.
ocr.sh, Prüfung auf
Rechte-Erhöhung und automatische Bestätigung im Installer, ASCII- und Versionsprüfung liegen
in dev/lint.sh. Das Skript ist per .clawhubignore ausgeschlossen und läuft vor jeder
Veröffentlichung lokal.ocr.sh.scripts/install.sh ist unverändert gegenüber 1.2.1.1.2.0 bestand das ClawHub-Audit (ClawScan clean, A.I.G und statische Analyse ohne Befund).
SkillSpector meldete aber 28 Mustertreffer. 1.2.1 beseitigt die behebbaren, ohne Funktion zu verlieren:
sudo-Erkennung ist
entfernt. Systempakete gibt es nur, wenn der Nutzer selbst als root startet.rm (TM1): Temp-Verzeichnisse räumt eine abgesicherte Funktion mit
find -P … -delete auf, nur innerhalb des eigenen mktemp-Verzeichnisses.~/.bashrc mehr vor.allowed-tools im Frontmatter (LP3): nur ocr.sh, selftest.sh und Read, install.sh bewusst nicht.chmod entfernt: mktemp -d legt Modus 700 ohnehin an, Modelle entstehen
per umask 027 mit Modus 640.Härtung nach dem Security-Review von ClawHub (A.I.G und NVIDIA SkillSpector):
metadata.openclaw mit os, requires.bins und allen
optionalen envVars, dazu der Abschnitt „Berechtigungen und Datenfluss“.pdftoppm und
pdftotext stehen in der Beschreibung. Angenommen werden nur noch die genannten MIME-Typen
(vorher image/*, also auch SVG).umask 077. umask 077 gilt jetzt global.<out>.pdf, wenn --out nicht auf .pdf endete.
Jetzt wird exakt unter dem angegebenen Namen geschrieben.--max-pages und --timeout als Grenzen gegen Ressourcenerschöpfung, pdfinfo
als Seitenzähler, -q/--quiet für den neuen Hinweis zu temporären Dateien.--overwrite per noclobber, Symlink-sicher. Ein Verzeichnis als
Ausgabeziel wird abgewiesen.- werden für tesseract entschärft.os: [linux]. macOS fehlt bewusst: Es liefert bash 3.2 aus, die
Skripte brauchen bash ≥ 4.4. Alle drei Skripte prüfen die Version und
brechen sonst mit Exit 2 ab. Unter macOS ist der Skill nicht getestet.grep -q am Ende einer Pipe unter pipefail konnte per SIGPIPE falsch scheitern.
Im Selbsttest war dadurch der Deutsch-Test unzuverlässig. Ersetzt durch Prüfungen ohne Pipe.install.sh --dry-run legte im portablen Modus assets/tessdata/ an. Ein Probelauf
verändert jetzt nichts mehr.bash …. Das ZIP von ClawHub
enthält keine Unix-Rechte, ein direkter Skriptaufruf scheiterte deshalb..clawhubignore). Das Paket
ist reiner Text und vollständig prüfbar. Modelle kommen signiert aus dem Paketmanager.
--psm 0/1 prüft vorab, ob osd vorhanden ist, und nennt sonst das Paket tesseract-ocr-osd.install.sh: PyPI nur noch mit --allow-pip. Der Netzzugriff ist im Skript und in
dieser Datei deklariert.600 auch
für PDF-Ausgaben, Hinweis und --quiet, SVG-Ablehnung, Zahlenvalidierung, keine
Netzwerkwerkzeuge und keine fremden Hilfsprogramme im Paket, shellcheck für alle drei Skripte.Die Versionen 1.0.x lieferten zusätzlich einen Python-Helfer mit, der Bilder an einen externen OCR-Webdienst hochlud. Er wurde mit 1.1.0 ersatzlos entfernt. Seitdem ist der Skill rein lokal.