Zum Hauptinhalt springen
Dieses Kapitel beschreibt mehrere typische Möglichkeiten, FlexiLayouts zu erstellen, die auf Bildern niedriger Qualität nach Datumsfeldern suchen. Solche Bilder kommen recht häufig vor und weisen verschiedene Scanfehler auf, die meist durch falsche Scaneinstellungen verursacht werden. So kann das Bild beispielsweise zu hell oder zu dunkel sein, wenn die Helligkeitseinstellungen nicht korrekt sind. Dadurch können Informationen im Bild verloren gehen oder Bildbereiche verrauscht sein. FlexiLayout Studio bietet ein spezielles Date-Element zum Erkennen von Datumsangaben. Beim Erstellen eines FlexiLayout kann sich dieses Element jedoch als unzureichend erweisen. Das kann passieren, wenn das Datum in den Dokumenten keinem der im Date-Element verfügbaren Formate entspricht. So unterstützt FlexiLayout Studio für die Angabe des Monats im Datumsfeld die folgenden Sprachen: Englisch, Tschechisch, Dänisch, Niederländisch, Estnisch, Finnisch, Französisch, Deutsch, Griechisch, Ungarisch, Italienisch, Lettisch, Litauisch, Norwegisch, Polnisch, Portugiesisch, Russisch, Spanisch, Schwedisch und Türkisch. Wenn der Monat also in einer anderen als den angegebenen Sprachen ausgeschrieben ist, entspricht das Datum keinem der verfügbaren Formate, und Sie können es daher nicht mithilfe eines Date-Elements erkennen. Fehler bei der Datumssuche können auch auftreten, wenn das Bild Elemente enthält, die nicht entfernt werden können. Zum Beispiel kann das Datum unterstrichen sein und es kann keine sichtbare Lücke zwischen dem Datum und der Unterstreichung bestehen, es kann durchgestrichen sein oder in Zeichenfeldern mit schwarzen Trennlinien (Rahmen, Kämmen) stehen. Dass sich das Date-Element nicht für die Datumssuche verwenden lässt, kann auch durch Sprenkel im Suchbereich verursacht werden oder dadurch, dass das Datum nicht gedruckt, sondern handschriftlich eingetragen ist. Die beste Methode, eine Suche nach einem Datumsfeld zu organisieren, wird im Beispielprojekt SearchOfDate.fsp beschrieben (Ordner %public%\ABBYY\FlexiCapture\12.0\Samples\FLS\Tips and Tricks\Date). Es gibt 5 Seiten im Projekt:
  • Seite 1 - das Datumsformat kann mithilfe des Date-Elements beschrieben werden;
  • Seite 2 - der Monat im Datum ist auf Französisch geschrieben;
  • Seite 3 - das Datum ist unterstrichen;
  • Seite 4 - das Datumsfeld ist verrauscht;
  • Seite 5 - das Datum ist handschriftlich ausgefüllt.
Versuchen wir, das Datum auf allen Bildern zu finden, auch auf denen, bei denen das Datumsformat vom Element vom Typ Date nicht unterstützt wird. Alle Elemente, die das Datumsfeld beschreiben, sind in einem Element DateGroup zusammengefasst. Zunächst enthält diese Gruppe ein Element, das nach dem Namen des Datumsfelds sucht. In unserem Projekt ist dies ein Element vom Typ Static Text mit dem Namen DateHeader und dem einzigen Wert ”Date:”.
Das Einrichten der Suchbedingungen für alle Elemente im Abschnitt Relations ist nicht schwierig und wird daher hier nicht beschrieben. Sie können es direkt im Projekt nachsehen.
Als Nächstes erstellen wir ein Element vom Typ Date mit dem Namen DateField. Dieses Element sucht nach Datumsfeldern, deren Format vom Date-Element unterstützt wird. Wie im Projekt zu sehen ist, kann das Date-Element das Datum nur auf der ersten Seite erkennen. Um auf den anderen Seiten nach Datumsangaben zu suchen, wird ein Element vom Typ Zeichenkette erstellt. In unserem Projekt heißt dieses Element DateAsString. Alle Zeichen, die wahrscheinlich auf den Bildern vorkommen, werden in diesem Element mithilfe eines Alphabets dargestellt.
Wenn der Inhalt eines Datenfelds strukturiert werden kann und ein Format aufweist, das vom Element Date nicht unterstützt wird, empfiehlt es sich, statt ein Alphabet anzugeben, dieses Format mithilfe eines regulären Ausdrucks zu beschreiben. Sie müssen sich jedoch der hohen Qualität der verarbeiteten Bilder sicher sein, da ein regulärer Ausdruck eine 100%ige Übereinstimmung des Felds mit der beschriebenen Struktur voraussetzt (Alphabete erlauben dagegen einen bestimmten Prozentsatz an Fehlern, der in den Eigenschaften des Elements angegeben wird). Daher sind Alphabete in Fällen, in denen die Erkennungsgenauigkeit nicht garantiert werden kann, das flexiblere Werkzeug. Wenn Sie wissen, dass der Monat im Datum als Wort in derselben Sprache wie die Vorerkennungssprache geschrieben wird, kann es ratsam sein, das Datumsfeld in drei Abschnitte (Tag, Monat, Jahr) zu unterteilen und das Monatsfeld separat mithilfe eines Elements vom Typ Static Text zu suchen. Ein solches Element vom Typ Static Text sollte alle möglichen Varianten des Monats beschreiben (z. B. ausgeschriebene und abgekürzte Monatsnamen in der betreffenden Sprache). Nach den Feldern für Tag und Jahr wird dann rechts und links des Monats mithilfe von Elementen vom Typ Zeichenkette gesucht.
Um das FlexiLayout-Matching zu optimieren, wird im Feld Advanced pre-search relations für das Element DateAsString die folgende Bedingung verwendet: if (DateField.IsNull == FALSE) then Dontfind(); das entspricht: if not DateField.IsNull then Dontfind(); Diese Bedingung bedeutet, dass nur dann nach dem Datum als Zeichenkette gesucht wird, wenn das Datum nicht mit einem Element vom Typ Date erkannt werden kann. Wie im Projekt zu sehen ist, findet das Element DateAsString das Datum auf den übrigen Projektseiten, auf denen es vom Element vom Typ Date nicht erkannt werden konnte. Auf Seite 4 enthält die erkannte Zeichenkette jedoch nur einen Teil des Datumsfeldes. Wenn Sie sich die Ergebnisse der Vorerkennung für das Datumsfeld ansehen (indem Sie in der Symbolleiste auf Show Raw Objects klicken), wird der Grund für die teilweise Erkennung deutlich: Der Suchbereich enthält nicht nur Textobjekte, sondern auch andere Objekttypen: Picture und Punctuation mark. Eine solche Situation ist typisch für Bilder von geringer Qualität – Textobjekte werden bei der Vorerkennung nicht immer erkannt. Um alle dem Datumsfeld zugeordneten Objekte zu finden, wird ein Element vom Typ Object Collection erstellt und DateAsObjectCollection genannt. In den Eigenschaften dieses Elements werden alle Objekttypen angegeben, die bei der Vorerkennung im Datumsfeld erkannt wurden. Um das FlexiLayout-Matching zu optimieren, wird im Feld Advanced pre-search relations für die Elemente DateAsObjectCollection und DateAsString die folgende Bedingung verwendet:
if (DateField.IsNull == FALSE) then Dontfind();
Die Bedingung if (DateAsString.IsNull == FALSE) then Dontfind() kann nicht zu den erweiterten Eigenschaften des Elements DateAsObjectCollection hinzugefügt werden, weil es, wie aus dem Beispiel ersichtlich ist, Fälle geben kann, in denen die erkannte Zeichenfolge nur einen Teil des Datums enthält.
Damit kann die Erstellung der Elemente, die die Suchbedingungen für die Datumsfelder beschreiben, als abgeschlossen betrachtet werden. Das Gruppenelement SearchElements.DateGroup.AlternativeDateGroup, das aus den Elementen DateField, DateAsString und DateAsObjectCollection besteht, ist im Projektbaum als Quellelement für den Block Date angegeben. Da die Methode Dontfind() zur Beschreibung der Eigenschaften der Elemente DateAsString und DateAsObjectCollection verwendet wurde, entspricht die tatsächliche Region des erkannten Blocks entweder der Region, die durch die Hypothese für das Element Date gefunden wurde, oder den kombinierten Regionen der Elemente DateAsObjectCollection und DateAsString. Im letzteren Fall gehen wir davon aus, dass die Region des Elements DateAsString Teil der Region des Elements DateAsObjectCollection ist, sodass die resultierende Region der Region des Elements DateAsObjectCollection entspricht.
In diesem Fall können wir das Gruppenelement SearchElements.DateGroup.AlternativeDateGroup als Quellelement angeben, weil die Situation relativ einfach ist. Die Region der Gruppe ist eine Kombination der Regionen ihrer erkannten Subelemente. Die Methode Dontfind() ermöglicht es, die Suche nach einigen der Subelemente zu überspringen. Somit entspricht die Region des Gruppenelements SearchElements.DateGroup.AlternativeDateGroup der Region des Subelements. Im vorliegenden Beispiel trägt die Methode Dontfind() nicht nur zur Optimierung des FlexiLayout-Matchings bei, sondern vereinfacht auch die Beschreibung von Blöcken.
Alternativ könnten wir den im Abschnitt Ausdruck angegebenen Code verwenden. Rect OutputRect; let dateGroup = SearchElements.DateGroup.AlternativeDateGroup; if (dateGroup.DateField.IsNull == FALSE) then outputRect = dateGroup.DateField.Rect; else outputRect = dateGroup.DateAsObjectCollection.Rect; OutputRegion = outputRect; Die Verwendung eines Ausdrucks eröffnet zusätzliche Möglichkeiten. Beispielsweise könnten wir prüfen, ob die Region des Elements DateAsString tatsächlich Teil der Region von DateAsObjectCollection ist.
Die Verwendung eines Zeichenkette-Elements, um nach einem Datumsfeld zu suchen, ohne das Format der Zeichenkette zu definieren oder ein Element vom Typ Object Collection zu verwenden, wie im angegebenen Beispiel, kann zu guten Ergebnissen führen, wenn sich der Suchbereich des Datumsfelds klar eingrenzen lässt. Wenn es im Suchbereich jedoch mehrere Zeichenketten gibt, sollte das Format der Zeichenkette mithilfe eines regulären Ausdrucks oder eines stärker eingeschränkten Alphabets beschrieben werden. Andernfalls kann die endgültige Hypothese unbefriedigend sein. Durch die Verwendung eines Elements vom Typ Zeichenkette kann der Benutzer die Anzahl der Zeichen in einer Zeichenkette, die Anzahl der Wortenden und die Länge von Leerzeichen begrenzen, um falsche Hypothesen herauszufiltern. Wenn ein Element vom Typ Object Collection verwendet wird, enthält die Hypothese alle Objekte im Bild, die sich innerhalb des Suchbereichs befinden und die Einschränkungen für die Objektgröße erfüllen.