synOCR synOCR - GUI für OCRmyPDF

mamema

Benutzer
Mitglied seit
23. Okt 2009
Beiträge
667
Punkte für Reaktionen
132
Punkte
63
Solange du als Parameter nicht --force-ocr setzt, sollten Seiten mit Text-Layer von OCRmyPDF übersprungen werden

Mein Problem ist die schiere Masse der Dateien und die schwache CPU der Synology Devices. Das Dein Vorschlag geht, weiss ich. Er bedeutet jedoch 4 Jahre Blockade des NAS :.-)

Ich hoffe auf ein Tool welches ich auf einem Rechner/Server laufen lassen kann mit genügend Bums....
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
6.057
Punkte für Reaktionen
1.855
Punkte
254
Ich habe mit alten PDFs auch so meine Probleme. Entweder war das OCR der Scannersoftware hundsmiserabel oder es stehen nur ein paar unwichtige Zeichen drin. In beiden Fällen führt synOCR (bzw. ocrmypdf) kein neues OCR durch. Wenn ich --force-ocr verwende, bläht es mir aber sehr gerne die PDFs auf, gerne ums 5-fache, z.B. von 100kb auf 500kb. Das wollte ich vermeiden. "--redo-ocr" geht leider auch nicht (Fehlermeldung).

Nun habe ich ein Tool gesucht, womit ich den Textlayer löschen kann um danach alle PDFs synOCR zum Fraß vorzuwerfen. Erfolglos. So ein Tool gibt es nicht bzw. es ist nicht möglich. Warum das so ist, habe ich bis heute nicht verstanden.

Er bedeutet jedoch 4 Jahre Blockade des NAS
Da hilft nur eins: Belohne dich mit einem neuen NAS. ;)
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.517
Punkte für Reaktionen
1.354
Punkte
234
Auf der DS gibt es das Kommandozeilenprogramm pdftotext. Das nutzt synOCR um den Text zu extrahieren und darin nach den Tags zu suchen. Das kannst du dir ja auch für deinen Zweck nutzen:

Rich (BBCode):
#!/bin/bash

INPUTDIR="/volume1/pfad zu deinen PDFs/"

#################################################################

OLDIFS=$IFS
IFS=$'\012'
for i in $(find "${INPUTDIR}" -maxdepth 1 -iname "*.pdf" -type f)
    do
        IFS=$OLDIFS
        content=$(/bin/pdftotext "$i" -)
        if [ ${#content} -ge 2 ]; then
            echo "$i enthält Text"
        else
            echo "$i enthält keinen Text"
        fi
    done

Das Skript gibt jetzt lediglich die Meldung aus, ob Text enthalten ist (ab 2 Zeichen), oder eben nicht. Kopieren oder verschieben der entsprechenden Datei kann man an entsprechender Stelle einbauen. In wie viel Unterordnerebenen gesucht werden soll, kann man nach dem Parameter -maxdepth angeben.



Über das Zählen von Zeilen funktioniert es bei mir zuverlässiger:
Rich (BBCode):
#!/bin/bash

INPUTDIR="/volume1/pfad zu deinen PDFs/"

#################################################################

OLDIFS=$IFS
IFS=$'\012'
for i in $(find "${INPUTDIR}" -maxdepth 1 -iname "*.pdf" -type f)
    do
        IFS=$OLDIFS
        linecount=$(/bin/pdftotext "$i" - | wc -l)

        if [ ${linecount} -ge 2 ]; then
            echo "$i enthält Text"
        else
            echo "$i enthält keinen Text"
        fi
    done
 
Zuletzt bearbeitet:

mamema

Benutzer
Mitglied seit
23. Okt 2009
Beiträge
667
Punkte für Reaktionen
132
Punkte
63
Danke. Das probiere ich.
 
Zuletzt bearbeitet von einem Moderator:

mamema

Benutzer
Mitglied seit
23. Okt 2009
Beiträge
667
Punkte für Reaktionen
132
Punkte
63
Helft mir mal, ich bin verzweifelt. (nicht wirklich :) )
Ich hab jetzt einen grösseren Schwung von PDFs durch meine Tags laufen lassen.
Nun ist es so, da es derzeit noch keine Tag Verknüpfungen gibt (Tag: A,B,C=Ordner D), habe ich A=Ordner D,B=Ordner D,C=Ordner D, gesetzt.
Nun habe ich die konvertierten PDFs an mehreren Orten doppelt liegen. Wahrscheinlich "by design".... :)

Wie bekomme ich:
a) mehrere Tags abgearbeitet - Wenn Du findest dann.... hopp dahin....
b) das bitte nur an einem Zielort.

Derzeit habe ich "nutze Kategorieordner" statt "nutze Tags" eingestellt.
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.517
Punkte für Reaktionen
1.354
Punkte
234
Dein Workaround ist völlig korrekt - so ist es gedacht.

Darf ich es so verstehen, dass Datei Nr.1 nach einem Durchlauf mehrmals in Kategorie Nr.2 eingeordnet ist, oder wird Datei Nr.1 in mehreren Kategorieordnern einsortiert?
 

olli2

Benutzer
Mitglied seit
04. Apr 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Hallo geimist!

Ich finde deine GUI recht gut und hätte da noch einige Verbesserungsvorschläge/Wünsche.;)
Da die Tags, die von synOCR vergeben werden, nicht immer genau passen oder fehlen und es zu mühsam ist, diese per Hand anzupassen, habe ich ein Tool gesucht das dieses übernehmen kann. Da habe ich in dem Beitrag https://www.gruenert.de/private-dokumente-digital-verwalten/ das Tool TagSpaces gefunden und auspropiert. Das Tool läuft super under Windows. Die Web Variante habe ich noch nicht auspropiert. Allerdings tagged das Tool die Dateien in dem Format Dateiname[Tag1 TagN].Dateiendung und deine Logik in dem Format Dateiname #Tag1 #TagN.Dateiendung. Damit ich die Tags die von deinem Tool geschrieben werden mit TagSpaces verwalten kann, habe ich in der synOCR.sh folgende Zeilen geändert.
Rich (BBCode):
--- synOCR.sh.org    2019-04-02 13:49:04.552749656 +0200
+++ synOCR.sh    2019-04-02 13:49:09.929700355 +0200
@@ -380,7 +380,7 @@
                     echo -n "                          Suche nach Tag:   "${searchtag}" => "
                     if grep $grep_opt "${searchtag}" "$searchfile" ;then
                         echo "OK (Cat: "${categorietag}")"
-                        renameTag="#$(echo "${searchtag}" | sed -e "s/ /%20/g") ${renameTag}"
+                        renameTag="$(echo "${searchtag}" | sed -e "s/ /%20/g") ${renameTag}"
                         renameCat="$(echo "${categorietag}" | sed -e "s/ /%20/g") ${renameCat}"
                     else
                         echo "-"
@@ -395,14 +395,14 @@
                     echo -n "                          Suche nach Tag:   "$(echo ${tagarray[$i]} | sed -e "s/%20/ /g")" => "
                     if grep $grep_opt "$(echo ${tagarray[$i]} | sed -e "s/%20/ /g" | sed -e "s/^??//g")" "$searchfile" ;then
                         echo "OK"
-                        renameTag="#${tagarray[$i]} ${renameTag}"
+                        renameTag="${tagarray[$i]} ${renameTag}"
                     else
                         echo "-"
                     fi
                 fi
                 i=$((i + 1))
             done
-            renameTag=${renameTag% }
+            renameTag="[${renameTag% }]"
             renameCat=${renameCat% }
             echo "                          renameTag lautet: "$(echo "$renameTag" | sed -e "s/%20/ /g")""
             }
Nun werden die Tags so geschrieben, das sie komfortabel geändert werden können.
tagspaces2.png
Anzumerken ist noch, das Tagspaces keine Tags mit Leerzeichen kennt, so das Tags mit Leerzeichen von synOCR, als zwei einzelne Tags in Tagspaces behandelt werden. Das ist aber nicht weiter schlimm und damit kann ich leben.
Übrigens habe ich das beschriebene Scanbot auch auspropiert und die fotografierten/ocrten PDF Dateien von Scanbot in den input Ordner hoch geladen. Damit kommt synOCR aber nicht klar und vergibt keine Tags. Der OCR Layer in den PDF Dateien von Scanbot wird durch OCRmyPDF verändert, obwohl das doch nicht so sein sollte. Wenn ich ein frisch von Scanbot erzeugtes PDF durch pdftotext jage, ist der Text in Ordnung und würde so auch von synOCR zur Tagerkennung funktonieren. Nach dem synOCR Lauf ist der erzeugte Text von pdftotext aber in einem anderen Format. Hinter jedem Buchstaben steht ein Leerzeichen. Das muß also sowas wie Unicode oder so sein. Lässt sich das irgendwie beheben? Dieses Verhalten ist bei Dateien ohne OCR Layer, die zweimal durch synOCR gejagt werden, nicht so, die werden von OCRmyPDF nicht verändert. Woran kann das liegen? Wenn das funktionieren würde, hätte ich mit meinem Handy einen günstigen Scanner.;)

Dann hätte ich noch folgende Idee. Kann man das Script so anpassen, das der Präfix der Dateien das gleichnamige Profil anzieht? Wenn kein passendes Profil gefunden wird, wird das default Profil angezogen. Somit könnten von verschiedenen Quellen, mit verschiedenen Prefixen, verschiedene Aktionen ausgelöst werden.
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.517
Punkte für Reaktionen
1.354
Punkte
234
… Damit ich die Tags die von deinem Tool geschrieben werden mit TagSpaces verwalten kann, habe ich in der synOCR.sh folgende Zeilen geändert …
Die eckige Klammer würde ich nicht pauschal für alle reinnehmen wollen. Kannst du das nicht über die GUI (Rename-Syntax) machen? Z.B. so: §y-§m-§d_[§tag]_§tit
Das Entfernen der Raute könnte ich ja auch alternativ in der GUI anbieten, wenn es wie bei dir benötigt wird.

… Wenn ich ein frisch von Scanbot erzeugtes PDF durch pdftotext jage, ist der Text in Ordnung und würde so auch von synOCR zur Tagerkennung funktonieren. Nach dem synOCR Lauf ist der erzeugte Text von pdftotext aber in einem anderen Format. Hinter jedem Buchstaben steht ein Leerzeichen …
Ich habe ja auch keinen Einfluss auf OCRmyPDF. Was steht im Log?

… Dieses Verhalten ist bei Dateien ohne OCR Layer, die zweimal durch synOCR gejagt werden, nicht so, die werden von OCRmyPDF nicht verändert. Woran kann das liegen? Wenn das funktionieren würde, hätte ich mit meinem Handy einen günstigen Scanner …
Kannst du die OCR-Funktion nicht einfach in ScanBot deaktivieren? Ich würde mal mutmaßen, dass die OCR-Qualität von OCRmyPDF eh besser ist …

… Kann man das Script so anpassen, das der Präfix der Dateien das gleichnamige Profil anzieht? Wenn kein passendes Profil gefunden wird, wird das default Profil angezogen. Somit könnten von verschiedenen Quellen, mit verschiedenen Prefixen, verschiedene Aktionen ausgelöst werden.
So ist es doch jetzt. Du kannst jedem Profil einen eigenen Präfix zuordnen und so werden die entsprechenden Dateien mit dem gewünschten Profil abgearbeitet. Es gibt lediglich kein Fallback zum default-Profil.
 

olli2

Benutzer
Mitglied seit
04. Apr 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Hallo geimist,

Ich dachte eher an eine umgedrehte Logik. Das was bei dir im Skript der Searchpraefix ist, könnte man über ein RegEx Muster fest definieren, so das z.B. Handy_ oder Scan_ als Präfix passt. Wenn nun eine Datei Scan_20190404.pdf gefunden wird, macht das Skript einen Select auf das Profil "Scan". Bei Handy_20190404.pdf eben auf das Profil "Handy". Wenn die gefundenen PDF Dateien keinen passenden Präfix haben wird ein Select auf das default Profil oder das aktive gemacht. Somit können verschiedene Geräte mit unterschiedlichen Präfixen unterschiedliche Aktionen auslösen. Die Logik wäre quasi nach Dateinamen gesteuert. Man könnte z.B.noch unterschiedliche Outputpfade in die Profile aufnehmen und die OCR Dateien würden an unterschiedlichen Verzeichnissen landen. Was hällst du davon?
Das Entfernen der Raute über die GUI ist die bessere Lösung. Somit kann sich jeder sein eigenes oder eben keines definieren.
Ich habe das OCR mal im Scanbot abgeschalten. Da läuft es sauber durch. Da muss ich mir wohl noch eine Lösung ausdenken.
 

TeXniXo

Benutzer
Mitglied seit
07. Mai 2012
Beiträge
4.948
Punkte für Reaktionen
100
Punkte
134
Das mit der "umgekehrten Logik" gefällt mir an und für sich wirklich gut. Ist aber im Endeffekt das Gleiche wie bisher. Denn die Datei umbenennen musst du so oder so machen (Scan_xxx", "Handy_yyy").

Ich habe das OCR mal im Scanbot abgeschalten. Da läuft es sauber durch. Da muss ich mir wohl noch eine Lösung ausdenken.

Inwiefern brauchst du da eine (weitere) Lösung?

Ich selbst verwende Scanner Pro von Readdle und da hab ich auch OCR deaktiviert. Funktioniert hier einfach sauber und ohne Probleme. Weitere Lösungen brauche ich nicht?
Des Weiteren hat Scanner Pro eigens definierte Abläufe. X mit Datei X_Date via WebDAV in Ordner X, Y, mit Datei Y_Date via WebDAV in Ordner Y usw. - deshalb hab ich mit den Profilen hier keine Probleme.
 

olli2

Benutzer
Mitglied seit
04. Apr 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Das OCR lässt sich bei Scanbot nur asschalten wenn das Handy nicht am Ladekabel hängt. Wenn ich aber eine längere Scan Session habe möchte ich das schon am Ladekabel haben. Dann macht Scanbot aber eine OCR Erkennung.
Diese umgekehrte Logik wäre im Hinblick auf den watchdog Zusatz gut. Mit der GUI definiert man die Profile und der watchdog löst einen OCR Vorgang aus. synOCR entscheidet dann automatisch anhand des Dateinamen welche Tags über das passende Profil angezogen werden und wohin der Output gespeichert wird.
Damit lassen sich verschiedene Profile in einem Durchlauf benutzen . Das geht jetzt nicht. Wenn Profil X aktiv ist bleiben alle Dateien unverarbeitet, die nicht den passenden Präfix haben. Dann müsste ich jetzt erst ein anderes Profil per Hand aktivieren und einen neuen Durchlauf starten. Mit der neuen Logik würden alle Dateien verarbeitet werden.
 
Zuletzt bearbeitet:

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.517
Punkte für Reaktionen
1.354
Punkte
234
… Ich dachte eher an eine umgedrehte Logik … Die Logik wäre quasi nach Dateinamen gesteuert. …
Die Sache ist ja die, dass es keinen globalen Quellpfad gibt. Der Quellpfad selbst wird ja erst aus den Profilen ausgelesen und die Profile der Reihe nach abgearbeitet.

… Diese umgekehrte Logik wäre im Hinblick auf den watchdog Zusatz gut … Damit lassen sich verschiedene Profile in einem Durchlauf benutzen . Das geht jetzt nicht. Wenn Profil X aktiv ist bleiben alle Dateien unverarbeitet, die nicht den passenden Präfix haben. Dann müsste ich jetzt erst ein anderes Profil per Hand aktivieren und einen neuen Durchlauf starten. Mit der neuen Logik würden alle Dateien verarbeitet werden …
Watchdog hat bei mir inzwischen etwas an Beachtung verloren, da ja z.B. ein minütlicher Aufruf über den Aufgabenplaner genauso wirkungsvoll ist.
Es werden immer alle Profile abgearbeitet (sofern sie nicht 'deaktiviert' wurden).
Sorry, aber ich sehe jetzt nicht den Mehrwert, der den Aufwand rechtfertigen würde, den gesamten Ablauf umzukrempeln.


Derzeit stürmt mein Brain je bzgl. anderer Probleme.

  1. ich brauche einen Webentwickler
    gibt es eine Möglichkeit, das Formularfeld für die Tags übersichtlicher zu gestalten? Ich dachte da an eine Tabelle mit einer variablen Anzahl an Zeilen …
    Die Zeilen trennen die Tags; eine Spalte für den Tag (Suchstring) und eine für die Kategorie; ggf. eine für einen Tagalias (die Tagsuche nach der Versicherungsnr. setzt z.B. den Tag Hausratversicherung)
  2. wer kennt sich mit RegEx im erweiterten Sinn aus?
    Man kann natürlich eine gezielte Tagsuche im Skript mit grep realisieren. Das überfordert aber einen Großteil der User. Ich suche eine einfache Syntax, wobei auch AND OR XOR ect. Beachtung finden. Ich würde die Tags gerne in der GUI so aufnehmen, dass es einer Google-Suche ähnelt. Es sollte also ein möglichst einfacher String (human readable :)) sein. Ich hatte vermutet, dass es für so etwas Hilfsskripte gibt, die einen Suchstring zu grep übersetzen, aber nichts Passendes gefunden. Jemand eine Idee?
 

TeXniXo

Benutzer
Mitglied seit
07. Mai 2012
Beiträge
4.948
Punkte für Reaktionen
100
Punkte
134
@olli2: Ok, das mit dem OCR kann ich verstehen, hatte auch eine Zeitlang Scanbot benutzt - oft parallel zu den anderen Apps. Aber im Endeffekt bin ich doch immer wieder bei der App Scanner Pro gelandet, sodass ich nur noch sie verwende. Damit hab ich mit oder ohne Ladekabel keine Probleme :)

@gemist: Ja, das musst eh du selbst entscheiden, wie du es handhaben magst. - Ad 1 und Ad 2 - da bin ich leider raus :eek:
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.517
Punkte für Reaktionen
1.354
Punkte
234
… Aber im Endeffekt bin ich doch immer wieder bei der App Scanner Pro gelandet, sodass ich nur noch sie verwende …

Bei der bin ich auch gelandet und finde sie nach wie vor am besten (für unterwegs - zu Hause gibt's den Dokumentenscanner).
 

olli2

Benutzer
Mitglied seit
04. Apr 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Die Sache ist ja die, dass es keinen globalen Quellpfad gibt. Der Quellpfad selbst wird ja erst aus den Profilen ausgelesen und die Profile der Reihe nach abgearbeitet.
Jetzt hab ich die for Schleife auch gesehen, in der alle Profile abgearbeitet werden. Hast Recht, dann brauch man die Logik nicht umdrehen.

Aber die Auswahl des Trennzeichens für die Tags in der GUI wäre Klasse. Da würde ich mich freuen wenn du das einbauen könntest.

Was schwebt dir denn bei den RegEx so vor? Vielleicht kann ich da helfen.
 

olli2

Benutzer
Mitglied seit
04. Apr 2019
Beiträge
5
Punkte für Reaktionen
0
Punkte
0
Hab jetzt eine Lösung mit Scanbot gefunden.:D
Ich habe im Profil bei den OCR Optionen den Schalter -s raus und --force-ocr rein genommen. Nun ist es egal ob Scanbot eine OCR Erkennung gemacht hat oder nicht. Jetzt funktioniert das taggen.
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
6.057
Punkte für Reaktionen
1.855
Punkte
254


 

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