synOCR synOCR - GUI für OCRmyPDF

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Was mir aufgefallen ist, ich habe pdf's in den input ordner geschoben, die wurden auch alle bearbeitet, im output Ordner aber unter root:root abgelegt, obwohl ich das ganze unter einem andern user gemacht habe, im BACKUP landen sie mit den richtigen rechten. …
Das mit den Rechten, scheint noch nicht optimal zu laufen. Hast du generell Probleme beim Zugriff?
Die Backup-Dateien sind ja lediglich die Originale, welche verschoben werden. Die im Outputordner sind komplett neu erstellt.

Ich hatte micky1067 schonmal einen Tipp gegeben. Vielleicht kannst du das mal probieren:
https://www.synology-forum.de/showt...I-für-OCRmyPDF&p=843130&viewfull=1#post843130

… warum sehe ich den Docker Container nicht unter Docker, sondern nur unter Abbild? …
Weil der Container nur temporär für jede einzelne PDF erstellt wird. Das soll so sein.

… Könnte man da auch einen zweistufigen Prozess machen?
  • Also es gibt einen zentralen Input Ordner, da kommt alles rein.
  • dann werden bestimmte Tag's gesucht in den Dokumenten (z.B. Name aus der Anschrift) danach wird "vorsortiert"
  • über die Vorsortierung wird nun noch mal sortiert, so das zu jedem Namen z.B. Rechnungen , Versicherungen angelegt werden.
Ist sowas machbar?…
Die Suche / Verschlagwortung soll eh noch verbessert werden, aber ich habe schon an anderer Stelle geschrieben, dass ich mich da mit meinen amateurhaften Fähigkeiten überfordert sehe (z.B. auch, wie man komplexere Regeln in der GUI abbilden könnte) …

… Ach so, wie kann ich mir die OCR Texte in den PDF's am besten anzeigen lassen? Copy&Paste habe ich mal gemacht, aber etwas umständlich, geht das einfacher?
Das mache ich gar nicht. Mir ist es wichtig, dass die Dokumente durchsuchbar sind und ich sie so mit der systemweiten Suche finden kann. Es gibt aber auf der DS ein Kommandozeilenprogramm pdftotxt
/bin/pdftotext "/Pfad/PDFdatei.pdf" "/Pfad/textfile.txt"
 

jxsl13

Benutzer
Mitglied seit
22. Aug 2018
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
Datums-Parser

Hatte leider wenig Zeit auf den Post vorher zu antworten, hier mal ein Python Beispiel, man muss halt die Monats-Strings vorhalten:


Rich (BBCode):
#!/bin/env python3


from dateutil.parser import parse
from dateutil.tz import tzlocal
from datetime import date as d
import re

lst = [
["January",
"Januar",
"Januarie",
"??????",
"??",
"sije?anj",
"leden",
"januar",
"januari",
"January",
"tammikuu",
"janvier",
"Januar",
"??????????",
"január",
"gennaio",
"1?",
"1?",
"januar",
"stycze?",
"janeiro",
"ianuarie",
"??????",
"januari",
"január",
"januar",
"enero",
"Ocak",
"??????",
"tháng m?t",],
["February",
"Februar",
"Februarie",
"????????",
"??",
"velja?a",
"únor",
"februar",
"februari",
"February",
"helmikuu",
"février",
"Februar",
"???????????",
"február",
"febbraio",
"2?",
"2?",
"februar",
"luty",
"fevereiro",
"februarie",
"???????",
"februari",
"február",
"februar",
"febrero",
"?ubat",
"?????",
"Tháng Hai",],
["March",
"März",
"Maart",
"????",
"??",
"ožujak",
"b?ezen",
"marts",
"maart",
"March",
"maaliskuu",
"mars",
"März",
"???????",
"március",
"marzo",
"3?",
"3?",
"mars",
"marzec",
"março",
"martie",
"????",
"mars",
"marec",
"marec",
"marzo",
"Mart",
"????????",
"di?u hành",],
["April",
"April",
"April",
"?????",
"??",
"travanj",
"duben",
"april",
"april",
"April",
"huhtikuu",
"avril",
"April",
"????????",
"április",
"aprile",
"4?",
"4?",
"april",
"kwiecie?",
"abril",
"aprilie",
"??????",
"april",
"apríl",
"april",
"abril",
"Nisan",
"???????",
"Tháng T?",],
["May",
"Mai",
"Mei",
"???",
"??",
"svibanj",
"kv?ten",
"maj",
"mei",
"May",
"saattaa",
"mai",
"Mai",
"?????",
"május",
"maggio",
"5?",
"5?",
"mai",
"maj",
"maio",
"mai",
"???",
"maj",
"máj",
"maj",
"mayo",
"May?s",
"???????",
"có th?",],
["June",
"Juni",
"Junie",
"???",
"??",
"lipanj",
"?erven",
"juni",
"juni",
"June",
"kesäkuu",
"juin",
"Juni",
"???????",
"június",
"giugno",
"6?",
"6?",
"juni",
"czerwiec",
"junho",
"iunie",
"????",
"juni",
"jún",
"junij",
"junio",
"Haziran",
"???????",
"Tháng Sáu",],
["July",
"Juli",
"Julie",
"???",
"??",
"srpanj",
"?ervenec",
"juli",
"juli",
"July",
"heinäkuu",
"juillet",
"Juli",
"???????",
"július",
"luglio",
"7?",
"7?",
"juli",
"lipiec",
"julho",
"iulie",
"????",
"juli",
"júl",
"julij",
"julio",
"Temmuz",
"??????",
"Tháng B?y",],
["August",
"August",
"Augustus",
"??????",
"??",
"kolovoz",
"srpen",
"august",
"augustus",
"August",
"elokuu",
"août",
"August",
"?????????",
"augusztus",
"agosto",
"8?",
"8?",
"august",
"sierpie?",
"agosto",
"august",
"??????",
"augusti",
"august",
"avgust",
"agosto",
"A?ustos",
"???????",
"uy nghi",],
["September",
"September",
"September",
"?????????",
"??",
"rujan",
"zá?í",
"september",
"september",
"September",
"syyskuu",
"septembre",
"September",
"???????????",
"szeptember",
"settembre",
"9?",
"9?",
"september",
"wrzesie?",
"setembro",
"septembrie",
"????????",
"september",
"septembra",
"september",
"septiembre",
"Eylül",
"????????",
"Tháng Chín",],
["October",
"Oktober",
"Oktober",
"????????",
"??",
"listopad",
"?íjen",
"oktober",
"oktober",
"October",
"lokakuu",
"octobre",
"Oktober",
"?????????",
"október",
"ottobre",
"10?",
"10?",
"oktober",
"pa?dziernik",
"outubro",
"octombrie",
"???????",
"oktober",
"október",
"oktober",
"octubre",
"Ekim",
"???????",
"Tháng M??i",],
["November",
"November",
"November",
"???????",
"???",
"studeni",
"listopad",
"november",
"november",
"November",
"marraskuu",
"novembre",
"November",
"?????????",
"november",
"novembre",
"11?",
"11?",
"november",
"listopad",
"novembro",
"noiembrie",
"??????",
"november",
"november",
"november",
"noviembre",
"Kas?m",
"????????",
"Tháng M??i M?t",]
,
["December",
"Dezember",
"Desember",
"????????",
"???",
"prosinac",
"prosinec",
"december",
"december",
"December",
"joulukuu",
"décembre",
"Dezember",
"??????????",
"december",
"dicembre",
"12?",
"12?",
"desember",
"grudzie?",
"dezembro",
"decembrie",
"???????",
"december",
"december",
"december",
"diciembre",
"Aral?k",
"???????",
"Tháng m??i hai",]
]


month_name_map = {}

def prepare(line: str) -> str:
    global month_name_map

    # first : int[int]....int[int]..intintint
    # second: int[int]<len(whitspace) > 0><non whitespace...><len(whitspace) > 0>intintint
    regex =[
        r"([\d]{1,2}).+([\d]{1,2}).+([\d]{4})",
        r"([\d]{1,2})[.\s]+([\S]+)[\s]+([\d]{4})",    
    ]
    for r in regex:
        match = re.search(r, line)
        if match:
            day = match.group(1).strip()    # remove potential whitespace
            month = match.group(2).strip()  # remove potential whitespace
            year = match.group(3).strip()   # remove potential whitespace
            try:
                date = d(year=int(year), month=int(month), day=int(day))
                return date.isoformat()
            except:
                try:
                    month = month_name_map[month] # January -> 1
                    date = d(year=int(year), month=int(month), day=int(day))
                    return date.isoformat()
                except:
                    continue

    # no match, return input string  
    return line

def init_months_names_map():
    global month_name_map

     # initialize dictionary with every possible capitalization
    for idx, month_names in enumerate(lst):
        for month in month_names:
            number = idx + 1
            month_name_map[month] = number
            month_name_map[month.lower()] = number
            month_name_map[month.upper()] = number
            month_name_map[month.capitalize()] = number
            month_name_map[month.casefold()] = number
            
            short_name = f"{month[:3]}." # Mär. Okt. etc.
            month_name_map[short_name] = number


if __name__ == "__main__":
    init_months_names_map()

    lines = [
        "das Datum 17. Oktober 2019 mit ausgeschriebenen Monat", 
        "das Datum 9.5.2019 wird amerikanisch interpretiert (scheint immer dann der Fall zu sein, wenn die fuehrende Null fehlt)", 
        "das Datum 9.7.2015 wird nicht erkannt (scheint immer dann der Fall zu sein, wenn noch weitere Zahlen in der Zeile vorkommen 0 )", 
        "12.9.1998", 
        "12. Sep. 2019",
        "13. Okt. 2019",
        "14. Mär. 2019"
        ]

    #with open('/volume1/DEV/datetest.txt', 'r') as lines:
    for txt in lines:
        try:
            date = parse(prepare(txt), fuzzy=True, tzinfos=[tzlocal()])
            date.year
            date.month
            date.day
        except ValueError:
            print("\t\t\tERROR, unknown format:", txt)
        else:
            print(date)
 

jxsl13

Benutzer
Mitglied seit
22. Aug 2018
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
In etwas schöner:

Rich (BBCode):
#!/bin/env python3

from dateutil.parser import parse
from dateutil.tz import tzlocal
from datetime import date as d
import re
import sys

lst = [
    ["January",
     "Januar",
     "Januarie",
     "??????",
     "??",
     "sije?anj",
     "leden",
     "januar",
     "januari",
     "January",
     "tammikuu",
     "janvier",
     "Januar",
     "??????????",
     "január",
     "gennaio",
     "1?",
     "1?",
     "januar",
     "stycze?",
     "janeiro",
     "ianuarie",
     "??????",
     "januari",
     "január",
     "januar",
     "enero",
     "Ocak",
     "??????",
     "tháng m?t", ],
    ["February",
     "Februar",
     "Februarie",
     "????????",
     "??",
     "velja?a",
     "únor",
     "februar",
     "februari",
     "February",
     "helmikuu",
     "février",
     "Februar",
     "???????????",
     "február",
     "febbraio",
     "2?",
     "2?",
     "februar",
     "luty",
     "fevereiro",
     "februarie",
     "???????",
     "februari",
     "február",
     "februar",
     "febrero",
     "?ubat",
     "?????",
     "Tháng Hai", ],
    ["March",
     "März",
     "Maart",
     "????",
     "??",
     "ožujak",
     "b?ezen",
     "marts",
     "maart",
     "March",
     "maaliskuu",
     "mars",
     "März",
     "???????",
     "március",
     "marzo",
     "3?",
     "3?",
     "mars",
     "marzec",
     "março",
     "martie",
     "????",
     "mars",
     "marec",
     "marec",
     "marzo",
     "Mart",
     "????????",
     "di?u hành", ],
    ["April",
     "April",
     "April",
     "?????",
     "??",
     "travanj",
     "duben",
     "april",
     "april",
     "April",
     "huhtikuu",
     "avril",
     "April",
     "????????",
     "április",
     "aprile",
     "4?",
     "4?",
     "april",
     "kwiecie?",
     "abril",
     "aprilie",
     "??????",
     "april",
     "apríl",
     "april",
     "abril",
     "Nisan",
     "???????",
     "Tháng T?", ],
    ["May",
     "Mai",
     "Mei",
     "???",
     "??",
     "svibanj",
     "kv?ten",
     "maj",
     "mei",
     "May",
     "saattaa",
     "mai",
     "Mai",
     "?????",
     "május",
     "maggio",
     "5?",
     "5?",
     "mai",
     "maj",
     "maio",
     "mai",
     "???",
     "maj",
     "máj",
     "maj",
     "mayo",
     "May?s",
     "???????",
     "có th?", ],
    ["June",
     "Juni",
     "Junie",
     "???",
     "??",
     "lipanj",
     "?erven",
     "juni",
     "juni",
     "June",
     "kesäkuu",
     "juin",
     "Juni",
     "???????",
     "június",
     "giugno",
     "6?",
     "6?",
     "juni",
     "czerwiec",
     "junho",
     "iunie",
     "????",
     "juni",
     "jún",
     "junij",
     "junio",
     "Haziran",
     "???????",
     "Tháng Sáu", ],
    ["July",
     "Juli",
     "Julie",
     "???",
     "??",
     "srpanj",
     "?ervenec",
     "juli",
     "juli",
     "July",
     "heinäkuu",
     "juillet",
     "Juli",
     "???????",
     "július",
     "luglio",
     "7?",
     "7?",
     "juli",
     "lipiec",
     "julho",
     "iulie",
     "????",
     "juli",
     "júl",
     "julij",
     "julio",
     "Temmuz",
     "??????",
     "Tháng B?y", ],
    ["August",
     "August",
     "Augustus",
     "??????",
     "??",
     "kolovoz",
     "srpen",
     "august",
     "augustus",
     "August",
     "elokuu",
     "août",
     "August",
     "?????????",
     "augusztus",
     "agosto",
     "8?",
     "8?",
     "august",
     "sierpie?",
     "agosto",
     "august",
     "??????",
     "augusti",
     "august",
     "avgust",
     "agosto",
     "A?ustos",
     "???????",
     "uy nghi", ],
    ["September",
     "September",
     "September",
     "?????????",
     "??",
     "rujan",
     "zá?í",
     "september",
     "september",
     "September",
     "syyskuu",
     "septembre",
     "September",
     "???????????",
     "szeptember",
     "settembre",
     "9?",
     "9?",
     "september",
     "wrzesie?",
     "setembro",
     "septembrie",
     "????????",
     "september",
     "septembra",
     "september",
     "septiembre",
     "Eylül",
     "????????",
     "Tháng Chín", ],
    ["October",
     "Oktober",
     "Oktober",
     "????????",
     "??",
     "listopad",
     "?íjen",
     "oktober",
     "oktober",
     "October",
     "lokakuu",
     "octobre",
     "Oktober",
     "?????????",
     "október",
     "ottobre",
     "10?",
     "10?",
     "oktober",
     "pa?dziernik",
     "outubro",
     "octombrie",
     "???????",
     "oktober",
     "október",
     "oktober",
     "octubre",
     "Ekim",
     "???????",
     "Tháng M??i", ],
    ["November",
     "November",
     "November",
     "???????",
     "???",
     "studeni",
     "listopad",
     "november",
     "november",
     "November",
     "marraskuu",
     "novembre",
     "November",
     "?????????",
     "november",
     "novembre",
     "11?",
     "11?",
     "november",
     "listopad",
     "novembro",
     "noiembrie",
     "??????",
     "november",
     "november",
     "november",
     "noviembre",
     "Kas?m",
     "????????",
     "Tháng M??i M?t", ],
    ["December",
     "Dezember",
     "Desember",
     "????????",
     "???",
     "prosinac",
     "prosinec",
     "december",
     "december",
     "December",
     "joulukuu",
     "décembre",
     "Dezember",
     "??????????",
     "december",
     "dicembre",
     "12?",
     "12?",
     "desember",
     "grudzie?",
     "dezembro",
     "decembrie",
     "???????",
     "december",
     "december",
     "december",
     "diciembre",
     "Aral?k",
     "???????",
     "Tháng m??i hai", ]
]


month_name_map = {}


def prepare(line: str) -> str:
    global month_name_map

    # first : int[int]....int[int]..intintintint
    # second: int[int]<len(whitspace) > 0><non whitespace...><len(whitspace) > 0>intintintint
    regex = [
        r"([\d]{1,2}).+([\d]{1,2}).+([\d]{4})",
        r"([\d]{1,2})[.\s]+([\S]+)[\s]+([\d]{4})",
    ]
    for r in regex:
        match = re.search(r, line)
        if match:
            # these are strings
            day = match.group(1)
            month = match.group(2)
            year = match.group(3)
            try:
                date = d(year=int(year), month=int(month), day=int(day))
                return date.isoformat()
            except:
                try:
                    month = month_name_map[month]  # January -> 1
                    date = d(year=int(year), month=int(month), day=int(day))
                    return date.isoformat()
                except:
                    continue

    # no match, return input string
    return line


def init_months_names_map():
    global month_name_map

    # initialize dictionary with every possible capitalization
    for idx, month_names in enumerate(lst):
        for month in month_names:
            
            number = idx + 1
            month_name_map[month] = number
            month_name_map[month.lower()] = number
            month_name_map[month.upper()] = number
            month_name_map[month.capitalize()] = number
            month_name_map[month.casefold()] = number

            # every possible abbreviation beginning with the first 3 characters
            for i in range(3, len(month)):
                short_name = f"{month[:i]}."  # Mär. Okt. etc.(len = 3), Okto. Oktob, Oktobe.(len [4, 5, 6, ...])
                month_name_map[short_name] = number
                month_name_map[short_name.lower()] = number
                month_name_map[short_name.upper()] = number
                month_name_map[short_name.capitalize()] = number
                month_name_map[short_name.casefold()] = number


if __name__ == "__main__":
    init_months_names_map()
    timzone = tzlocal()
    
    # retrieve command line arguments
    arguments = sys.argv[1:]
    arg_string = " ".join(arguments)
    has_args = True if len(arg_string) > 0 else False
    

    lines = [
        "das Datum 17. Oktober 2019 mit ausgeschriebenen Monat",
        "das Datum 9.5.2019 wird amerikanisch interpretiert (scheint immer dann der Fall zu sein, wenn die fuehrende Null fehlt)",
        "das Datum 9.7.2015 wird nicht erkannt (scheint immer dann der Fall zu sein, wenn noch weitere Zahlen in der Zeile vorkommen 0 )",
        "12.9.1998",
        "12. Sep. 2019",
        "13. Okt. 2019",
        "14. Mär. 2019"
    ]

    #with open('/volume1/DEV/datetest.txt', 'r') as lines:
    for txt in lines:
        try:
            dt = parse(prepare(txt), fuzzy=True, tzinfos=[timzone])
            
        except ValueError:
            print("\t\t\tERROR, unknown format:", txt)
        else:
            print(dt.date())
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Vielen Dank, jxsl13. Das klingt spannend.
Zunächst hatte ich ein Encoding-Error, der sich mit nachstehender Zeile (nach der Shebang) abstellen ließ:
Rich (BBCode):
# - *- coding: utf- 8 - *-

Allerdings bekomme ich einen anderen Syntaxerror:
Rich (BBCode):
  File "/volume3/DEV/datetest.py", line 377
    def prepare(line: str) -> str:
                    ^
SyntaxError: invalid syntax

Mit python3 kommt der Fehler:
Rich (BBCode):
  File "/volume3/DEV/datetest.py", line 426
    short_name = f"{month[:i]}."  # Mär. Okt. etc.(len = 3), Okto. Oktob, Oktobe.(len [4, 5, 6, ...])
                               ^
SyntaxError: invalid syntax

Am liebsten wäre es mir, wenn man das systemeigene Python (/bin/python) verwenden könnte, um dem User eine weitere Paketinstallation zu ersparen.

Kannst du mir da helfen?
 
Zuletzt bearbeitet:

jxsl13

Benutzer
Mitglied seit
22. Aug 2018
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
für diese Syntax wird meine ich Python 3.6 oder 3.7 vorausgesetzt.


alternativ:
anstatt
Rich (BBCode):
short_name = f"{month[:i]}."

short_name = month[:i] + "."

und für den anderen anstatt:

Rich (BBCode):
def prepare(line: str) -> str:

def prepare(line):
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Im Paketzentrum gibt es nur 3.5 … :(
2.7 wäre Ideal - dann könnte man sich die zusätzliche Paketinstallation sparen.
 
Zuletzt bearbeitet:

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
für diese Syntax wird meine ich Python 3.6 oder 3.7 vorausgesetzt.
alternativ:
anstatt
Rich (BBCode):

Da geht's gleich weiter:
Rich (BBCode):
Traceback (most recent call last):
  File "/volume3/DEV/datetest.py", line 436, in <module>
    init_months_names_map()
  File "/volume3/DEV/datetest.py", line 423, in init_months_names_map
    month_name_map[month.casefold()] = number
AttributeError: 'str' object has no attribute 'casefold'
 

jxsl13

Benutzer
Mitglied seit
22. Aug 2018
Beiträge
14
Punkte für Reaktionen
0
Punkte
1
python 2 macht wenig sinn, weil's in einem Monat nicht mehr weiterentwickelt wird und somit python 3 in naher Zukunft
default installiert sein wird. casefold gibt's seit 3.3. kannst die Zeile auch weglassen, weil's keine Alternative
gibt.


kleine Anregung für ein neues Konfigurationsformat:

Rich (BBCode):
{
  "selection" : "percentual|absolute|any_category",
  "case_sensitivity" : "sensitive|insensitive",
  "tagging" : "categorize|tag_names|both",
  "date_after" : "01.01.2000",
  "categories":
  {
    "Arbeitsverhältnisse" : ["Abrechnung", "Bundesknappschaft"],
    "Banking" : ["Sparkasse", "$N26"],
    "Rechnungen" : ["$RECHNUNG", "$Rechnung", "Quittung"],
    "Versicherungen" : ["HanseMerkur", "Lebensversicherung", "$AOK", "Rentenversicherung", "Allianz"],
    "Finazamt" : ["Berechnung des zu versteuernden Einkommens"],
    "Familienkasse" : ["Kindergeld"]
  }
}
 
Zuletzt bearbeitet:

Autoladen

Benutzer
Mitglied seit
24. Mrz 2017
Beiträge
2
Punkte für Reaktionen
0
Punkte
1
bei mir funtioniert fast alles auf anhieb bis auf Automatiches Drehen -r
Ich hab es für lieferscheine die ich von meinem Großhändlern bekomme, nur ist es so das ein Händler die lieferscheine Quer druckt und das Automatische Drehen nicht funktioniert -rd -l deu
Ich scanne mit SW 300dpi aber egal was ich einstelle es ist immer Quer :confused:
 

peterhoffmann

Benutzer
Sehr erfahren
Mitglied seit
17. Dez 2014
Beiträge
5.541
Punkte für Reaktionen
1.385
Punkte
234
@Autoladen
Wenn die Lieferscheine quer gedruckt sind, ist es doch richtig, wenn es so bleibt, sprich sie quer sind.
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Hallo Autoladen
herzlich willkommen im Forum.

Der Parameter -r ist ja richtig. Warum er bei dir nicht greift, ist für mich schwer zu sagen (von mir ist ja nur die GUI). Meine Tests haben gezeigt, dass oft Dokumente richtig gedreht werden, die um 90° nach rechts gedreht waren, welche mit 90° nach links jedoch nicht. Evtl. hilft es schon, entsprechend zu scannen (also um 180° gedreht).

Man kann die Stärke der Erkennung aber auch etwas beeinflussen:
Füge mal dazu bitte --rotate-pages-threshold 5 hinzu. Das sorgt für eine etwas aggressivere Ausrichtungskorrektur (mit der Gefahr, dass korrekt ausgerichtete Seiten fälschlicherweise gedreht werden).
Mit dem Wert kannst du etwas experimentieren (ich habe keine Doku zu diesem Parameter gefunden).

Als Beispiel sieht meine Parameterzeile so aus:
Rich (BBCode):
--rotate-pages --rotate-pages-threshold 5 -dfc --clean-final -l deu --jbig2-lossy --optimize 3

… Wenn die Lieferscheine quer gedruckt sind, ist es doch richtig, wenn es so bleibt, sprich sie quer sind.
Gescannt wird aber in der Regel längs und entsprechend ist dann das PDF falsch ausgerichtet.
 

anton7

Benutzer
Mitglied seit
24. Jan 2015
Beiträge
27
Punkte für Reaktionen
2
Punkte
3
erstmal besten Dank hier für die Entwicklung und Hilfe. Die Installation klappte gut und die ersten Tests sind gelaufen. Das Ergebnis sind natürlich Fragen und Verbesserungsvorschläge. ;-)

zu OCRmyPDF:
1. Warum werden nur die Dateien mit der Endung "pdf" verarbeitet? Wenn "tif" und "jpg" einfach um die Endung "pdf" ergänzt werden, werden diese weitgehend anstandslos konvertiert. Gibt es eine Einstellung, damit auch die Bilddateien verarbeitet werden? Wenn nicht, ist das hier ein Feature-Request.

2. Russische / Ukrainische Texte werden zwar auch konvertiert, aber wenn ich den Text kopiere und in Word / Ultraedit einfüge, handelt es sich nicht um die kyrillische Schrift, sondern Kauderwelsch. Kann man hier etwas tun?


Allgemein:
Gibt es OCR-Programme, welche die Handschrift und vor allem auch alte handschriftliche Texte aus Kirchenbüchern umwandeln können?
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
  1. diese Lösung ist eher quick&dirty und funktioniert nicht zuverlässig. Es steht aber auf der Liste, dass wir da eine bessere Lösung hinbekommen
  2. Hast du auch die passende Sprache in den Optionen angegeben? (-l rus+ukr)
    Welches OCRmyPDF-Image verwendest du dafür?
    Falls dir du das ocrmypdf-polyglot Image nicht mehr installiert hast (es steht im Docker-Hub nicht mehr zur Verfügung), so kannst du es von meinem Server nachinstallieren. In einem nächsten Release werde ich eine eigene polyglot-Version, welche auf einem aktuellen OCRmyPDF-Image aufbaut, anbieten
    das letzte polyglot-Image installieren - dazu als root:
    Rich (BBCode):
    wget -O - "https://geimist.eu/synOCR/images/jbarlow83_ocrmypdf-polyglot_latest.tar.gz" | docker image load
  3. das ist meines Wissens selbst im professionellen Bereich eine große Herausvorderung - meines Wissens gibt es kein entsprechendes Sprachpaket von Tesseract. Was es gibt, ist z.B. deutsch Fraktur (Sprachcode -l frk unter Nutzung des polyglot-Image)
 

anton7

Benutzer
Mitglied seit
24. Jan 2015
Beiträge
27
Punkte für Reaktionen
2
Punkte
3
Im Docker habe ich ocrmypdf1:latest und testweise jetzt ocrmypdf-polyglot:latest.
In den Optionen von synOCR dann "-srd -l deu+rus+ukr" eingetragen und dann jeweils ocrmypdf1:latest und polyglot:latest ausgewählt. In beiden Fällen erhalte ich leider die Fehlermeldung
"ERROR - The installed version of tesseract does not have language data for the following requested languages: ukr rus".
Da ich mich da aber nicht wirklich auskenne, könnte es sich auch um Bedienfehler handeln. Sicherheitshalber die Screenshots von Docker und syOCR:

1.png
2.png
3.png
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Die Container kannst du löschen - die brauchst du nicht.
geimist/ocrmypdf-polyglot wird erst in der nächsten synOCR-Version auswählbar sein.

Generell benötigst du ein Image mit den passenden Sprachen. In synOCR auswählbar ist dafür derzeit nur jbarlow83/ocrmypdf-polyglot (welches im Docker Hub aber leider nicht mehr zur Verfügung steht). Das habe ich noch archiviert und du kannst es nachladen:

Mach bitte folgendes:
  • Du kennst dich mit der Kommandozeile aus?
    • Dann als User root wie oben geschrieben den Befehl absetzen
      Rich (BBCode):
      /bin/wget -O - "https://geimist.eu/synOCR/images/jbarlow83_ocrmypdf-polyglot_latest.tar.gz" | /usr/local/bin/docker image load
  • Wenn du nicht weißt, wie du das machen sollst, dann gehe den Weg über den Aufgabenplaner:
    • Systemsteuerung > Aufgabenplaner > Button "erstellen" > "Geplante Aufgabe" > "Benutzerdefiniertes Skript"
    • Benutzer: root
    • kein Zeitplan (Haken bei "aktiv" entfernt)
    • diese Zeile bei "Aufgabeneinstellungen"
      Rich (BBCode):
      /bin/wget -O - "https://geimist.eu/synOCR/images/jbarlow83_ocrmypdf-polyglot_latest.tar.gz" | /usr/local/bin/docker image load
    • Die Aufgabe einmal ausführen.
      Es sollte jetzt das Image (Abbild) jbarlow83/ocrmypdf-polyglot geladen werden und nach einer Weile vorhanden sein.
  • synOCR > Konfiguration: hier wählst du das Image "jbarlow83/ocrmypdf-polyglot:latest" aus
 
Zuletzt bearbeitet:

anton7

Benutzer
Mitglied seit
24. Jan 2015
Beiträge
27
Punkte für Reaktionen
2
Punkte
3
Der Weg mit der Aufgabenplanung hat funktioniert, besten Dank. Fas alle Buchstaben sind jetzt korrekt, nur ein paar Einzelfälle passen nicht.
 

geimist

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
04. Jan 2012
Beiträge
5.381
Punkte für Reaktionen
1.195
Punkte
234
Sehr schön! Da scheint es ja jetzt grundsätzlich zu funktionieren.

Ich habe keine Erfahrung, ob sich mehrere Sprachparameter auf die Qualität auswirken. Ggf. würde ich dir empfehlen (vielleicht mal testen), für jede Sprache ein eigenes synOCR Profil mit separatem Eingangsordner anzulegen.

Über Feedback würde ich mich freuen.
 

anton7

Benutzer
Mitglied seit
24. Jan 2015
Beiträge
27
Punkte für Reaktionen
2
Punkte
3
Ob ein oder mehrere Sprachparameter übergeben werden, wirkt sich nicht auf die Qualität der Konvertierung aus. Die Laufzeit ist auch ähnlich. Lässt sich eigentlich die Konvertierungszeit verbessern? RAM-Verbrauch ist vernachlässigbar, CPU-Auslastung steigt auf ca. 30% an.

Hier ein Beispiel für die russische Schrift, die Abweichungen sind fett markiert:

1.jpg

Ist:
?????? 43 ????? ??????? ??????? ??. 19 ? ? ??'. |
? ??? ?????? ??????? ????? ???????????? ????????? ?????? ??????????. ????????????
_ ??????????? ?????? ???????, ???????????? ? ??????????????? ?????????. |.
?? ????????? ??????? ?????? ???????? ?????????? ?. ?. ?. ?; ‚?? 17-?? ??????? 1919 ????.

Soll:
?????? ?? ????? ??????? ??????? ??. 1919 ???.
???'?????? ??????? ????? ???????????? ????????? ?????? ?????????? ????????????
??????????? ?????? ???????, ???????????? ? ??????????????? ?????????.
?? ????????? ??????? ?????? ???????? ?????????? ?. ?. ?. ?. ?? 17-?? ??????? 1919 ????.
 


 

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