ubuntuusers.de

Belege scannen, pdf automatisch benennen auf Grundlage rotem Paginierstempel

Status: Ungelöst | Ubuntu-Version: Kubuntu 22.04 (Jammy Jellyfish)
Antworten |

dafosy

Anmeldungsdatum:
26. Februar 2012

Beiträge: 164

Ich habe mich an das Projekt gestern erst rangesetzt, aber jetzt komme ich schon nicht weiter und suche nach Denkanstößen und/oder Erfahrungen.

Auf alle meine Belege stempele ich mit rotem Paginierstempel eine 6-stellige Nummer. Ich würde jetzt gerne ein Skript bauen, welches in einem bestimmten Ordner alle pdfs umbenennt. Grundlage dafür soll die rote Paginierstempel-Nummer sein, welche sicherlich randommäßig immer an anderer Stelle auf dem Beleg gestempelt wird/wurde - aber durch die rote Farbe eigentlicha auch softwareseitig ausfindig zu machen ist.

Was bisher funktioniert, ist der Belegscan 😀 und die Erfassung des Inhalts per OCRmypdf.

Wie würdet ihr weiter vorgehen?

Die Standardsoftware von Scansnap versucht sich ja auch an inhaltsnahem Benennen, aber dort wird die rote Nummer schon nicht standardmäßig richtig eingeordnet.

Grüße /dafosy

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1125

Rein theoretisch unter der Voraussetzung, dass deine Belege schwarz-weiß sind und der Stempel der einzige Farbpfleck ist:

dafosy

(Themenstarter)

Anmeldungsdatum:
26. Februar 2012

Beiträge: 164

Ich danke dir für den Input. Klingt machbar. Ich werde berichten!

dafosy

(Themenstarter)

Anmeldungsdatum:
26. Februar 2012

Beiträge: 164

Aber sage mal,

ist es nicht vielleicht auch eine Option den Ordner zu überwachen und einfach eine Routine zu programmieren, die fortlaufende Dateinamen vergibt?

Wenn neue Datei, nimm letzte Datei (Zeitstempel), extrahiere deren Dateinamen (Bspw. 001234.pdf) zähle eins dazu und benenne die neue eingespielte Datei dann entsprechend um. (Bspw. 001235.pdf)

Das ist vielleicht weniger fehleranfällig.

fleet_street

Top-Wikiautor
Avatar von fleet_street

Anmeldungsdatum:
30. August 2016

Beiträge: 2400

Wohnort: Hunsrück (dunkle Seite)

dafosy schrieb:

ist es nicht vielleicht auch eine Option den Ordner zu überwachen und einfach eine Routine zu programmieren, die fortlaufende Dateinamen vergibt?

Ja, schon. ABER es entspricht nicht deiner Aufgabenstellung. 😇 → inotify

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1125

dafosy schrieb:

... ist es nicht vielleicht auch eine Option den Ordner zu überwachen und einfach eine Routine zu programmieren, die fortlaufende Dateinamen vergibt?

Ja, es ist. Grundsätzlich muss der zu erst eingeschlagene Weg nicht immer der beste sein. Wie fleet_street schon schrieb kannst du das in einem Skript mittels inotify lösen. Mein persönlicher Favorit hierbei ist incron welches auf inotify basiert bzw. sich dieses zu Nutzen macht. Reine Geschmackssache ☺ .

Wenn neue Datei, nimm letzte Datei (Zeitstempel), extrahiere deren Dateinamen (Bspw. 001234.pdf) zähle eins dazu und benenne die neue eingespielte Datei dann entsprechend um. (Bspw. 001235.pdf)

Ja, das ist eine gute Idee für ein Skript.

Ich würde vielleicht wie folgt vorgehen (rein theoretisch):

  • Belege werden immer in das Verzeichnis input eingelesen

  • inotify oder incron informieren darüber bzw. rufen dein Skript auf mit dem Namen der neu erstellten Datei (NewFile)

  • dein Skript liest z.B. aus einer text-Datei (id.txt) die aktuell zu verwendende Vortlaufende Nummer(ID)

  • nun wird die Datei NewFile umbenannte in ID und verschoben in das Verzeichnis output z.B. mittels mv

  • wenn kein Fehleraufgetreten ist wird die Zahl in id.txt um eins erhöht

Das ist vielleicht weniger fehleranfällig.

Sehr wahrscheinlich ja, da der Ansatz mit ocr eben fehleranfällig ist.
Aber auch rein menschliche Prozesse sind fehleranfällig. In deinem Beispiel müsste sichergestellt sein, das die Belege immer in der richtigen Reihenfolge eingescannt werden. Also nicht der Beleg mit der Nummer 5001 vor dem Beleg mit der Nummer 5000. Ansonsten Stimmt die ID im Namen nicht mit dem Stempel überein. Das heißt wenn du das einscannen weiter delegierst ist auf eine korrekte Einweisung des Ausführenden zu achten.

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1125

Da es mich interessiert hat ob ChatGPT das umsetzen kann ...

ChatGPT 3.5 gefragt:

Frage/Befehl:
Schreibe mir ein bash Skript für ubuntu:
inotify oder incron informieren darüber bzw. rufen mein Skript auf mit dem Namen der neu erstellten Datei (NewFile), wenn im Verzeichnis input eine neue Datei erstellt wurde
das Skript liest nun z.B. aus einer text-Datei (id.txt) die aktuell zu verwendende fortlaufende Nummer(ID)
nun wird die Datei NewFile umbenannte in ID, wobei der gesamt Name maximal 10 Zeichen enthalten darf und der Rest mit Nullen aufgefüllt wird, und verschoben in das Verzeichnis output; das ganze geschieht z.B. mittels mv
wenn kein Fehler aufgetreten ist wird die Zahl in id.txt um eins erhöht

Ergebnis:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash

# Verzeichnisse definieren
input_dir="/pfad/zum/input/verzeichnis"
output_dir="/pfad/zum/output/verzeichnis"
id_file="/pfad/zur/id.txt"

# Überprüfen, ob Verzeichnisse und Dateien existieren
if [[ ! -d "$input_dir" || ! -d "$output_dir" || ! -f "$id_file" ]]; then
    echo "Fehler: Ein oder mehrere Verzeichnisse/Dateien existieren nicht."
    exit 1
fi

# Funktion zur Erzeugung der ID im gewünschten Format
generate_id() {
    local id_length=10
    local id_format="%010d" # Führende Nullen
    local id=$(printf "$id_format" "$1")
    echo "$id"
}

# ID aus der id.txt lesen
read -r id < "$id_file"

# Überwachung des input-Verzeichnisses mit inotify
inotifywait -m -e create --format '%f' "$input_dir" | while read -r filename; do
    # Neue Datei gefunden
    echo "Neue Datei erstellt: $filename"
    
    # Umbenennen und verschieben der Datei
    new_filename="$(generate_id "$id")"
    mv "$input_dir/$filename" "$output_dir/$new_filename"
    
    # Überprüfen, ob mv erfolgreich war
    if [ $? -eq 0 ]; then
        echo "Datei erfolgreich umbenannt und verschoben."
        
        # ID erhöhen
        ((id++))
        echo "$id" > "$id_file"
        echo "ID erhöht auf: $id"
    else
        echo "Fehler beim Umbenennen und Verschieben der Datei."
    fi
done

Vorbereitung und Start:

  • wenn noch nicht geschehen bitte inotify installieren ... siehe wiki.

  • die Pfade erstellen und im Skript angeben

  • die Datei id.txt erstellen z.B.: echo "1" > id.txt

  • Skript ausführbar machen

  • Skript starten

Testen:

  • im Verzeichnis input folgendes ausführen echo "erste Datei" > erstedatei.txt

  • im Verzeichnis output sollte nun der Befehl cat 0000000001 folgendes ausgeben: erste Datei

Bitte nochmal selber ausgiebig testen!

Du könntest den Dateien im Verzeichnis output, wenn du möchtest, noch eine Endung anhängen. Dazu müsstest du die Zeile 31 wie folgt abändern (Beispiel für die Endung PDF):

1
new_filename="$(generate_id "$id").pdf"

dafosy

(Themenstarter)

Anmeldungsdatum:
26. Februar 2012

Beiträge: 164

@sh4711:

geile Nummer mit ChatGPT. Kam das Skript mit Kommentaren? Ich teste das mal und gebe bescheid.

sh4711

Anmeldungsdatum:
13. Februar 2011

Beiträge: 1125

Ja, es kam mit Kommentaren. Gemäß dem beschriebene Testverfahren lief es bei mir.
Denk bitte daran, dass bei doppelten Anführungszeichen keine Abkürzungen wie ~/mydir bei den Pfadangaben benutzt werden dürfen. Also immer vollständige Pfandangaben benutzen.

dafosy schrieb:

... geile Nummer mit ChatGPT.

Geiler hätte ich es gefunden, wenn ich das Skript rückenmarkgesteuert hätte nieder schreiben können ... dem ist leider nicht so 😢

Antworten |