⌨️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).

24 Befehle
Finden

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
Finden

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)
Finden

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
Finden

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)
Scannen

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.

Scannen

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).

Scannen

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%
Scannen

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
Scannen

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.

Scannen

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.

Scannen

Backend-Test

scanimage -d test:0 -T

Führt einige Plausibilitätstests der API aus – vor allem sane_read() mit verschiedenen Puffergrößen.

Netzwerk

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.

Netzwerk

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
Netzwerk

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).

Netzwerk

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 accept

Die 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.

Netzwerk

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
Netzwerk

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.

Rechte

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
Rechte

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.

Fehlersuche

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)
Fehlersuche

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.

Fehlersuche

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.

OCR

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.

OCR

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

1
Sieht die Hardware das Gerät?
lsusb · sane-find-scanner -q
nein → Kabel, Strom, anderer USB-Port; Netzwerkgerät: ping / avahi-browse
2
Kennt SANE das Gerät?
scanimage -L
nein → Backend in dll.conf aktiv? Gerät in der Liste unterstützter Geräte? Treiberlos über airscan versuchen
3
Nur mit sudo sichtbar?
sudo scanimage -L
ja → Rechte: Benutzer in Gruppe scanner, udev-Regeln, neu anmelden
4
Welches Backend lädt?
SANE_DEBUG_DLL=255 scanimage -L
Fehler beim dlopen() → Paket fehlt oder falsche Architektur (z. B. 32-Bit-Herstellertreiber)
5
Scan bricht ab?
SANE_DEBUG_<BACKEND>=5 scanimage … -o test.png
Status-Code lesen: DEVICE_BUSY (anderes Programm), IO_ERROR (USB/Netz), COVER_OPEN, JAMMED
6
Netzwerk leer?
SANE_DEBUG_NET=128 scanimage -L
Server: saned.conf enthält Client-Netz? Firewall 6566 + Datenports? Client: net.conf / SANE_NET_HOSTS

🔤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