HP hat mit dem Multifunktionsdrucker HP 2840 eigentlich ein ziemlich geniales Gerät hergestellt. Leider wurde die Treiberentwicklung mit Windows XP eingestellt, was zur Folge hatte, dass die Windows 7 Nutzer im Internet laut lamentierten und letztlich die Geräte bei Ebay und Co. verschleuderten, weil sie ihn nur noch als Drucker und nicht als Scanner und Fax nutzen konnten.

Mit meinem Linux-Rechner kam ich dahinter, dass es mit dem HPLIP-Paket möglich ist, den Drucker ganz hervorragend zu benutzen. Einerseits kann man mit Simple-Scan und und XSANE Scannen was das Zeug hält und zweitens kann man mit ein paar Shell-Programmen sogar die „Scan-To-Folder Funktion nutzen.

Mit einem Windws X11 Server wie „XMING“ kann man dann die Scan-Programme sogar vom Windows-Rechner aus nutzen, was die Sache für Windows-Anwender interessant macht.

Die Aufgabenstellung

Mein Kumpel (eher kein Computerspezialist) wollte so einen Drucker, weil er ihn bei mir gesehen hatte. Und weil er gleichzeitig auch den Wunsch nach einem kleinen, billigen Dateiserver für Backup-Zwecke gesucht hatte, sollte eine kleine, schnuckelige Lösung her. Nämlich eine Raspberry Pi mit externer 1TB Platte und Samba als Server. Zusätzlich ersetzt HPLIP auf der Raspberry PI die fehlenden Windows-Druckertreiber zum Scannen. Faxen war in diesem Zusammenhang nicht gefragt, ist aber auch möglich. Vielleicht gehe ich später mal darauf ein.

Im Folgenden gehe ich auf Samba nicht im Detail ein, das ist ein langes Thema und wird andernorts besser behandelt. Ich erspare mir auch Ausführungen, wie man die Grundinstallation auf einer PI hin bekommt. Da gibt es wundervolle Step-by-Step Anleitungen wie man Raspbian, das Debian Wheezy Image, sauber installiert.

Konfiguration

Samba

Zunächst muss Samba installiert sein. Ich verwende im Folgenden noch Samba 3, weil ich in Samba 4 noch nicht fit bin und Samba 3 weiß Gott für ein Himbeerchen ausreicht.

Dazu installiert man:

apt-get install samba smbclient

Bei Samba3 gibt es ein nettes webbasiertes Tool zum Konfigurieren, nämlich „Swat“. Um dieses nutzen zu können, muss Inetd (man kann natürlich auch xinetd nehmen) installiert sein und in /etc/inetd.conf diese Zeile eingefügt werden:

#:OTHER: Other services
swat            stream  tcp     nowait.400      root    /usr/sbin/tcpd  /usr/sbin/swat

darüber hinaus muss in /etc/serivices diese Zeile stehen:

swat            901/tcp                         #SWAT

Nun kann man in Samba sehr bequem Shares anlegen und alles mögliche Verwalten. Benutzer anlegen kann man mit „smbpasswd -a user

Zugriff auf die PI

Für die Dienstprogramme von HP-LIP braucht man eine Grafikkonsole, und ich will die PI nicht an einem Fernsehgerät betreiben. Dafür kann man natürlich VNC benutzen das wird bereits an vielen Stellen im Internet erklärt. Zum Beispiel hier http://jankarres.de/2012/08/raspberry-pi-vnc-server-installieren/

Ich verwende gern die Windows-Remoteconsole, dafür muss xrdp installiert sein:

apt-get install xrdp

Um mit XMING Programme starten zu können muss XDM installiert sein. Dass man dafür auf dem Windows-Rechner XMING selbst braucht, setze ich mal voraus.

apt-get install xdm

HPLIP

Zuerst müssen einige Pakete installiert werden:

apt-get install hplip hplip-gui xsane simple-scan

Nun muss der Drucker eingerichtet werden, dazu benötigt man die oben beschriebene Grafik-Console.

mit „HP-Setup“ wird der Drucker hinzugefügt. Nun kann bereits gedruckt werden wie die Testseite beweist. Mit der HP-toolbox gelingen auch bereits scans.

Ebenfalls kann man mit „simple-scan“ oder gar „xsane“ scannen. Wenn man die Scans in der bereits eingerichteten Sambashare „SCANS“ abspeichert, kann man sie von den angeschlossenen Windows-Rechnern auch benutzen und weiterverarbeiten.

Nun wird auf den Windows-Rechnern XMING so konfiguriert dass man die Programme „simple-scan“, „Xsane“ und die „HP-toolbox“ von dort aus bedienen kann.

 hier fehlen noch ein paar anschauliches Screenshots.

Scanto-Destination

Ich finde es ein Super-Feature, dass man am Drucker mit der "Scannen in"-Taste auswählen kann, was und wohin man scannen möchte. Das ging bis Windows XP mit dem umfänglichen HP-Treiberpaket. Unter Windows 7 funktioniert nichts davon.

Der geniale Kollege Dag Rende hat auf seiner Homepage wunderschön dokumentiert, wie er dahintergekommen ist, die "Scannen-In" Funktion unter Linux nachzubilden. Im Folgenden zeige ich nicht den ganzen Entwicklungsweg, das kann Dag besser, sondern nur wie ich es auf der Pi implementiert habe.

Das Shellscript scanloop läuft als daemon ständig und wird auch automatisch gestartet. Es prüft zuerst, ob mit der Scannen-In-Taste eines der gleichnamigen Scan-Scripts ausgewählt wurde und führt es aus, wenn dem so ist. Dann wird geprüft, ob die Einträge in der Scannen-In-Liste den Namen der vorhandenen Scan-Scripts entsprechen und lädt sie bei Bedarf in den Drucker. Dazu wird das Script scanto-Destination aufgerufen. Die IP-Adresse muss natürlich angepasst werden.

Datei /usr/local/scripts/scanloop

#!/bin/bash
cd "`dirname $0`"
set -o pipefail
while true; do
        # if scan-to button pressed - run the command corresponding to the
        # destination name
        name=`wget -q -O - http://192.168.100.30/hp/device/notifications.xml \
                        | egrep -o '<ScanToDeviceDisplay>(.*)</ScanToDeviceDisplay>' \
                        | sed -e 's/<ScanToDeviceDisplay>//' \
                        | sed -e 's/<\/ScanToDeviceDisplay>//' \
                        | sed -e 's/.*://'` && {
                if [ "$name" != "" ]; then
                        if [ -x "/usr/local/scripts/scan-command/$name" ]; then
                                (cd /Data/SCANS; "/usr/local/scripts/scan-command/$name" >/dev/null 2>&1)
                                chmod a+r /Data/SCANS/*
                        fi
                fi
        }

        # update scan-to destinations in printer if necessary
        /usr/local/scripts/scanto_destination -l | sed  's/.*://' >/tmp/printer-dests && ls /usr/local/scripts/scan-command >/tmp/command-d
        diff /tmp/printer-dests /tmp/command-dests | egrep '<|>' | sed 's#<#/usr/local/scripts/scanto_destination -d#;s#>#./scanto_destinat

        sleep 5

done

Datei /usr/local/scripts/scanto_destination.sh

#!/bin/bash
# command to maintain the scan-to destination list in the HP Color LaserJet
# 2840 printer
adr="192.168.100.30"

if [ "$1" == "-a" ]; then
        name=$2
        [[ ! "$name" =~ ":" ]]&& name="$HOSTNAME:$name"
        postdata="AddScanToDest_1=127.0.0.1-$HOSTNAME%5e${name/:/%3a}%5eDestFolder"
        echo $postdata
        wget -q -O - --post-data="$postdata" http://$adr/hp/device/set_config.html
elif [ "$1" == "-d" ]; then
        name=$2
        [[ ! "$name" =~ ":" ]]&& name="$HOSTNAME:$name"
        postdata="RemoveScanToDest_1=${name/:/%3a}"
        wget -q -O - --post-data="$postdata" http://$adr/hp/device/set_config.html
elif [ "$1" == "-l" ]; then
        wget -q -O - http://$adr/hp/device/info_scanto_destinations.xml | sed -n '/<DeviceDisplay>/s/<\/*DeviceDisplay>//gp'
else
        echo 'usage: scanto_destination -l -a <destname> -d <destname> for listing adding and deleting destinations'
fi

Schließlich zeige ich noch zwei Beispiele für Scan-Scripts. Diese liegen bei mir im Verzeichnis /usr/local/scripts/scan-command 

Pic300

Das erste Script Scannt ein Bild in 300 Pix/inch von der Glasplatte

cd /Data/SCANS/
now=$(date +"%Y-%d-%m_%H-%M-%S")
file="/Data/SCANS/scan_$now"
# hp-scan -m 'color' -r300 -x 'jpeg' -s 'file'
scanimage --format=tiff --resolution 300 > $file
chown pi:users $file
chmod ugo+rw $file

Auto-PDF

Dieses Script ist schon ein bisschen umfänglicher: Es liest ein mehrseitiges Dokument aus dem Sheetfeeder und macht ein PDF-Dokument daraus. Abgelegt wird es, wie alle Scans, in /Data/SCANS, dieses Verzeichnis wird per Samba freigegeben.

mkdir /tmp/workdir
cd /tmp/workdir
now=$(date +"%Y-%d-%m_%H-%M-%S")
outname="/home/linke/Dropbox/SCANS/scan_$now"
echo "##### Scanning #####"
scanimage -y 279.4 -x 215.9 --batch --format=tiff --resolution 300 --source ADF
echo "##### Converting to PDF #####"
tiffcp -c lzw out*.tif output.tif
tiff2pdf output.tif > $outname.pdf
echo "##### Cleaning Up #####"
rm /tmp/workdir/*
echo "##### Done #####"

Und weiter?

Natürlich kann man sich jetzt alles mögliche dazu basteln, man muss es nur in ein Script packen können. Beispielsweise haben ich damit Experimentiert, die Scans per Email zu verschicken, oder Dokumente per OCR in Klartext zu übertragen. Alles mögliche geht und wir sind da noch längst nicht am Ende!

Happy scanning!