Einzugsscanner am RPI

Um wichtige Briefe immer gleich zu archivieren, habe ich mir einen alten Fujitsu fi-5110C geleistet. Der läuft nun autark an einem Raspberry PI mit SANE auf Knopfdruck.

Wahrscheinlich begleiten euch Scanner schon ähnlich lange wie mich. Irgendein Flachbett-Scanner liegt immer zu Hause, aber um ehrlich zu sein, eigentlich fotografiere ich heutzutage eher Dokumente, weil es einfach schneller geht. Da ich aber meine Dokumente in ein Dokument-Management-System überführt habe, wollte ich das nicht nur sehr schnell machen, sondern zukünftig Briefe und wichtige Papiere immer gleich als digitale Version haben. Etwas was mit den diesen beiden Lösungen einfach nicht gut funktioniert.

Von der Arbeit / Universität kennen die meisten sicherlich die professionellen Kopiermaschinen, welche ganze Papierberge kopieren bzw. scannen können. So etwas wollte ich auch, nur ohne das ganze Gefummel, was man dort an Einstellungen treffen muss. Papier rein, Scan los!

Fujitsu fi-5110C

Nach etwas Recherche zu Linux-tauglichen Einzugsscannern und etwas Glück bei eBay, hatte ich für wenig Geld diesen kompakten Dokumentscanner erstanden. Neben dem automatischen Einzug (ADF) bietet er auch die Möglichkeit beidseitig zu scannen (duplex) und braucht dafür pro Seite nur wenige Sekunden.
Am Desktop PC (Linux Mint 20) erkannte das SANE-Framework ihn gleich automatisch und man konnte etwa mit Gnome Simple Scan sofort anfangen Dokumente einzulesen.

Für den autonomen Betrieb schloss ich ihn nun an einen meiner RPIs an, wo er ebenfalls von SANE erkannt wurde. Für das auslösen des Scans nutzte ich nun das Kommandozeilen Tool scan-image, welches bei SANE mit installiert wird. Im Einfachsten Fall, etwa so

scanimage --format=tiff --mode Gray --resolution=200 > ~/Dokumente/testscan.tiff

Doch ich möchte ja eigentlich Duplex und evtl. auch mehrere Seiten nacheinander verarbeiten lassen. Dann muss natürlich auch immer ein neuer Dateiname gewählt werden. Außerdem dauert das Finden des Scanners doch schon fast 10 Sekunden und die Zeit kann man sparen, wenn man Modell und Anschluss gleich mit übergibt. Für meinen Fall ist das also:

scanimage --device=fujitsu:fi-5110Cdj:521961 --source="ADF Duplex" --format=tiff --mode Gray --resolution=200 --batch=testscan%d.tiff

Und ja, man kann seinen SANE Dienst auch im Netzwerk freigeben, so dass über das Netzwerk von anderen PCs aus darauf zugegriffen werden kann. Diese Funktionen verwende ich allerdings in meinem Szenario nicht.

Auf Knopfdruck

Getreu dem Motto „one task, one tool“, beschränkt sich SANE nur auf Funktionalität, welche das eigentliche Scannen betreffen. Auch Windows-Nutzer kennen das Problem, dass für einen Scanner oft eine eigene Anwendung in der Taskbar neben der Uhr laufen muss, damit die Taster auch die gewünschten Aktionen in Software auslösen können.

Unter Linux ergänzt diese Funktionalität scanbd, welches für verschiedenste Scanner die Tasten und Sensoren abfragen kann und dann beliebige Skripte ausführen kann. Alte Hasen kennen vielleicht noch den Vorgänger scanbuttond. Das etwas Fummelige ist an dieser Stelle das Zusammenspiel mit SANE einzurichten. So darf sich SANE nicht mehr automatisch starten und das USB Gerät blockieren, sondern stattdessen übernimmt der Manager scanbm dies. Diese Komponente prüft dann permanent den Zustand der Taster und kann entsprechend der eingestellten Regeln reagieren und z.B. dann mittels SANE einen Scan auslösen. In diesem Fall wird SANE aber lediglich der Scanner über den sog. net Treiber durchgereicht. Das USB Gerät selbst bleibt weiterhin unter exklusivem Zugriff von scanbd und wird von ihm auch angesteuert.

Trotz der wie üblich sehr guten Anleitung von ubuntuusers.de hatte ich dabei so meine Probleme. Zum einen schien sich SANE permanent trotzdem vorzudrängeln und das Gerät zu blockieren. Zum anderen hatte scanbd wohl einige Berechtigungsprobleme. Auch das unter /etc/scanbd noch einmal die komplette SANE Konfiguration gespiegelt war, verwirrte mich und bereitete Probleme, dass die richtige Konfiguration nicht gefunden wurde. Das klappte erst, als ich in /etc/scanbd/scanbd.conf noch die Zeile saned_env = {„SANE_CONFIG_DIR=/etc/scanbd“} setzte. In den action Abschnitten der Konfiguration lies ich dann immer nur ein einziges Skript aufrufen, was scan.script ist und unter /etc/scanbd/scripts liegt und dem saned Nutzer und der scanner Gruppe gehört.

#!/bin/bash

logger -t "scanbd: $0" "Begin of $SCANBD_ACTION for device $SCANBD_DEVICE"

# printout all env-variables
#/usr/bin/printenv > `mktemp -t scanbd.script.env.XXXXXXXXXX`

#scanimage --format tiff --mode Gray --resolution 300 > /home/pi/Dokumente/scans/scan.tiff

SANE_CONFIG_DIR=/etc/scanbd scanimage -d "$SCANBD_DEVICE" --source="ADF Duplex" --format=tiff --mode Gray --resolution=300 --batch="/home/pi/Dokumente/scans/scan $(date +"%Y_%m_%d_%I_%M") S%d.tiff"

logger -t "scanbd: $0" "End   of $SCANBD_ACTION for device $SCANBD_DEVICE"

Das Skript macht wenig Magisches. Es stößt per SANE den Scan und geht dabei davon aus, dass mehrere Seiten beidseitig nacheinander eingelesen werden sollen. Der jeweilige Dateiname enthält dann immer das aktuelle Datum mit Minuten-Zeitstempel, sowie die fortlaufende Seitennummer (z.B. scan 2021_03_21_01_26 S2.tiff ) Perfekt also, um später die Seiten-Scans je Dokument zu gruppieren und dennoch eindeutige Namen zu haben.

Fazit

Das Ganze läuft so wie ich es mir vorgestellt habe. Ich lege eine Seite ein, drücke den Button am Scanner und erhalte 2 Photos des Schriftstücks binnen weniger Sekunden. Das dabei auch eventuell leere Rückseiten mit gescannt werden, finde ich nicht schlimm, da ich die Bilddateien sowieso noch einmal durchsehe. Mehrseitige Dokumente stelle ich ich dann auch zu einer einzigen multipage-TIFF-Datei zusammen. Einziger Wehmuts-Tropfen ist, dass die

Der Scanner hat auch eine 7-Segment Anzeige, über die man verschiedene Scan-Modi einstellen und im Skript auch abfragen könnte. Darüber könnte man steuern, ob man wirklich doppelseitig bzw. mehrseitig scannen möchte, so dass nicht unnötig leere Bilddateien entstehen. Ich hatte schon die Idee, mit zusätzlichen Wählschaltern noch mehr Information zu erfassen, die über den Dateinamen dann in das DMS wandern sollen (z.B. Empfänger, Art des Dokuments, …). Aber um ehrlich zu sein funktioniert das so auch schon sehr gut, insbesondere dank der Texterkennung und automatischen Regeln für tags.

Author: Matthias
Betreibt dies Blog und probiert so einiges aus Technik herauszuholen. Oft mit Bezug zur Wirklichkeit, aber manchmal auch weil es eben geht ;-) Hat sich von Robotron über Basic, ASM, qC, ... soweit hochgearbeitet, dass er eigentlich gar nicht mehr so oft codet.

9 thoughts on “Einzugsscanner am RPI

  1. Hallo Matthias, danke für deinen Post, er hat mir sehr viel Input geliefert. Da dies hier die beste Anlaufstelle für mich war um per Scanbd die Tasten eines Scanner einzulesen, insbesondere eines fi-5110c, möchte ich gerne meine ausgearbeitete Anleitung teilen einen fi-5110c auf einem Proxmox Server an eine Paperless-ngx Container weiterzugeben und die Tasten des Scanner mit allerlei Funktionen auszustatten.
    Grüße
    Konrad

    # Erst alle folgenden Kommentarzeilen lesen!!!
    # Über die Shell des Proxmox Hosts Paperless-ngx installieren
    # bei „Use Default Settings?“ -> „Advanced“ wählen
    # Bei „Choose Type“ -> „0 Privilieged“ wählen
    bash -c „$(wget -qLO – https://github.com/tteck/Proxmox/raw/main/ct/paperless-ngx.sh)“

    # für den weitern Verlauf „joe“ als Editor installieren
    # „Strg + K + X“ zum speichern und schließen, „Strg + Y“ um die aktuell markierte Zeile zu löschen
    apt install -y joe

    # die Weitergabe des Scanner konfigurieren
    # Scanner suchen mit
    lsusb
    # Vendor und Device ID des Druckers notieren
    # z.B. Bus 001 Device 009: ID 04c5:1097 Fujitsu, Ltd fi-5110C
    joe /etc/udev/rules.d/99-usb-serial.rules
    # folgende Zeile anlegen, die 104 in „100104“ entspricht der Containernummer des Paperless-ngx Containers!!! (SYMLINK ist ggfl. unnötig!)
    SUBSYSTEM==“usb“, ATTRS{idVendor}==“04c5″, ATTRS{idProduct}==“1097″, SYMLINK+=“usbfi5110c“, OWNER=“100000″, GROUP=“100104″
    # Datei speichern und schließen (Strg + K + X)
    udevadm control –reload-rules
    udevadm trigger

    # für „<>“ und „<>“ Name des Proxmox Hosts und Containernummer des Paperless-ngx Containers einfügen!
    joe /etc/pve/nodes/<>/lxc/<>.conf
    # folgende Zeile anlegen (falls nicht vorhanden, sollte vorhanden sein!)
    lxc.cgroup2.devices.allow: c 189:* rwm
    # folgende Zeile anlegen, „/dev/bus/usb/001/009“ müssen um Bus und Device von oben ergänzt werden!
    # bei der Wiederholung kein Vorangestelltes „/“ !!!
    lxc.mount.entry: /dev/bus/usb/001/009 dev/bus/usb/001/009 none bind,optional,create=file
    # Datei speichern und schließen (Strg + K + X)

    # Container einmal neu starten („<>“ ist die Containernummer des Paperless-ngx Containers!)
    pct reboot <>

    # Nun per SSH im Container weitermachen
    bash -c „$(wget -qLO – https://github.com/tteck/Proxmox/raw/main/ct/paperless-ngx.sh)“
    # mit Punkt 2 Admin Passwort für Paperless-ngx anzeigen lassen!

    apt update && apt upgrade -y && apt install -y joe scanbd libtiff-tools

    # der Scanner sollte nun mit
    sane-find-scanner
    # im Container angezeigt werden

    # !OPTIONAL! mit
    scanimage –device=fujitsu:fi-5110Cdj:101197 –source=“ADF Duplex“ –format=tiff –mode Gray –resolution=150 –batch=testscan_%d.tiff
    # sollte, als Beispiel der Fujitsu fi-5110C, ein Bild, doppelseitig in Graustufen gescannt werden
    # !OPTIONAL ENDE!

    # saned Server/Client Rolle einrichten für scanbd
    cp -r /etc/sane.d /etc/scanbd/
    joe /etc/scanbd/sane.d/dll.conf
    # mindestens die Zeile „net“ löschen. Am besten alle, außer die für den Scanner benötigte (in diesem Beispiel „fujitsu“)

    joe /etc/dbus-1/system.d/scanbd_dbus.conf
    # user zu „root“ ändern!

    systemctl edit –full scanbd.service
    # Environment=SANE_CONFIG_DIR zu „/etc/scanbd/sane.d“ abändern!

    mkdir /etc/scanbd/scripts
    joe /etc/scanbd/scripts/scanning.script
    # Skriptdatei erstellen
    # Diese Scriptdatei ist für einen Fujitsu fi-5110C und Paperless-ngx in demselben Container konfiguriert. Mit der Taste „Function“ des Scanners kann man dann folgende Funktionen wählen:
    # in schwarz/weiss
    # 1) 1-seitig, 1 Seite pro Datei
    # 2) 2-seitig, 1 Seite pro Datei
    # 3) 1-seitig, eine Datei
    # 4) 2-seitig, eine Datei
    # in Farbe
    # 5) 1-seitig, 1 Seite pro Datei
    # 6) 2-seitig, 1 Seite pro Datei
    # 7) 1-seitig, eine Datei
    # 8) 2-seitig, eine Datei
    # ausserdem wird über die Taste „Scan“ in 150dpi und über die Taste „Send to“ in 300dpi gescannt!
    ### scanning.script ###

    #!/bin/bash

    case $SCANBD_ACTION in

    ’scan‘)
    DPI=“150″;;

    ‚email‘)
    DPI=“300″;;

    esac

    logger -t „scanbd: $0“ „Begin of scan for device $SCANBD_DEVICE with function $SCANBD_FUNCTION and $DPI DPI“

    case $SCANBD_FUNCTION in

    1)
    SANE_CONFIG_DIR=/etc/scanbd/sane.d scanimage -d „$SCANBD_DEVICE“ –source=“ADF Front“ –page-height 297 –format=tiff –mode Gray –resolution=$DPI –batch=“/opt/paperless/consume/scan_$(date +“%Y-%m-%d_%H-%M-%S“)_p%d.tiff“;;

    2)
    SANE_CONFIG_DIR=/etc/scanbd/sane.d scanimage -d „$SCANBD_DEVICE“ –source=“ADF Duplex“ –page-height 297 –format=tiff –mode Gray –resolution=$DPI –batch=“/opt/paperless/consume/scan_$(date +“%Y-%m-%d_%H-%M-%S“)_p%d.tiff“;;

    3)
    rm /tmp/*.tiff
    SANE_CONFIG_DIR=/etc/scanbd/sane.d scanimage -d „$SCANBD_DEVICE“ –source=“ADF Front“ –page-height 297 –format=tiff –mode Gray –resolution=$DPI –batch=“/tmp/scan_$(date +“%Y-%m-%d_%H-%M-%S“)_p%d.tiff“
    tiffcp /tmp/*.tiff „/opt/paperless/consume/scan_$(date +“%Y-%m-%d_%H-%M-%S“).tiff“;;

    4)
    rm /tmp/*.tiff
    SANE_CONFIG_DIR=/etc/scanbd/sane.d scanimage -d „$SCANBD_DEVICE“ –source=“ADF Duplex“ –page-height 297 –format=tiff –mode Gray –resolution=$DPI –batch=“/tmp/scan_$(date +“%Y-%m-%d_%H-%M-%S“)_p%d.tiff“
    tiffcp /tmp/*.tiff „/opt/paperless/consume/scan_$(date +“%Y-%m-%d_%H-%M-%S“).tiff“;;

    5)
    SANE_CONFIG_DIR=/etc/scanbd/sane.d scanimage -d „$SCANBD_DEVICE“ –source=“ADF Front“ –page-height 297 –format=tiff –mode Color –resolution=$DPI –batch=“/opt/paperless/consume/scan_$(date +“%Y-%m-%d_%H-%M-%S“)_p%d.tiff“;;

    6)
    SANE_CONFIG_DIR=/etc/scanbd/sane.d scanimage -d „$SCANBD_DEVICE“ –source=“ADF Duplex“ –page-height 297 –format=tiff –mode Color –resolution=$DPI –batch=“/opt/paperless/consume/scan_$(date +“%Y-%m-%d_%H-%M-%S“)_p%d.tiff“;;

    7)
    rm /tmp/*.tiff
    SANE_CONFIG_DIR=/etc/scanbd/sane.d scanimage -d „$SCANBD_DEVICE“ –source=“ADF Front“ –page-height 297 –format=tiff –mode Color –resolution=$DPI –batch=“/tmp/scan_$(date +“%Y-%m-%d_%H-%M-%S“)_p%d.tiff“
    tiffcp /tmp/*.tiff „/opt/paperless/consume/scan_$(date +“%Y-%m-%d_%H-%M-%S“).tiff“;;

    8)
    rm /tmp/*.tiff
    SANE_CONFIG_DIR=/etc/scanbd/sane.d scanimage -d „$SCANBD_DEVICE“ –source=“ADF Duplex“ –page-height 297 –format=tiff –mode Color –resolution=$DPI –batch=“/tmp/scan_$(date +“%Y-%m-%d_%H-%M-%S“)_p%d.tiff“
    tiffcp /tmp/*.tiff „/opt/paperless/consume/scan_$(date +“%Y-%m-%d_%H-%M-%S“).tiff“;;

    esac

    logger -t „scanbd: $0“ „End of $SCANBD_ACTION for device $SCANBD_DEVICE with function $SCANBD_FUNCTION“

    ### ENDE ###

    # Skriptdatei für alle ausführbar machen
    chmod 777 /etc/scanbd/scripts/*.script

    # scanbd konfigurieren
    joe /etc/scanbd/scanbd.conf
    # user zu „root“ ändern!

    # ganz unten in der Datei alle unnötigen „include“s auskommentieren oder löschen

    # In den „action“ Abschnitten der Konfiguration folgendes anpassen
    # (als Erklärung: bei den Tasten „Scan“ und „Send to“ bzw. „email“ wird das Skript „scanning.script“ aufgerufen)
    ### actions ###
    action scan {
    filter = „^scan.*“
    numerical-trigger {
    from-value = 1
    to-value = 0
    }
    desc = „Scan to file“
    # script must be an relative path starting from scriptdir (see above),
    # or an absolute pathname.
    # It must contain the path to the action script without arguments
    # Absolute path example: script = „/some/path/foo.script
    script = „scanning.script“
    }
    action email {
    filter = „^email$“
    string-trigger {
    from-value = „“
    to-value = „^email.*“
    }
    desc = „Scan to file in high quality“
    # script must be an relative path starting from scriptdir (see above),
    # or an absolute pathname.
    # It must contain the path to the action script without arguments
    # Absolute path example: script = „/some/path/foo.script
    script = „scanning.script“
    ### ENDE ###

    # scanbd Service neu starten
    systemctl restart scanbd.service

    ### Falls die USB DevID wechseln sollte kann man folgendes Skript per Cronjob auf dem Proxmox Host laufen lassen (ist noch nicht langzeitgeprüft! Auf eigene Gefahr!!!)
    ### Skript um USB-Zuweisung in der Containerconfig zu aktualisieren ###

    #!/bin/bash

    ### mit lsusb VEN:DEV IDs herausfinden und hier eintragen ###
    VEN=04c5
    DEV=1097
    ### hier Containernummer des Paperless-ngx Containers eintragen ###
    LXC=104

    BUSID=$(lsusb -d $VEN:$DEV | sed -e ’s/.*Bus\(.*\)Device.*/\1/‘ | sed ’s/[^0-9]*//g‘)
    DEVID=$(lsusb -d $VEN:$DEV | sed -e ’s/.*Device\(.*\)ID.*/\1/‘ | sed ’s/[^0-9]*//g‘)

    sed -i „/\/dev\/bus\/usb\//c\lxc.mount.entry: \/dev\/bus\/usb\/$BUSID\/$DEVID dev\/bus\/usb\/$BUSID\/$DEVID none bind,optional,create=file“ „/etc/pve/nodes/pve-router/lxc/$LXC.conf“

    pct reboot $LXC

    ### ENDE ###

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert