ubuntuusers.de

rename PDF laut OCR Information im PDF

Status: Gelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

bc-nero

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

Hallo!

Ich komme leider nicht weiter und brauche eure Hilfe. Ich muss aus unserer WaWi Rechnungen umbennen. Sie Wawi benennt diese nur mit einer ID, ich brauche aber den Dateinamen "Bestellnummer.pdf".

Das hier habe ich gefunden: https://gist.github.com/jcttrll/26b9b96253c5c654141399039fb528a2

, hier ging es aber wohl um das Datum für den Dateinamen. Zum Test habe ich den Bereich mal auf das Rechnungsdatum geändert und ausgeführt (Das PDF liegt im gleichen Ordner) Leider passiert da nichts.

Habt Ihr eine Idee wie ich:

  1. den PDF-Dateinamen mit der Bestellnummer geändert bekomme

  2. das Original in einen Subfolder "orginal" verschiebe

  3. das geänderte File in den Subfolder "upload" verschiebe?

Bin über jede Hilfe dankbar DANKE!!

SG Thomas

Bearbeitet von rklm:

Aufzählung. Bitte beachte Forum/Syntax und nutze die Vorschaufunktion!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

bc-nero schrieb:

Hallo!

Ich komme leider nicht weiter und brauche eure Hilfe. Ich muss aus unserer WaWi Rechnungen umbennen. Sie Wawi benennt diese nur mit einer ID, ich brauche aber den Dateinamen "Bestellnummer.pdf".

Das liegt doch hoffentlich alles in einer relationalen Datenbank - kannst du da keine DB-Abfrage machen, die die Assoziation zwischen Bestellnummer und der ID zeigt?

Das hier habe ich gefunden: https://gist.github.com/jcttrll/26b9b96253c5c654141399039fb528a2

, hier ging es aber wohl um das Datum für den Dateinamen. Zum Test habe ich den Bereich mal auf das Rechnungsdatum geändert und ausgeführt (Das PDF liegt im gleichen Ordner) Leider passiert da nichts.

Hast du dem Skript die PDF-Datei(en) als Argument mitgegeben?

Ich würde da ja erwarten die Fehlermeldung aus Zeile 29 zu sehen, wenn er soweit kommt, dass das OCR Zeichen liefert, aber kein gültiges Datum vorliegt.

Habt Ihr eine Idee wie ich: 1) den PDF-Dateinamen mit der Bestellnummer geändert bekomme

Das Suchen nach einem Datum durch die Suche nach einer Bestellnummer ersetzen und den printf-Befehl und das darin genutzte Template anpassen.

2) das Original in einen Subfolder "orginal" verschiebe

Siehe mv und mkdir

3) das geänderte File in den Subfolder "upload" verschiebe?

Siehe 2)

Hast du eventuell ein bis auf die Bestellnummer anonymisiertes Beispiel-PDF und deine bisherigen Änderungen an dem Skript?

bc-nero

(Themenstarter)

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

Hi, danke für die schnelle Antwort!

Das liegt doch hoffentlich alles in einer relationalen Datenbank - kannst du da keine DB-Abfrage machen, die die Assoziation zwischen Bestellnummer und der ID zeigt?

Leider nein, da komme ich nicht ran und ein Modul / Tool gibt es leider auch nicht.

Leider ist mein Wissen recht beschränkt, eher "try & error" - sorry. Die Koordinaten zum Testen auf ein Datum NEU: auf die Bestellnummer sollten passen, der Rest sagt mir leider wenig. Aber ich brauche hier die Bestellnummer.

 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
#/bin/bash
set -o pipefail

REGION_X=1925
REGION_Y=900
REGION_WIDTH=1000
REGION_HEIGHT=50
RENAME_PATTERN='foo-%s.pdf'

for file in "$@"; do
	declare date=$(
		convert -crop "${REGION_WIDTH}x${REGION_HEIGHT}+${REGION_X}+${REGION_Y}" \
			-density 300 -black-threshold 0.3 "$file" png:- |
				tesseract stdin stdout 2>/dev/null |
				grep -oP '\d[\s\d]*/[\d\s]+/[\d\s]+' |
				tr -d ' ' |
				awk -F/ '$3 < 100{$3 += 2000}{print $3 "-" $1 "-" $2}'
	)

	if [ -n "$date" ] && date -d "$date" >/dev/null; then
		rename=$(printf "$RENAME_PATTERN" "$date")

		if [ -e "$rename" ]; then
			echo "Error: $rename would be overwritten; skipping" >&2
		else
			mv -vn "$file" "$rename"
		fi
	else
		echo "Error detecting date of $file; skipping" >&2
	fi
done

Bearbeitet von rklm:

Syntaxhighlighting

test-.pdf (704.7 KiB)
Musterrechnung
Download test-.pdf

bc-nero

(Themenstarter)

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

So, per "try & error" habe ich erkannt, dass "convert" ein Problem mit PDF to PNG hat.

Dazu musste ich für ImageMagick die Datei:

/etc/ImageMagick-6/policy.xml

von <policy domain="coder" rights="none" pattern="PDF" />

auf <policy domain="coder" rights="read|write" pattern="PDF" />

ändern. Der "convert" klappt als einzelner Befehl im Terminal, das komplette bash leider noch immer nicht ☹

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Probier es mal damit:

 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
#/bin/bash
set -o pipefail

REGION_X=1925
REGION_Y=900
REGION_WIDTH=1000
REGION_HEIGHT=50

for file in "$@"; do
    base_dir=$(dirname "$(realpath "$file")")
    original_dir="${base_dir}/original"
    upload_dir="${base_dir}/upload"
    mkdir -p "$original_dir"
    mkdir -p "$upload_dir"

    declare order_number=$(
        convert -crop "${REGION_WIDTH}x${REGION_HEIGHT}+${REGION_X}+${REGION_Y}" \
            -density 300 -black-threshold 0.3 "$file" png:- |
                tesseract stdin stdout 2>/dev/null |
                grep -oP '\d+'
    )

    if [ -n "$order_number" ]
    then
        rename_target="${upload_dir}/${order_number}.pdf"
        original_copy="${original_dir}/${file}"

        if [ -e "$rename_target" ]
        then
            echo "Error: $rename_target would be overwritten; skipping" >&2
        elif  [ -e "$original_copy" ]
        then
            echo "Error: $original_copy would be overwritten; skipping" >&2
        else
            cp -v "$file" "$original_copy"
            mv -vn "$file" "$rename_target"
        fi
    else
        echo "Error detecting order number in $file; skipping" >&2
    fi
done

bc-nero

(Themenstarter)

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

EIN TRAUM!

Das funktioniert, wenn ich "./ocr-rename.sh test.pdf" aufrufe bezogen auf test.pdf, kann man das noch als Schleife machen, damit es mehrere PDFs umwandeln kann?

./ocr-rename.sh *.pdf ist die Lösung!

VIELEN DANK nochmals!!! Ich werde mal versuchen die Lösung zu verstehen, man lernt ja hoffentlich nie aus ☺

bc-nero

(Themenstarter)

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

Hi, ein "kleines" Problem hab ich noch mit dem Script, es will leider nicht als Cron laufen.

Wenn ich zum Test: env -i /home/user/ocr-rename.sh *.pdf laufen lasse, dann bekomme ich diese Fehlermeldung:

2: set: Illegal option -o pipefail

Gibt es hier noch einen Tipp?

Doc_Symbiosis

Avatar von Doc_Symbiosis

Anmeldungsdatum:
11. Oktober 2006

Beiträge: 4453

Wohnort: Göttingen

Hm, ich würde sagen, die Shebang, also die erste Zeile ist falsch. Die muss so aussehen:

#!/bin/bash

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

bc-nero schrieb:

Hi, ein "kleines" Problem hab ich noch mit dem Script, es will leider nicht als Cron laufen.

Wenn ich zum Test: env -i /home/user/ocr-rename.sh *.pdf laufen lasse, dann bekomme ich diese Fehlermeldung:

2: set: Illegal option -o pipefail

Gibt es hier noch einen Tipp?

Ubuntu nutzt als Standard-Shell die dash, die weniger Funktionalität bietet als die bash und wie Doc_Symbiosis schon richtig bemerkt hat, hatte meine die Tastatur ein Zeichen im Shebang verschluckt, so dass das Skript mit der dash statt der bash ausgeführt wird.

bc-nero

(Themenstarter)

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

Hi, danke!

Mit "#!/bin/bash" ist die Fehlermeldung weg, aber als cron läuft das trotzdem nicht

Ich hatte es als root im Cron und als normaler user eingetragen, unter /home/user/ und unter /usr/bin/ gespeichert (Pfade in ocr-rename.sh angepasst)

so will es nicht:

29 12 * * 1,2,3,4,5,6 /home/user/ocr-rename.sh *.pdf # JOB_ID_1

und aus /usr/bin/ wollte es auch nicht

29 12 * * 1,2,3,4,5,6 cd /home/user/ && ./ocr-rename.sh *.pdf # JOB_ID_1

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Probier es mal so:

29 12 * * 1,2,3,4,5,6 sh -c '/home/user/ocr-rename.sh /home/user/*.pdf'

bc-nero

(Themenstarter)

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

Das war es danke!

bc-nero

(Themenstarter)

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

war es leider doch noch nicht, per cron kommt ein Fehler beim Kopieren in den /original Ordner

'/home/user/209680_191171.pdf' → '/home/user/original//home/user/209680_191171.pdf' cp: reguläre Datei '/home/user/original//home/user/209680_191171.pdf' kann nicht angelegt werden: Datei oder Verzeichnis nicht gefunden

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11265

Wohnort: München

Ah, da muss noch der Pfad für die Zieldatei raus (Zeile 26):

 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
#!/bin/bash
set -o pipefail

REGION_X=1925
REGION_Y=900
REGION_WIDTH=1000
REGION_HEIGHT=50

for file in "$@"; do
    base_dir=$(dirname "$(realpath "$file")")
    original_dir="${base_dir}/original"
    upload_dir="${base_dir}/upload"
    mkdir -p "$original_dir"
    mkdir -p "$upload_dir"

    declare order_number=$(
        convert -crop "${REGION_WIDTH}x${REGION_HEIGHT}+${REGION_X}+${REGION_Y}" \
            -density 300 -black-threshold 0.3 "$file" png:- |
                tesseract stdin stdout 2>/dev/null |
                grep -oP '\d+'
    )

    if [ -n "$order_number" ]
    then
        rename_target="${upload_dir}/${order_number}.pdf"
        original_copy="${original_dir}/$(basename "file")"

        if [ -e "$rename_target" ]
        then
            echo "Error: $rename_target would be overwritten; skipping" >&2
        elif  [ -e "$original_copy" ]
        then
            echo "Error: $original_copy would be overwritten; skipping" >&2
        else
            cp -v "$file" "$original_copy"
            mv -vn "$file" "$rename_target"
        fi
    else
        echo "Error detecting order number in $file; skipping" >&2
    fi
done

bc-nero

(Themenstarter)

Anmeldungsdatum:
30. Mai 2013

Beiträge: 52

nur der cron wird doch nicht gestartet.

1
29 12 * * 1,2,3,4,5,6 sh -c '/home/user/ocr-rename.sh /home/user/*.pdf'

um 13:05 hab ich wohl von dem Test mit "env -i" täuschen lassen ...

Antworten |