synOCR synOCR - GUI für OCRmyPDF

YAML:
rule_1001:
    tagname:
    targetfolder: /<EUER PFAD>/
    postscript: newtargetdir=$(echo "$(( ${date_yy} ))") && newtargetfile=$(echo "${NewName}") && mkdir -p "${output%/*}/${newtargetdir}" && filecount=$(find "${output%/*}/${newtargetdir}" -maxdepth 1 -type f -name "${newtargetfile}*.pdf" -printf '.' | wc -c) && if [ "${filecount}" -eq 0 ]; then mv "${output}" "${output%/*}/${newtargetdir}/${newtargetfile}.pdf"; else mv "${output}" "${output%/*}/${newtargetdir}/${newtargetfile} (${filecount}).pdf"; fi
    condition: all
    subrules:
    - searchstring: .
      searchtyp: contains
Wow, jetzt bin ich aber sprachlos! Wer kommt denn auf sowas?
Was genau macht dieses Skript denn nun?

Und das /<EUER PFAD>/ ist wirklich so gemeint oder schlichtweg ein Platzhalter der ersetzt werden muss vor der Ausführung?
 
/<EUER PFAD>/ ist nur ein Platzhalter.

Das Postskript sieht mehrzeilig so aus:

Bash:
# Zielpfad und Dateinamen vorbereiten
newtargetdir=$(echo "$(( ${date_yy} ))")
newtargetfile=$(echo "${NewName}")

# Zielverzeichnis erstellen
mkdir -p "${output%/*}/${newtargetdir}"

# Zählen wie viele Dateien mit diesem Namen bereits existieren
filecount=$(find "${output%/*}/${newtargetdir}" \
    -maxdepth 1 \
    -type f \
    -name "${newtargetfile}*.pdf" \
    -printf '.' | wc -c)

# Datei verschieben mit entsprechender Namensgebung
if [ "${filecount}" -eq 0 ]; then
    # Wenn keine Datei existiert - normal verschieben
    mv "${output}" "${output%/*}/${newtargetdir}/${newtargetfile}.pdf"
else
    # Wenn Datei existiert - mit Nummer verschieben
    mv "${output}" "${output%/*}/${newtargetdir}/${newtargetfile} (${filecount}).pdf"
fi
 
  • Like
Reaktionen: Yippie und Struppix
Hallo Yippie,

die Regel / Postscript macht eigentlich gar nichts, außer dass es ein Verzeichnis unterhalb /<Euer Pfad>/ (entspricht Eurem gewünschten Zielpfad, welcher hier einzutragen ist) anlegt, welches der gefundenen Jahreszahl in Eurem Dokument entspricht, also einen Jahresordner. Ist dieser vorhanden wird nur in den Ordner verschoben.
Das kann das GUI ja von sich aus, aber bei Verwendung einer YAML mit verschiedenen Zielordnern braucht man halt eine andere Lösung.
Das ist alles.

Karsten

@geimist - Stephan war schneller, danke für die tolle Aufbereitung
 
  • Like
Reaktionen: Yippie
Das kann das GUI ja von sich aus, aber bei Verwendung einer YAML mit verschiedenen Zielordnern braucht man halt eine andere Lösung.
Ein postscript benötigt man dafür aber nicht. Das geht auch so (mit den gleichen Platzhaltern für den Namen wie in der GUI):
YAML:
rule_1001:
    tagname:
    targetfolder: /§yocr4/
    condition: all
    subrules:
    - searchstring: .
      searchtyp: contains
 
Hi, sorry das ich das Thema gerade "Crashe":
Habe ein Dokument eingescannt, welches allerdings schief bleibt, statt begradigt.
Anbei das Ergebnis.

Ich habe folgende Parameter:
-r -d -f -l deu+eng --rotate-pages --pdf-renderer hocr
 

Anhänge

Bei mir funktioniert das Dokument. Kannst du mal ein Log bereitstellen?

-r und --rotate-pages sind äquivalent. Einen Parameter davon kannst du löschen.

Edit:
In meinem Standardprofil funktioniert es auch nicht, sondern nur in meinem Testprofil, wo ich die Schwarzweiß-Konvertierung aktiv habe. Wahrscheinlich kommt OCRmyPDF mit deinem Originaldokument nicht zurecht. Das entzieht sich leider meinem Einfluss.
Als letzte Möglichkeit, könntest du mal das neuste OCRmyPDF-Image manuell herunterladen und in deinem Profil aktivieren, falls du nicht eh auf dem :latest bist.
 
Zuletzt bearbeitet:
Code:
    -----------------------------------
    |    ==> installation info <==    |
    -----------------------------------

synOCR-user:              synOCR
synOCR-user is admin:     yes
synOCR-version:           1.4.5
Architecture:             x86_64
DSM-build:                72806
Device:                   718plus (0199208118)
current Profil:           XXX
monitor is running?:      yes
DB-version:               9
used image (created):     jbarlow83/ocrmypdf:latest (2025-01-28T07:59:25)
document author:         
used ocr-parameter (raw): -r -d -f -l deu+eng --pdf-renderer hocr
ocropt_array:             -r -d -f -l deu+eng --pdf-renderer hocr
search prefix:           
replace search prefix:    yes
renaming syntax:          §tit
Symbol for tag marking:   #
target file handling:     useCatDir
Document split pattern:   
split page handling:      discard
delete blank pages:       
threshold black/white:   
threshold black pixels:   
clean up spaces:          false
Date search method:       use Python
date found order:         firstfound
source for filedate:      source
ignored dates by search: 
date range in past:       0 [absolute: 0]
date range in future:     0 [absolute: 0]
Docker test:              OK
DSM notify to user:       XXX
apprise notify service:   
apprise attachment:       false
notify language:          ger
Loglevel:                 normal
max. count of logfiles:   10
rotate backupfiles after: 1 days
Source directory:         /volume1/synOCR/XXX/
Target directory:         /volume1/Daten/XXX/
Files are deleted immediately! / No valid directory [/]



  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
  ● ---------------------------------- ●
  ● |    ==> RUN THE FUNCTIONS <==   | ●
  ● ---------------------------------- ●
  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●

  -----------------------------------------------------------------------------------
  | check the python3 installation and the necessary modules:                       |
  -----------------------------------------------------------------------------------

                prepare_python: OK
Target temp directory:    /tmp/tmp.Lfwpb85NOt


  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
  ● STEP 1 - RUN OCR / SPLIT FILES, IF NEEDED:                                      ●
  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●


●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
CURRENT FILE:   ➜ scan.pdf
                  temp. target file: /tmp/tmp.Lfwpb85NOt/step1_tmp_1738069202/scan.pdf

  -----------------------------------------------------------------------------------
  | processing PDF @ OCRmyPDF:                                                      |
  -----------------------------------------------------------------------------------

                ➜ OCRmyPDF-LOG:
                  reading file from standard input
                  
                      1 page already has text! - rasterizing text and running OCR anyway
                      1 page is facing ⇧, confidence 18.19 - rotation appears correct
                  
                  Postprocessing...
                  Some input metadata could not be copied because it is not permitted in PDF/A. You may wish to examine the output PDF's XMP metadata.
                  
                  
                  
                  
                  Image optimization ratio: 1.47 savings: 32.0%
                  Total file size ratio: 0.74 savings: -35.5%
                  Output sent to stdout
                ← OCRmyPDF-LOG-END

                target file (OK): /tmp/tmp.Lfwpb85NOt/step1_tmp_1738069202/scan.pdf

                no split pattern defined or splitting not possible

  -----------------------------------------------------------------------------------
  | handle source file:                                                             |
  -----------------------------------------------------------------------------------

                ➜ delete source file (scan.pdf)
                removed directory '/tmp/tmp.Lfwpb85NOt/step1_tmp_1738069202/'

Stats:
  runtime last file:              ➜ 00:00:40
  runtime 1st step (all files):   ➜ 00:00:40


  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
  ● STEP 2 - SEARCH TAGS / RENAME / SORT:                                           ●
  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●


●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
CURRENT FILE:   ➜ scan.pdf

  -----------------------------------------------------------------------------------
  | search tags in ocr text:                                                        |
  -----------------------------------------------------------------------------------

                no tags defined

  -----------------------------------------------------------------------------------
  | search for a valid date in ocr text:                                            |
  -----------------------------------------------------------------------------------

2025-01-28 14:00:44,976 - Date scanning started
2025-01-28 14:00:44,976 - Version: 1.04
2025-01-28 14:00:44,976 - Parameter minYear = 0
2025-01-28 14:00:44,976 - Parameter maxYear = 0
2025-01-28 14:00:44,976 - Parameter searchnearest = off
2025-01-28 14:00:44,976 - set searchnearest = off
2025-01-28 14:00:44,977 - Parameter fileWithTextFindings = /tmp/tmp.Lfwpb85NOt/step2_tmp_1738069243//synOCR.txt
2025-01-28 14:00:44,977 - Start searching for alphanumerical and numerical dates......
2025-01-28 14:00:54,583 - finish searching for alphanumerical and numerical dates......
2025-01-28 14:00:54,584 - found 1 dates
2025-01-28 14:00:54,584 - found date 2025-01-14
2025-01-28 14:00:54,584 - Date scanning ended
                  Dates found: 1
                  check date ([yy]yy mm dd): 2025-01-14
                  ➜ valid
                      day:  14
                      month:01
                      year: 2025

  -----------------------------------------------------------------------------------
  | rename and sort to target folder:                                               |
  -----------------------------------------------------------------------------------

                ➜ renaming:
                  apply renaming syntax ➜ scan
                ➜ insert metadata (use python pikepdf)
                used metadata:
                ➜ '/Author': '',
                ➜ '/Keywords': '',
                ➜ '/CreationDate': 'D:20250114',
                ➜ '/CreatorTool': 'synOCR 1.4.5'
2025-01-28 14:00:55,231 - INFO - HandlePdf started
2025-01-28 14:00:55,232 - INFO - Version: 0.2
2025-01-28 14:00:55,232 - INFO - Task=metadata
2025-01-28 14:00:55,235 - INFO - >>>>> write meta_data started
2025-01-28 14:00:55,249 - INFO - save pdf to file (/tmp/tmp.Lfwpb85NOt/step2_tmp_1738069243/temp_scan_1738069243.pdf_meta.pdf)
empty
0
                  target file: scan.pdf

  -----------------------------------------------------------------------------------
  | adjusts the attributes of the target file:                                      |
  -----------------------------------------------------------------------------------

                ➜ Adapt file date (Source: Source file)

  -----------------------------------------------------------------------------------
  | final tasks:                                                                    |
  -----------------------------------------------------------------------------------

                  INFO: Notify for apprise not defined ...

run user defined post scripts:

Stats:
  runtime last file:    ➜ 00:00:12
  pagecount last file:  ➜ 1
  file count profile :  ➜ (profile XXX) - 229 PDF's / 604 Pages processed up to now
  file count total:     ➜ 386 PDF's / 938 Pages processed up to now since 2022-05-05

cleanup:
  delete tmp-files ...
                removed '/tmp/tmp.Lfwpb85NOt/scan.pdf'
                removed '/tmp/tmp.Lfwpb85NOt/step2_tmp_1738069243/synOCR.txt'
                removed '/tmp/tmp.Lfwpb85NOt/step2_tmp_1738069243/synOCR_filename.txt'
                removed directory '/tmp/tmp.Lfwpb85NOt/step2_tmp_1738069243/'
                removed directory '/tmp/tmp.Lfwpb85NOt'

  purge log files ...
  delete 0 log files ( > 10 files)
  delete 0 search files ( > 10 files)

  purge backup files ...
  delete 0 backup files ( > 1 days)

  runtime all files:              ➜ 00:00:53


  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
  ● ---------------------------------- ●
  ● |    ==> END OF FUNCTIONS <==    | ●
  ● ---------------------------------- ●
  ●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
 
Wie gesagt: Diese Funktion wird direkt von OCRmyPDF bereitgestellt. In dem Projekt könntest du ein Ticket eröffnen.
 
  • Like
Reaktionen: Ghost108
Ich bin fertig. Beide Varianten, @geimist und @Struppix, mit eigenem Profil „ausprobiert“. Natürlich, wie könnte es anders sein ☺️ funktionieren absolut fehlerfrei.
Ich hatte dieses „Projekt“ ja schon so weit getrieben, das ich im Vorfeld aussortiert hatte. Wirklich unwichtiges wurde vernichtet und nur das „wichtige“ blieb.
So waren es am Ende genau 275 „Rechnungen“ die nun digital abgelegt sind. Nicht so viel wie angenommen, aber DIE sind es. Sind immerhin Ordner ab 2003 bis 2024 (2025 ist noch nichts dazu gekommen).
Einige Dokus sind im Querformat vorliegend gewesen und hab mit PDF24tools ins Hochformat gedreht. Tool funktioniert wirklich gut, weil beispielsweise in einem PDF sich 3 Seiten befinden und eine davon hochformatig war. Das Tool kann jede Seite einzeln „drehen“.
Bei Erkennung der Jahreszahlen, ab und an 2-stellig, hat synOCR selbst DIE ab und an korrekt erkannt und ordnungsgemäß abgelegt (also liegt das im Grunde an der Qualität der „Bons“ die vorliegen). Alles überschaubar und gut ist es.
 
Ich hätte Mal wieder ein kniffiliges Problem bei der Erkennung eines Datums mitten in einem Text.
Folgender Text wurde erkannt, die einzelnen Zeilen sind dabei umgebrochen:
Herr Gustav Gans
1000277024
männlich, 07.01.1974

Termin: 80001 München / 28.01.2025 5402453 36 1
Aktuell erkennt synOCR das Datum 07.01.1974 und stellt dieses auch bei Angabe von
tagname: "§yocr4-§mocr-§docr"
über der YML-Datei korrekt ein.

Ich bräuchte jedoch das Datum 28.01.2025 und dann aber ebenfalls im Format 2025-01-28.

Ich hatte schon Mal ein ähnliches Problem und mir wurde super geholfen, glaub' es war damals Struppix.
Das RegEx welches er mir zur Verfügung gestellt hat war gigantisch lang, über mehrere Zeilen. Ich habs versucht auf dieses Problem hier zu adaptieren und bin natürlich grandios gescheitert.

Wie geht man sowas grundsätzlich an? Nutze gerne ein RegEx-Tool, wie bspw. RegExBuddy oder aber auch Mal https://regex101.com/ keines von beiden hat mich jedoch zu einer Lösung gebracht, auch nicht mir der damaligen Vorlage von Struppix.

Kann mir jemand ein RegEx zur Verfügung stellen und vielleicht dazu ein paar Erläuterungen wie man erstens so eine Suche nach einem Datum mitten im Dokument angeht und zweitens, wie die einzelnen Blöcke einer solchen RegEx zu verstehen sind, damit ichs mir auch archivieren und natürlich für die Zukunft Mal selbst zusammenstellen kann?

Vielen Dank für eure Hilfe!
 
Hallo Yippie,
klar bin ich behilflich, aber nicht mehr heute.
Schreib mir per PN genau was Du brauchst und denke bitte an die Beispiel Dokumente.

Karsten

PS: Hast Du Dir mal das Video zur Datumssuche in unserem YT angeschaut. Mach das mal.
 
  • Like
Reaktionen: geimist und Yippie
Ich habe heute eine neue Regel gebaut, um die Zeugnisse der Kinder verarbeiten zu können. Die RegEx Formulierungen um den Namen des Kindes, den Typ (1.Halbjahr/1. und 2. Halbjahr) und Klassenname finde ich heraus. Leider kann ich über §tagname_regex aber nur einen Treffer per RegEx finden und an den Dateinamen übergeben.
Gibt es eine Möglichkeit pro Regel mehr als ein tagname per RegEx zu finden und zu übergeben? Oder muss man hier mit mehreren Regeln arbeiten.
 
@guidovg Pro Regel geht nur ein §tagname_regex. Alles, was du nicht in einen RegEx bekommst, musst du über mehrere Regeln verteilen.
Ggf. hilft dir der Schalter multilineregex=true, falls es bei dir an den Suchergebnissen über mehrere Zeilen liegt. Nähere Infos HIER.
 
newtargetdir=$(echo "$(( ${date_yy} ))")
Ich nehme Mal an, dass date_yy ein Bash-Befehl/Bestandteil ist und das aktuelle Jahr, vierstellig ermittelt. Ihc habes getestet und es scheint auch so zu sein.

Kann ich auch an dieser Stelle das Ergebnis von §tagname_RegEx oder §yocr4 einbauen?
Ich ermittle mir nämlich aus dem erkannten Text die gewünschte Jahreszahl und die ist eben nicht das aktuelle Jahr.
 
${date_yy} ist die Variable, die das Jahr (4stellig) aus der konfigurierten Quelle enthält. Standardmäßig ist die Quelle das OCR-Datum mit Fallback auf das Dateidatum. Wird im Dokument also das Jahr 2001 erkannt, ist das auch der Inhalt der Variable.
§yocr4 kannst du hier im Postscript nicht verwenden (das Paragraphenzeichen § hat im Gegensatz zum Dollarzeichen $ keine Bedeutung für die Shell), da dass lediglich Platzhalter für die Konfiguration sind (z.B. in der GUI), aber im Skript nur als Text verstanden werden. In der YAML-Regel kannst du es allerdings wie in #4.584 gezeigt, verwenden.
Das Ergebnis von §tagname_RegEx könntest du im Postscript über die Variable ${tagname_RegEx_result} verwerten.
 
Danke vielmals für die Erklärung (y)

Ich möchte gerne das Vorjahr in der Postscript-Anweisung berechnen. Was in einer Shell funktioniert, geht nicht mit der YML-Datei:

YAML:
postscript: newtargetdir=$(echo "$(( $(date +%Y) - 1 ))") && newtargetfile=$(echo "${NewName}") && mkdir -p "${output%/*}/${newtargetdir}" && mv "${output}" "${output%/*}/${newtargetdir}/${newtargetfile}.pdf"

Wenn ich diesen Befehl (unter Weglassung von ${output....) in einer Synology-Shell ausführe, bekomme ich ein Verzeichnis mit dem Namen 2024 erstellt:
Bash:
newtargetdir=$(echo "$(( $(date +%Y) - 1 ))") && mkdir -p ${newtargetdir}

Nach der Ausführung des o.a. Postscripts über die YML-Datei erhalte ich keinerlei Unterverzeichnis.

Was mache ich hier falsch, vielleicht geht die Berechnung des Vojahres so aber auch nicht auf diese Art und Weise?

Ich habe auch schon dieses Konstrukt getestet, ebenfalls ohne Erfolg: kein Unterverzeichnis.
YAML:
newtargetdir=$(echo "$(( ${date_yy} -1 ))")
Ich gehe jetzt davon aus, dass ich mit der Anweisung keine numerischen Werte aus date_yy erhalten, mit dem sich das Vorjahr durch Subtraktion berechnen lässt, korrekt?



Warum sind eigentlich zwei sich öffnende Klammern (( und zwei schließende Klammern )) hier notwendig?
YAML:
echo "$(( ${date_yy} ))"

Ich habe mich ein wenig eingelesen was grundsätzlich $(...) macht: Den Befehl innerhalb der Klammer in einer Subshell ausführen(?). Warum gilt dies auch für die ECHO-Anweisung? Ist alles irgendwie ein wenig kryptisch das Shell-Gedöns ;-)
 
Ich gehe jetzt davon aus, dass ich mit der Anweisung keine numerischen Werte aus date_yy erhalten, mit dem sich das Vorjahr durch Subtraktion berechnen lässt, korrekt?
Doch. Ich habe es gerade probiert und funktioniert hier wie gewünscht.
Allerdings kann man dein Postscript noch etwas kürzen:
Bash:
postscript: newtargetdir="${output%/*}/$(( ${date_yy} -1 ))" && mkdir -p "${newtargetdir}" && mv "${output}" "${newtargetdir}/${NewName}.pdf"

#---------------- ERLÄUTERUNG ----------------
# Verzeichnisnamen zusammenstellen:
newtargetdir="${output%/*}/$(( ${date_yy} -1 ))"

# Zielverzeichnis erstellen:
mkdir -p "${newtargetdir}"

# Datei verschieben:
mv "${output}" "${newtargetdir}/${NewName}.pdf"

Warum sind eigentlich zwei sich öffnende Klammern (( und zwei schließende Klammern )) hier notwendig?
echo "$(( ${date_yy} ))"
Nur bei Integer Berechnungen.
 
  • Like
Reaktionen: Yippie und Struppix
Nochmals 60 Seiten rauf auf die 224+. Rechnungen vom damaligen Dachneubau (ca. 125m², Dachkonstruktionsholz, Rauhspund, Dachpappe, Elefantenhaut, Schieferbahn, zuzüglich reichlich m³ gelieferten Mauermörtel und Betonestrich). Dazu reichlich kleines Material (Winkel, Nägel usw.). Auch hier Leerseiten raus absolut ohne Probleme. Datum hier und dort sehr selten (liegt an den Vorlagen!), wie schon geschrieben, nicht erkannt. Aber absolut null Problem. Solche Stapel sind ja nicht täglich und regelmäßig vorhanden. Ich bin zufrieden, es funktioniert für meinen Zweck absolut super. DIE Kiste ist nun Vergangenheit und 👩 ist zufrieden. SIE hat ihren Willen und ich meine Ruhe 🙃
'Entschuldigung das ich dazwischengefunkt habe 😆
 

Additional post fields

 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat