ocrmypdf Script für Windows

  • 2 Antworten
  • Letztes Antwortdatum
Raz3r

Raz3r

Ehrenmitglied
20.057
Hallo Zusammen.

Ich habe folgendes Szenario vor:

Da ich ocrmypdf unter OMV mit Docker nicht so wirklich zum Laufen gebracht habe (wenn jemand hier helfen kann, dann wäre mir das eh lieber), habe ich das Ganze unter Windows installiert.
Wenn ich in meinem Dokumentenordner via PowerShell das Programm per
Code:
ocrmypdf -l deu input.pdf output.pdf
starte, wird aus input.pdf eine neue PDF-Datei mit Namen output.pdf erzeugt, welche durchsuchbar ist. Soweit so gut.

Nun liegen meine PDF-Dateien in unterschiedlichen Ordnern auf meinem Server. Zum Beispiel in etwa so:
Code:
Dokumente>
    >Versicherungen
    >Verträge
    >Verein
        >Verein 1
        >Verein 2
    >Arbeit
    >Privat
    >Bank
        >Bank 1
        >Bank 2
Somit wäre ein Script, weches alle Ordner und Unterordner durchforstet und aus den ursprünglichen Dateien neue, durchsuchbare Dateien macht, eine enorme Erleichterung. Also aus *.pdf (unbearbeitet) > *.pdf (bearbeitet).

Möglicherweise dann auch mit einer Funktion, dass in jedem Ordner die ursprünglichen Dateien, nach Abschluss der OCR-Bearbeitung, in einen Ordner wie z.B. \Backup verschoben werden. Das händische Löschen nach Überprüfung wäre kein Thema (Wäre nur Bonus, für alle Fälle sind Versionierung und div. Backups vorhanden).

Der Overkill wäre ein Script, dass zusätzlich meinen Scanordner überwacht und das Script startet, wenn eine neue PDF-Datei eingeht, diese mit ocrmypdf bearbeitet und dann in einen Eingangsordner auf meinem NAS verschiebt.
Das Script, welches in der Dokumentation benannt wird, macht micht leider nicht schlauer.
Code:
#!/usr/bin/env python3
# Original version by DeliciousPickle@github; modified

# This script must be edited to meet your needs.

import logging
import os
import sys

import ocrmypdf

# pylint: disable=logging-format-interpolation
# pylint: disable=logging-not-lazy

script_dir = os.path.dirname(os.path.realpath(__file__))
print(script_dir + '/batch.py: Start')

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

if len(sys.argv) > 2:
    log_file = sys.argv[2]
else:
    log_file = script_dir + '/ocr-tree.log'

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s %(message)s',
    filename=log_file,
    filemode='w',
)

ocrmypdf.configure_logging(ocrmypdf.Verbosity.default)

for dir_name, subdirs, file_list in os.walk(start_dir):
    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
            print(full_path)
            result = ocrmypdf.ocr(filename, filename, deskew=True)
            if result == ocrmypdf.ExitCode.already_done_ocr:
                print("Skipped document because it already contained text")
            elif result == ocrmypdf.ExitCode.ok:
                print("OCR complete")
            logging.info(result)

Wie Eingangs erwähnt, wäre mir natürlich am Liebsten, das Ganze auf meinem Server lauffähig zu bekommen. Da ich hier aber ebenfalls spätestens bei der Ordner-Überwachung und dem Script am Ende wäre, dachte ich, ich versuche mich über Windows. Leider scheitere ich am Script.

Vielen Dank schon einmal an alle für Eure Hilfe
 
Zuletzt bearbeitet:
Du könntest den DIR-Befehl nutzen, um alle PDF-Dateien in eine Textdatei auszugeben:

dir /b /s \\nas\dokumente\*.pdf >c:\windows\temp\pdfliste.txt

c:\windows\temp\pdfliste.txt enthält danach eine Liste aller PDF-Dokumente mit deren kompletten Pfad in dem Verzeichnis \\nas\dokumente und aller Unterordner (Pfad entsprechend anpassen). Die könnte man mit einer for-in-do-Schleife dann abarbeiten - das muss dann noch nicht einmal eine Powershell sein, eine Batchdatei reicht:

for /f "delims=" %%f in (c:\windows\temp\pdfliste.txt) do (
ocrmypdf -l deu "%%f.pdf " "%%f_ocr.pdf"

)

Ist einen Versuch wert. Solche Schleifen sollten auch mit einer Linux-Shell gehen (und damit in einem Linux unter Docker laufen), da kenne ich mich aber nicht mit aus. Ich bin auch nicht sicher, wie das mit der Ausgabedatei klappt - theoretisch sollte die dann "Dateiname.pdf_ocr.pdf" heißen.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: Raz3r
@TimeTurn vielen Dank für Deine Hilfe.
Ich habe jetzt eine für meine Bedürfnisse taugliche Variante gestrickt. Diese erstellt eine Liste in dem Verzeichnis, in welchem die Batch-Datei aufgerufen wird. Dann werden die PDF-Dateien verarbeitet und überschrieben und anschließend wird die liste.txt wieder gelöscht.
Code:
dir /b .\*.pdf >.\liste.txt
for /f "delims=" %f in (.\liste.txt) do (ocrmypdf -l deu "%f " "%f")
del .\liste.txt
Dies funktioniert in den normalen Ordnern einwandfrei. Wenn ich sie nun allerdings in meinem Netzwerkordner (als Laufwerk eingebunden) nutzen möchte, lässt er den Zugriff nicht zu. Der Benutzer hat ausreichend Rechte, daran sollte es eigentlich nicht liegen. Hast Du vielleicht eine Idee? Bislang hab ich im Netz keine Lösung finden können.
Ich hatte meinem Benutzer die Rechte zur Ausführung nicht gewährt. Jetzt passt alles.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: TimeTurn

Ähnliche Themen

Flashlightfan
Antworten
9
Aufrufe
129
Nightly
Nightly
O
Antworten
2
Aufrufe
145
odysseus
O
A
Antworten
1
Aufrufe
165
gatnnos
G
Zurück
Oben Unten