⌨️Befehle & Praxis
Die wichtigsten Befehle rund um SANE – mit Erklärung, welcher API-Aufruf dahintersteckt, und Beispielausgaben. Alle Geräte, Hostnamen und Adressen sind erfunden (scanner.example.org, 192.0.2.x).
Alle Geräte auflisten
scanimage -L
Ruft sane_init() und sane_get_devices() auf und gibt jedes Gerät mit Namen, Hersteller, Modell und Typ aus. Den Namen in Backticks braucht man für -d.
device `test:0' is a Noname frontend-tester virtual device device `test:1' is a Noname frontend-tester virtual device device `net:scanner.example.org:test:0' is a Noname frontend-tester virtual device device `airscan:e0:Beispiel MFP 400' is a eSCL Beispiel MFP 400 ip=192.0.2.40
Geräteliste im eigenen Format
scanimage -f "%i: %d (%v %m, %t)%n"
Platzhalter: %d Gerätename, %v Hersteller, %m Modell, %t Typ, %i laufende Nummer, %n Zeilenumbruch – praktisch für Skripte.
0: test:0 (Noname frontend-tester, virtual device) 1: test:1 (Noname frontend-tester, virtual device)
USB-/SCSI-Scanner auf Hardware-Ebene suchen
sudo sane-find-scanner -q
Sucht unabhängig von den Backends nach Geräten, die wie Scanner aussehen, und zeigt Hersteller- und Produkt-ID. Findet es den Scanner, aber scanimage -L nicht, fehlt meist das Backend oder die Berechtigung. Netzwerk-Scanner findet es nicht.
found USB scanner (vendor=0x1234, product=0x5678) at libusb:001:007
Alle Optionen eines Geräts anzeigen
scanimage -d test:0 -A
Listet alle Optionen, die das Backend über sane_get_option_descriptor() meldet, mit erlaubten Werten und [Standardwert]. -l/-t sind tl-x/tl-y, -x/-y sind Breite und Höhe.
All options specific to device `test:0':
Scan Mode:
--mode Gray|Color [Gray]
--depth 1|8|16 [8]
--resolution 1..1200dpi (in steps of 1) [50]
--source Flatbed|Automatic Document Feeder [Flatbed]
…
Geometry:
-l 0..200mm (in steps of 1) [0]
-t 0..200mm (in steps of 1) [0]
-x 0..200mm (in steps of 1) [80]
-y 0..200mm (in steps of 1) [100]
(gekürzt)Farbscan mit 300 dpi als PNG
scanimage -d 'test:0' --mode Color --resolution 300 --format=png -o scan.png
Setzt mode und resolution per sane_control_option(), startet, liest bis EOF und schreibt PNG. Ohne --format gibt scanimage PNM auf die Standardausgabe aus.
Nur einen Bereich scannen
scanimage -d 'test:0' -l 10 -t 20 -x 100 -y 50 --format=tiff -o ausschnitt.tif
10 mm von links, 20 mm von oben, 100 × 50 mm groß. Beim test-Backend mit 50 dpi ergibt das 196 × 98 Pixel (abgeschnitten wie im Backend).
Fortschritt anzeigen
scanimage -d 'test:0' --resolution 600 -p --format=png -o gross.png
-p zeigt den Fortschritt in Prozent – berechnet aus den über sane_read() gelesenen Bytes im Verhältnis zu bytes_per_line × lines.
Progress: 37.4%
Stapel aus dem Einzug (ADF)
scanimage -d 'test:0' --source 'Automatic Document Feeder' --batch=seite%03d.png --format=png --resolution 300
Ruft sane_start() in einer Schleife, bis SANE_STATUS_NO_DOCS kommt, und schreibt seite001.png, seite002.png … Der Name der Quelle hängt vom Backend ab (z. B. ADF, ADF Duplex) – siehe -A. Das test-Backend meldet den Einzug nach 10 Seiten als leer.
Scanning page 1 Scanned page 1. (scanner status = 5) Scanning page 2 … Scanning page 11 scanimage: sane_start: Document feeder out of documents
Doppelseiten mit einfachem Einzug
scanimage --source ADF --batch=s%02d.png --batch-start=1 --batch-double --format=png
--batch-double zählt die Dateinummer um 2 hoch: erst alle Vorderseiten (1, 3, 5 …), dann Stapel umdrehen und mit --batch-start=2 die Rückseiten.
Ohne Einzug mehrere Seiten
scanimage --batch=seite%d.png --batch-prompt --format=png
Wartet vor jeder Seite auf die Eingabetaste – für Flachbettscanner ohne Einzug.
Backend-Test
scanimage -d test:0 -T
Führt einige Plausibilitätstests der API aus – vor allem sane_read() mit verschiedenen Puffergrößen.
saned-Server einrichten (Debian/Ubuntu)
sudo apt install sane-utils sudoedit /etc/sane.d/saned.conf # erlaubtes Netz eintragen, z. B. 192.0.2.0/24 sudo systemctl enable --now saned.socket
saned wird über die systemd-Socket-Unit gestartet: systemd lauscht auf Port 6566 und startet je Verbindung eine Instanz saned@.service als Benutzer saned. Nur Hosts/Netze aus saned.conf dürfen scannen, localhost immer.
Client auf den Server zeigen lassen
echo 'scanner.example.org' | sudo tee -a /etc/sane.d/net.conf scanimage -L
Das net-Backend (in dll.conf eingetragen) fragt alle Hosts aus net.conf bzw. SANE_NET_HOSTS. Entfernte Geräte heißen dann net:<host>:<backend>:<gerät>.
device `net:scanner.example.org:test:0' is a Noname frontend-tester virtual device
saned zum Testen im Vordergrund
sudo systemctl stop saned.socket sudo saned -l -e -d 5 -o
-l eigener Lauschmodus (ohne inetd/systemd), -e Debug auf stderr statt syslog, -d 5 Debug-Stufe, -o nach dem ersten Client beenden. Nicht dauerhaft als root laufen lassen (-u saned).
Firewall: Steuer- und Datenport
# /etc/sane.d/saned.conf
data_portrange = 10000 - 10100
sudo nft add rule inet filter input tcp dport { 6566, 10000-10100 } ip saddr 192.0.2.0/24 acceptDie Steuerung läuft über 6566/tcp, die Bilddaten über einen zweiten, dynamisch gewählten Port (Antwort auf SANE_NET_START). Hinter einer Firewall den Bereich festlegen – oder unter Linux das Modul nf_conntrack_sane nutzen.
AirScan/eSCL-Geräte im Netz suchen
airscan-discover
Werkzeug aus sane-airscan: sucht per mDNS (_uscan._tcp) und WS-Discovery und gibt fertige Zeilen für /etc/sane.d/airscan.conf aus.
[devices] "Beispiel MFP 400" = http://192.0.2.40:80/eSCL/, eSCL "Beispiel MFP 400" = http://192.0.2.40:5358/WSDScanner, WSD
mDNS-Ankündigungen ansehen
avahi-browse -rt _uscan._tcp
Zeigt eSCL-Scanner mit TXT-Einträgen (rs, cs, is, pdl …). _uscans._tcp ist die TLS-Variante.
Benutzer in die Gruppe scanner
sudo usermod -aG scanner "$USER" # danach ab- und wieder anmelden id -nG
Unter Debian/Ubuntu geben die udev-Regeln von libsane der Gruppe scanner Zugriff auf die USB-Geräte. Funktioniert scanimage -L nur mit sudo, fehlt fast immer diese Berechtigung.
benutzer adm cdrom sudo plugdev scanner
Welcher Prozess hält den Scanner?
lsusb | grep -i 1234:5678 sudo fuser -v /dev/bus/usb/001/007
Liefert sane_open() SANE_STATUS_DEVICE_BUSY, hat oft ein anderes Frontend (oder ein hängender saned) das Gerät offen.
Welche Backends lädt libsane?
SANE_DEBUG_DLL=255 scanimage -L 2>&1 | head -20
Das dll-Meta-Backend protokolliert, welche Einträge es aus dll.conf und dll.d/ liest und welche Bibliotheken es per dlopen() lädt. Stufe 255 = alles.
[sanei_debug] Setting debug level of dll to 255. [dll] sane_init: SANE dll backend version … from sane-backends … [dll] add_backend: adding backend `test' [dll] load: searching backend `test' in `/usr/lib/x86_64-linux-gnu/sane' [dll] load: trying to load `/usr/lib/x86_64-linux-gnu/sane/libsane-test.so.1' [dll] init: initializing backend `test' (gekürzt)
Ein bestimmtes Backend beobachten
SANE_DEBUG_NET=128 SANE_DEBUG_SANEI_USB=5 scanimage -L
Jedes Backend hat eine eigene Variable SANE_DEBUG_<BACKEND> (Großbuchstaben): SANE_DEBUG_PIXMA, SANE_DEBUG_GENESYS, SANE_DEBUG_ESCL … SANE_DEBUG_SANEI_USB zeigt den USB-Verkehr.
Andere Konfiguration testen
SANE_CONFIG_DIR=$HOME/sane-test: scanimage -L
Sucht Konfigurationsdateien erst im angegebenen Verzeichnis. Endet der Wert mit :, werden danach auch die Standardverzeichnisse durchsucht.
Texterkennung mit Tesseract
tesseract scan.png ergebnis -l deu tesseract scan.png ergebnis -l deu pdf
Erzeugt ergebnis.txt bzw. ein durchsuchbares ergebnis.pdf. Für OCR sind 300 dpi Graustufen ein guter Ausgangswert; Lineart verliert bei kleiner Schrift Details.
Durchsuchbares PDF aus Seitenstapel
img2pdf seite*.png -o scan.pdf ocrmypdf -l deu --deskew --rotate-pages scan.pdf scan-ocr.pdf
img2pdf bettet die Bilder verlustfrei ein, ocrmypdf legt eine unsichtbare Textebene darüber (Tesseract), richtet schiefe Seiten gerade und dreht auf dem Kopf liegende Seiten.
🩺Fehlersuche von unten nach oben
lsusb · sane-find-scanner -qscanimage -Lsudo scanimage -LSANE_DEBUG_DLL=255 scanimage -LSANE_DEBUG_<BACKEND>=5 scanimage … -o test.pngSANE_DEBUG_NET=128 scanimage -L🔤Vom Scan zum durchsuchbaren PDF
scanimage --batch=seite%03d.png --format=png --resolution 300 --mode Gray
│ seite001.png seite002.png seite003.png (je ≈ 8,3 MiB Rohdaten A4)
▼
img2pdf seite*.png -o scan.pdf Bilder verlustfrei in ein PDF
▼
ocrmypdf -l deu --deskew scan.pdf scan-ocr.pdf
│ Tesseract erkennt den Text, ocrmypdf legt ihn unsichtbar über das Bild
▼
pdftotext scan-ocr.pdf - | grep Rechnung Text ist jetzt durchsuchbar