Papierloses Büro

Seit Jahren plagt mich ein Thema: Die Ablage. Grundsätzlich hatte es sich eingespielt, dass ich regelmäßig, spätestens bis die Ablage kein einziges Blatt mehr fässt, die Dokumente in die Leitz-Ordner abhefte. Dazu brauchte es jede Menge Platz auf dem Boden, um viele thematische Häufchen zu bilden. Ganz besonders brauchte es aber Zeit.

In den letzten 2,5 Jahren habe ich jedoch nichts – gar nichts! – abgeheftet und habe viele Strategien beiläufig entwickelt, wie man eine solche Ablage voller bekommt, als ich je gedacht hätte.

Also entschied ich mich, mich weder zeitlich noch örtlich so intensiv an das Büro binden zu wollen – eine digitale Lösung sollte Abhilfe schaffen.

Der Scanner

Zunächst ging alles mit der Beschaffung eines Dokumentenscanners los. Die wichtigsten Kriterien für mich waren hier:

  • Dokumenteneinzug
  • Speichern der Scans via SMB ins Netzwerk (Synology NAS in meinem Fall) ohne die Notwendigkeit, dass ein PC eingeschaltet sein muss.

Ich entschied mich für den Brother ADS-2700W. Vielleicht ein bisschen ambitioniert für das Vorhaben, aber allemal geeignet.

Die Konfiguration war super einfach. Es gibt nun Favoriten auf dem Touchscreen, mit Hilfe dessen man ein eigens angelegtes Profil auswählen kann, um den Zielort zu bestimmen. In meinem Fall gibt es nur einen Zielort: _Ablage/_unprocessed. Wieso die Daten in einen _unprocessed Ordner gespeichert werden, erkläre ich später. Nur so viel vorab: Es hat etwas mit der Texterkennung (OCR) zu tun. Wenn man im übrigen nur ein Profil hat, wie in meinem Fall, kann man den Scanner auch im automatischen Modus betreiben. Dann scannt er los, sobald sich etwas im Einzug befindet.

Ich war damit meinem Ziel schon einen Schritt näher: Zukünftige Briefe kann ich nun direkt nach der Entnahme aus dem Briefkasten öffnen, sie in den Scanner legen und das Papier, das durch den Scanner gegangen ist, darf direkt durch in den Mülleimer fallen.

Texterkennung (OCR)

Verschiedenen Dokumentenscanner bieten Texterkennung an. Sie erstellen also durchsuchbare PDFs. Was ich gefunden habe war jedoch, dass dafür immer der Weg über eine Software am PC oder die eigene Cloud des Anbieters gegangen werden muss. Also machte ich mich auf die Suche, ob es Software dort draußen gibt, die eine Texterkennung auf meine vorhandenen PDFs ausführt. Und ich habe sie gefunden: OCRMyPDF (https://github.com/jbarlow83/OCRmyPDF). Es handelt sich dabei um eine Python Erweiterung.

Da ich vermeiden möchte sehr viele technische Geräte 24/7 zu betreiben, gab es für mich nur zwei Lösungen, wo OCRMyPDF laufen lassen könnte, so dass neue, eingescannte Dokumente automatisch umgewandelt werden:

  • Raspberry PI
  • Synology NAS

Ich entschied mich für das Synology NAS, da dort meine PDFs ohnehin schon liegen.

Für die Installation auf der Synology, in meinem Fall eine DiskStaion 416play, wird Docker benötigt. Docker ist offensichtlich nicht für alle Synologies im Paketmanager verfügbar. Solltet ihr über eine x86 Synology verfügen und Docker nicht zur Auswahl stehen, könnt ihr es mit diesem Paket manuell installieren.

Wenn ihr Docker installiert bzw. verfügbar habt, könnt ihr das entsprechende Docker Image von OCRMyPDF nun installieren.

Die Idee ist nun folgende:

  • Zu jeder vollen Stunde sollen über alle PDFs aus dem Ordner _Ablage/_unprocessed eine Texterkennung laufen.
  • Die dabei resultierende OCR-PDF kommt in den Oberordner _Ablage.
  • Das originale PDF wird nach _Ablage/_originals archiviert, falls doch einmal etwas schief geht.

Auf Basis des folgenden Skripts ist die nachfolgende Erweiterung entstanden. Es handelt sich dabei um eine Python Datei, die von der Synology ausgeführt werden kann.

#!/bin/env python3

# script needs 2 arguments
# 1. source dir with *.pdf - default is location of script
# 2. move dir where *.pdf and *_OCR.pdf are moved to

import logging
import os
import subprocess
import sys
import time
import shutil

print('starting')
script_dir = os.path.dirname(os.path.realpath(__file__))
timestamp = time.strftime("%Y-%m-%d-%H%M_")
log_file = script_dir + '/' + timestamp + 'ocrmypdf.log'
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s', filename=log_file, filemode='w')

if len(sys.argv) > 1:
    start_dir = sys.argv[1]
else:
    start_dir = '.'

for dir_name, subdirs, file_list in os.walk(start_dir):
    logging.info('\n')
    logging.info(dir_name + '\n')
    os.chdir(dir_name)
    for filename in file_list:
        file_ext = os.path.splitext(filename)[1]
        if file_ext == '.pdf':
            full_path = dir_name + '/' + filename
            file_noext = os.path.splitext(filename)[0]
            timestamp_OCR = time.strftime("%Y-%m-%d-%H%M_OCR_")
            filename_OCR = file_noext + '_OCR.pdf'
            docker_mount = dir_name + ':/home/docker'
# create string for pdf processing 
# diskstation needs a user:group docker:docker. find uid:gid of your diskstation docker:docker with id docker.
# use this uid:gid in -u flag
# rw rights for docker:docker at source dir are also necessary
# the script is processed as root user via chron 
            cmd = ['docker', 'run', '--rm', '-v', docker_mount, '-u=1024:101', 'jbarlow83/ocrmypdf', '-ldeu', '--deskew', filename, filename_OCR]
            logging.info(cmd)
            proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
            result = proc.stdout.read()
            logging.info(result)
            full_path_OCR = dir_name + '/' + filename_OCR
            os.chmod(full_path_OCR, 0o666)
            os.chmod(full_path, 0o666)
            full_path_OCR_archive = sys.argv[2]
            full_path_archive = sys.argv[2] + '/_originals'
            shutil.move(full_path_OCR,full_path_OCR_archive)
            shutil.move(full_path, full_path_archive)
logging.info('Finished.\n')

Das Skript brauch noch eine kleine Anpassung: Führt auf der Shell der Synology den folgenden Befehl aus: id username
wobei ihr „username“ durch den User ersetzen müsst, der Leseberechtigungen auf den „_Ablage“-Ordner hat. In meinem Fall ist es der User „admin“. Notiert euch die uid und die gid und ersetzt das im Skript an der Stelle „-u=1024:101′“, wobei 1024 hier die uid und 101 die gid aus meinem Anwendungsfall ist.

Damit die Texterkennung dann automatisch geschieht, muss unter /etc/crontab ein entsprechender Eintrag gemacht werden. Das hier genannte Skript „ocrmypdf.py“ benötigt 3 Parameter.

  1. Ordner, in dem die unbearbeiteten Originaldokumente nach dem Scan liegen.
  2. Ordner, in dem die bearbeitete Datei abgelegt werden soll. Die originale Datei aus 1. wird im Ordner „_originals“ unter „_Ablage“ gespeichert.
0 * * * * root /usr/bin/python /root/ocrmypdf.py /volume1/PATH/_Ablage/_unprocessed /volume1/PATH/_Ablage

Automatische Ablage

Ab diesem Punkt war ich eigentlich so weit, dass ein – für mich – bereits riesiger Mehrwert eingetreten ist. Neue Post wird direkt eingescannt, auf das NAS gesichert und durchsuchbar gemacht.

Ein letzter Schritt wäre jedoch noch, wenn die Dokumente automatisch in die korrekten Ordner einsortiert werden, basierend auf ihrem Inhalt. Es gibt einiges an Software, darunter sogenannte DMS (Dokumentenmanagementsysteme), die das für einen abnehmen sollen. Ich habe mir flüchtig per Google und YouTube ein paar dieser Softwarelösungen angeschaut (insbesondere ecoDMS schien mir ein Kandidat – läuft wohl auch auf der Synology). Ich musste jedoch feststellen, dass all diese Systeme sehr umfangreich sind und es nach meinem Verständnis eine Zeit braucht, bis der Umgang mit diesen Systemen gelernt ist. Vielleicht ein weiterer Schritt in Richtung Zukunft – für den Moment scheint mir das aber zu übertrieben.

Ich stellte fest, dass die Synology das Commandline Tool „pdftotext“ bereits installiert hat und ich machte mir davon einen Nutzen. Das nachfolgende Skript durchsucht alle PDFs im _Ablage-Ordner, sie ja ab dort durchsuchbar sind, und generiert eine Textdatei aus dieser PDF. Mit dieser Text-Datei kann man z.B. Suchen mit grep ausführen. Die Datei rules.txt hält alle Regeln; beim Fund einer oder mehrerer Wörter wird sie Datei in den angegebenen Ordner verschoben.

#!/bin/bash
#1: source
#2: copy base path


SOURCEPATH=$1
COPYPATH=$2

PDFTOTEXT=/tmp/pdftotext.txt

for file in $SOURCEPATH/*.pdf; do
	pdftotext $file $PDFTOTEXT
	filename='rules.txt'
	echo Start
	count=0
	while read rule; do 
		if [ "$count" -eq "0" ]; then
			echo "Skipping Headline of rules.txt"
		else
			IFS=';' read -r -a array <<< "$rule"
			echo Search for "${array[0]}"

			if grep -E "${array[0]}" "$PDFTOTEXT"; then
				mv $file $COPYPATH/${array[1]}
			fi
		fi
		((count++))
	done < $filename
done

rules.txt

Words (devidev by |);Target Folder
Allianz|2467531;Versicherungen/Allianz

In der rules.txt kann für jede Regel eine Zeile angelegt werden. Das Skript sucht nach Wörtern auf der linken Seite des Semikolons, wobei es sich dabei um eine logische Oder-Verknüpfung handelt. Auf der rechten Seite des Semikolons steht der Ordner, in dem die Datei kopiert werden soll, wenn die Regel zutrifft. Dieser Pfad ist realativ zu dem angegebenen Pfad gemeint, in meinem Fall: /volume1/PATH/Versicherungen/Allianz.

Letztlich muss natürlich auch für das Einsortieren wieder ein Cronjob angelegt werden.

30	*	*	*	*	root	/root/movePdfToFolder.sh /volume1/PATH/_Ablage /volume1/PATH

Das ist mein erster Blogbeitrag und ich hoffe, dass irgend jemand da draussen etwas von meiner Vorarbeit hat. Solltet ihr Fragen oder Verbesserungsvorschläge haben, schreibt sie gerne in die Kommentare.

Viele Grüße
Der Tekkie

Hinterlasse einen Kommentar