In der Firma lebe ich schon seit vielen Jahren das papierlose Büro, zu Hause habe ich mindestens ebenso lange schon keinen Drucker mehr. Nur der Briefträger macht meinem papierlosen Leben einen Strich durch die Rechnung und schmeißt immer wieder Briefe in den Briefkasten, die – sofern sie nicht gleich im Altpapier landen – sorgfältig wie anno 1960 in einem Ordner einsortiert und abgeheftet werden.

Manchmal kommt es dann vor, dass man so ein Papier wieder aus seinem Aktenschrank holt. Sei es, weil das Finanzamt danach fragt oder weil da vielleicht noch irgendwas mit Garantie war (meistens gehen die Dinge allerdings eher einen Tag nach Garantieablauf kaputt).

Erschwerend kommt hinzu, dass heutzutage auch viele Rechnungen als PDF in meinem E-Mail-Postfach landen; diese will ich nicht unbedingt ausdrucken und abheften, aber so suche ich immer an zwei Stellen, wenn ich dann mal etwas suche: In den Akten und im E-Mail-Postfach. Am liebsten hätte ich alles an einer Stelle und das soll weder der Wohnzimmerschrank noch das E-Mail-Postfach sein.

2016 wollte ich auch das heimisch Büro voll digitalisieren. Das heißt nicht, dass alles Papier nun in das Altpapier wandert (wahrscheinlich will der eine oder andere Beamten-Gaul dann in 30 Jahren doch irgend ein bestimmtes Original-Dokument von mir haben), aber immerhin brauche ich mir beim Einordnen nicht mehr ganz so viel Mühe geben und finde trotzdem alles schnell wieder.

Angefangen hat das papierlose Büro (oder eher "Papierloses Wohnzimmer") mit dem Kauf eines Canon ScanFront-Dokumentenscanners.
Aus 10 doppelseitig bedruckten A4-Blättern mit einem Tastendruck ein durchsuchbares PDF zu machen, ist für diesen Scanner kein Problem.

Um die Ablage etwas zu automatisieren, habe ich mir noch einen Hotfolder erstellt, der mit Hilfe eines Perl-Skripts die PDFs wenn möglich gleich in den richtigen Archiv-Ordner (Rechnung/Versicherung/Finanzamt/...) verschiebt und das PDF ggf. nach Absender und Rechnungs-/Dokumentdatum benennt.

Was man über die meisten offiziellen Dokumente wissen muss

Ich hatte mich schon in der Firma ausgiebig mit dem Thema "Rechnungen" beschäftigt, um einen digitalen Workflow für Eingangsrechnungen zu entwickeln.
Das Wichtigste, was ich daraus gelernt habe: Auf jeder Rechnung muss die UstID (Umsatzsteuer-ID) abgedruckt sein.
Wenn die Texterkennung des Scanners nicht all zu schlecht ist und man sich eine kleine Datenbank der UstIDs der Firmen anlegt, von denen man am meisten Post bekommt, dann landet die meiste Post nach dem Scannen ganz automatisch und ohne weiteres Zutun an der richtigen Stelle.

Viele Firmen, die teure Dokumenten-Ablage-Systeme verkaufen, stellen die Erkennung von Rechnungen als etwas dar, was nur ihr System am besten kann, da es wohl mit einer kleinen künstlichen Intelligenz ausgestattet ist (weshalb es auch so teuer ist); hat man es allerdings nur mit Dokumenten aus Europa zu tun, eine gute OCR in der Hinterhand und hält nach DE (oder IT/FR/...) gefolgt von ein paar Zahlen Ausschau, hat man eine überraschend hohe Trefferquote, wenn es darum geht, das Dokument einer Firma (die dem System bereits bekannt ist) zuzuordnen.

So viel mal als kleine Info, wenn man es gleich richtig machen will. Für's Erste spare ich mir allerdings die Arbeit und begnüge mich damit, das Dokument manuell in eine bestimmte Kategorie (Rechnung/Versicherung/Finanzamt/...) einzuordnen und den Absender ggf. per OCR im Dokument zu finden.
Es muss ja später noch eine Steigerungsmöglichkeit geben.

Der simpelste Aufbau

Auf dem Scanner habe ich ein paar Tasten für die entsprechenden Kategorien angelegt, in denen die Dokumente landen sollen. Jeweils eine Taste für Simplex und eine für Duplex.
Alle Dokumente landen im selben Hotfolder auf meinem Mac, führen aber im Dateinamen ihren späteren Soll-Ablageort mit sich.

Zum Beispiel wird das PDF, wenn man das Dokument mit der Taste Versicherung scannt, mit dem Namen Versicherung-2368762f763.pdf im Hotfolder meines Macs gespeichert.

Ein Perl-Skript durchforstet den Hotfolder, benennt das PDF um (optimalerweise nach Versender und Dokumenten-Datum) und verschiebt es ins Archiv.
Da der Scanner selbst ein OCR durchführt, kann ich direkt den PDF-Inhalt nach Datum und Absender durchsuchen. Dafür verwende ich pdftotext aus dem xpdf-Package.

#!/usr/bin/perl

use strict;
use POSIX;

# Vorgaben
my %config = ('LIEFERANTEN' => "Amazon|Maxmustermann|Teledoof",  # Bekannte Lieferanten
              'HOTFOLDER'   => "/Users/scanner/Public/scan-in",
              'ARCHIV_ROOT' => "/Volumes/Archiv/Dokumente/",
              'ERR_FOLDER'  => "_fehler", # Unterordner von Archiv-Ordner, wohin die nicht verarbeiteten PDFs verschoben werden sollen
              'JAHR'        => ""  # Ablegen in Jahr... (leer lassen, um aktuelles Jahr zu verwenden)
              );

my ($s, $i, $h, $d, $m, $y, $wd, $yd, $ds) = localtime();
$y =~ s/\d(\d{2})/$1/; $m++; my $yy = "20$y";
my $lieferanten = %config->{'LIEFERANTEN'};

# Sollte der Ordner leer sein, gleich abbrechen
my @files = glob( %config->{'HOTFOLDER'}."*" );
if (scalar(@files) == 0) {exit 0;}

# Verzeichnis durchsuchen und PDFs verarbeiten
foreach my $pdfFile (@files) {
        $pdfFile =~ m/.*?\/([^\/]+)$/;
        my $file = $1;
        # Nichts Interessantes zum Verarbeiten?
        next if ($file =~ /^\./);
        next if (-d $pdfFile);                  # Ist ein Verzeichnis
        next unless (-e $pdfFile);              # Existiert nicht mehr
        next unless ($file =~ /\.pdf$/i);       # Kein PDF
        # Erstmal etwas abwarten. Vielleicht speichert der Scanner gerade noch...
        sleep 10;
        # PDF-Inhalt
        my $content = `/usr/local/bin/pdftotext $pdfFile -`;
        my $datum   = "$yy-xx-xx";
        my $abs     = "Unbekannt";
        if ($lieferanten ne "" && $content =~ m/($lieferanten)/i) { $abs = $1; }
        if ($content =~ m/(\d{2})\.(\d{2})\.(\d{4})/ && $3 eq $yy) { $datum = "$3-$2-$1"; }
        # Datei verschieben
        my $ordner = undef;
        if ($file =~ m/^(.*?)-/) { $ordner = $1; }
        if ($ordner eq undef) {
                $ordner = %config->{'ERR_FOLDER'};
                }
        $ordner = %config->{'ARCHIV_ROOT'}.$ordner;
        if (! -d $ordner) { `mkdir $ordner`; }
        if (%config->{'JAHR'} eq "") {
                $ordner .= "/$yy";
        } else {
                $ordner .= "/".%config->{'JAHR'};
                if ($datum =~ m/-xx-xx/) { $datum = %config->{'JAHR'}."-xx-xx"; }
                }
        # Existiert ein Ãœber-Ordner? Gibt es schon eine Datei dieses Namens?
        if (! -d $ordner) { `mkdir $ordner`; }
        if (-e "$ordner/$datum $abs.pdf") {
                my $counter = 0;
                while (-e sprintf("$ordner/$datum $abs %02s.pdf", ++$counter)) {}
                $abs .= sprintf(" %02s", $counter);
                }
        `cp $pdfFile "$ordner/$datum $abs.pdf"`;
        `rm $pdfFile`;
        }

Aus dem Ordner, in dem der Scanner die PDFs speichert macht man dank launchd einen Hotfolder, der bei neuen Dateien das Skript aufruft:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
     <dict>
       <key>Label</key>
       <string>net.apfelz.scanner-hotfolder</string>
       <key>ProgramArguments</key>
       <array>
          <string>/Library/apfelz/scripts/scanner-hotfolder.pl</string>
       </array>
       <key>StandardErrorPath</key>
       <string>/Library/logs/apfelz/scanner-hotfolder.txt</string>
       <key>StandardOutPath</key>
       <string>/Library/logs/apfelz/scanner-hotfolder.txt</string>
       <key>WatchPaths</key>
       <array>
        <string>/Users/scanner/Public/scan-in/</string>
       </array>
       <key>RunAtLoad</key>
       <true/>
     </dict>
</plist>

Die Scans werden via FTP-Protokoll auf den Mac übertragen, da es mit dem SMB-Zugriff wie in diesem Artikel beschrieben nicht so weit her ist.