Sonntag, 23. Juni 2013

Scannen mit Raspberry (und iPhone-Fernsteuerung)

So ging es los


Die Situation
Ich habe einen Scanner an meinem PC angeschlossen, wir sind aber mehrere Menschen in unserem Haushalt, die eigentlich alle den Scanner nutzen wollen.

Die Komplikation
Der Scanner ist "obsolete Technik" dank fehlender Treiber für Windows 7/8/... 
Wir haben gerade einen neuen Farb-Laserdrucker gekauft, deswegen kommt der Umstieg auf ein Multifunktionsgerät auch nicht in Frage.

Die Lösung
Ich habe einen Raspberry Pi (Model B), mit dem ich die ersten vorsichtigen Schritte in Richtung Linux-Konfiguration mache. Und ich wollte mal wieder etwas basteln.


 ... und jetzt die ganze Story:


Es gibt schon eine Menge Artikel, die erläutern, wie der Raspberry scannt. Es gibt für bestimmte Scanner sogar die Möglichkeit, die Knöpfe auf dem Scanner zur Fernsteuerung zu verwenden (z.B. mit scanbuttond). Es gibt sogar eine technische Anleitung, wie man einen externen Schalter selbst baut, um damit den Raspberry zum Scannen zu bewegen (Link).


Alles schön und gut, aber das trifft nicht meine Bedürfnisse:
  1. Mein Scanner wurde natürlich von Scanbuttond nicht erkannt.
  2. Ich möchte i.d.R. mehrseitige Dokumente scannen und als PDF per E-Mail versenden oder ablegen.

So kam ich zu meinen Anforderungen:
  • Der Scanner soll mehrbenutzerfähig den (vertrauenswürdigen) Personen im Haushalt zur Verfügung stehen.
  • Ich brauche eine Oberfläche, mit der ich einen Scan anstoßen kann bzw. zu einem vorhandenen Dokument eine weitere Seite (anfügend) ergänzen kann.
  • Ich brauche Zugriff auf die Dateien, und das vielleicht auch, ohne dass ein Computer läuft.

Jetzt sind wir in der Familie ganz gut mit iPods, iPhones und iPads ausgestattet, und so ist folgende Lösung entstanden:
  • Der Scanner ist mit dem Raspberry Pi verbunden und wird mit sane angesprochen.
  • Auf dem Raspberry Pi läuft Samba, damit er im lokalen Netz zu Hause als "Haustausch" den Austausch der Dateien erlaubt.
  • Auf dem Raspberry läuft ein Apache und PHP, damit es eine Oberfläche zum Zugriff auf den Scanner gibt.
  • Zuletzt gibt es eine mit JQuery Mobile und PHP umgesetzte Oberfläche, mit der man von den PCs und den iGeräten auf den Scanner zugreifen kann (Scans sehen, Scannen, PDF downloaden, Löschen).
Mein ursprünglicher Wunsch, auch gleich noch eine Texterkennung auf dem Raspberry laufen zu lassen, ist in erster Linie an der Performance gescheitert. Tesseract, das die beste Erkennungsleistung liefern soll, hat in Tests etwa 8 Minuten an einer Seite gerechnet (Sackgasse, bitte nicht weiterlaufen).

... und jetzt die Details:

 Auf meinem Raspberry Pi habe ich Raspbian laufen. Ich habe in meinem Raspberry einen USB-Stick stecken, den ich auf /media/USBDRIVE nach dieser Anleitung gemoutet habe (mit Automount nach Reboot). Alle weiteren Installationsschritte beziehen sich darauf. Allerdings ist das Folgende keine ganz genaue Installationsanweisung, den Part mit den Benutzer- und Dateirechten habe ich ausgeblendet.

Scannen

Zuerst habe ich Sane installiert:

sudo apt-get install sane-utils libsane

Danach habe ich lange damit verbracht zu verstehen, dass ich nicht in der Lage bin, die Rechte so anzupassen, dass mein Standard-Nutzer ohne "sudo" in der Lage ist, den Scan anzustoßen. Aber anderen geht es auch so. Mit
sudo sane-find-scanner
habe ich nach Scannern gesucht und hatte das Glück, dass mein Scanner als genesys:libusb:001:004 von Sane einfach so erkannt wurde.

Schließlich war es eine Zeile, mit der ich einen Scan auf die "Platte" bekommen habe:
sudo scanimage -d genesys:libusb:001:004 --resolution 200 --mode Color --format=tiff >/media/USBDRIVE/image.tiff
Die 200 dpi Auflösung sind ein guter Kompromiss zwischen Qualität und Anzahl der "Rückspulungen" des Scanners, weil der Raspberry die Daten nicht schnell genug veratmen kann.

Bild-Verarbeitung

Um aus dem TIFF ein PDF zu machen, verwende ich im nächsten Schritt econvert: Nach Installation mit
sudo apt-get install exactimage 
 kann man mit
 econvert --input /media/USBDRIVE/image.tiff --compress jpeg --output /media/USBDRIVE/output.pdf
 aus großen TIFF-Dateien kleine, mit JPG komprimierte PDF-Dateien machen.

Wenn man mehrere PDFs zusammensetzen will, kann man nach Installation von PDF-Toolkit mit
sudo apt-get install pdftk 
mit der Kommandozeile
pdftk /media/USBDRIVE/input1.pdf /media/USBDRIVE/input2.pdf cat output /media/USBDRIVE/output.pdf
aus zwei PDFs eins machen.

Netzwerk-Share

Ich habe einen Samba installiert und /media/USBDRIVE/ freigegeben (nach dieser Anleitung). Das war erstaunlich viel Gewürge, ich habe nämlich versucht, dass jeder Windows-Nutzer mit seinem Windows-Nutzernamen auch auf den Raspberry zugreifen kann. Da ich im Windows-Netz Benutzernamen mit "Vorname Nachname" (mit Leerzeichen) verwende, ist das aber gescheitert. 

Ich habe lange gebraucht zu verstehen, wie ich die Nutzer, die da mit Samba beim Raspberry ankommen, mit Benutzerrechten ausstatte, damit sie auf das Share schreiben können. Wie auch immer - die Nutzer von den PCs haben am Ende irgendwie Zugriff auf /media/USBDRIVE/ von ihren Windows-Geräten aus bekommen.

Aber Samba will ich hier gar nicht weiter auswalzen, das ist eher ein Nebenkriegsschauplatz.

Apache, PHP und FTPD

Apache installieren geht ganz einfach, PHP5 ebenfalls, und dann waren es nur wieder die Benutzerrechte (mit denen stehe ich auf Kriegsfuß), um den Apache-User die Skripte ausführen zu lassen.

Dann habe ich noch einen FTPD gebraucht (Anleitung), um die PHP-Dateien auf den Raspberry zu bringen.

iPhone-Fernsteuerung

Am meisten Zeit hat mich dann doch die iPhone-Fernsteuerung gekostet. Nicht, weil sie so rasend viele Features hat, sondern weil ich mich vorher noch nie richtig mit JQueryMobile und Ajax auseinandergesetzt hatte.

Und so funktioniert sie:

Auf der ersten Seite meine Web-App sieht man alle vorhandenen PDF-Docs aus dem Ordner /media/USBDRIVE/, sowie die Anzahl der Seiten, die sie enthalten. Es gibt den Button "Scan", mit dem ein neuer Scan startet. Man landet damit (genauso wie mit einem Klick auf einen der Eintrag der Dokumente) in den Details:
Dort sieht man (nach einer Weile, da das Thumbnail on-the-fly generiert wird) die Vorschau, den Dateinamen, die Dateigröße, die Anzahl der Seiten sowie das Datum der letzten Änderung. Jetzt gibt es vier Buttons: "Back" führt zurück zur ersten Seite, "Add page" fügt diesem PDF eine neue Seite vom Scanner hinzu, "Delete" löscht die Datei und führt zur Übersicht zurück und mit "Show & Mail" kann man die Datei downloaden, so dass man sie auf dem PC direkt drucken kann, auf dem iPhone kann man sie Mailen oder in iBooks o.ä. hinzufügen.

Die kleine Web-App kann man hier downloaden. Verbesserungsvorschläge und Kommentare sind willkommen!

Zusammenspiel

Jetzt alles zusammenstecken: Webapp auf den Raspberry laden, dem Raspberry eine konstante IP-Nummer im lokalen Netz verpassen (ich konnte das in meinem Router einrichten), mit Safari auf dem iPhone die URL und das Verzeichnis der Webapp aufrufen, den Link auf dem Homescreen ablegen. Und los geht's.


Und jetzt?
Ein paar Erweiterungen schweben mir schon noch vor:
  • Man sollte die Dateien umbenennen können.
  • Die Anzeige sollte nicht nur für das iPhone, sondern auch für PC und iPad gut passen.
  • Typische Schreiben, die ich archivieren möchte, könnte ich auch direkt aus der App in die passenden Ordner senden.
  • Die Liste sollte sinnvoll sortiert sein (oder sich sortieren lassen).