Im Rahmen der europaweiten SEPA-Einführung mussten viele Unternehmen in den letzten Jahren sogenannte SEPA Lastschriftmandate von ihren Kunden unterschreiben lassen. Die meisten Unternehmen sendeten ein mit den Kundendaten ausgefülltes Formular (das SEPA-Mandat) an den Kunden. Dieser unterschrieb das Mandat und sendete es dann an das Unternehmen zurück.
Einer unserer Versicherungskunden nutzt Kofax Capture und Kofax Transformation Modules (KTM) zur automatisierten Eingangspostverarbeitung. In diesem Zusammenhang mussten dann natürlich auch die SEPA-Mandate erkannt und dem passenden Geschäftsprozess zugeordnet werden.
Hierbei gab es zunächst zwei Prozesse für die SEPA-Mandate:
- Der Kunde hat das Mandat unterschrieben: Das Kennzeichen ‚SEPA-Mandat erteilt‘ wird gesetzt. Es erfolgt keine weitere Verarbeitung.
- Der Kunde hat das Mandat nicht unterschrieben: Anstoss einer weiteren Verarbeitung durch Sachbearbeiter.
In KTM wurde die Unterschriftenerkennung über Zonenerkennung mit Schwärzungsgraden gelöst.
Im Laufe der Zeit wurde das Konzept allerdings etwas verwässert. Einerseits änderten oder ergänzten Kunden die im Formular enthaltenen Kundendaten handschriftlich, da die Daten falsch oder unvollständig waren. Andererseits erhielten manche Kunden auch ‚Blanko‘ SEPA-Mandate, die dann handschriftlich ausgefüllt wurden.
Dadurch wurde bei der Versicherung ein weiterer Verarbeitungsprozess für SEPA-Mandate notwendig:
- Der Kunde hat das Mandat unterschrieben, aber in dem ‚Formularbereich‘, der die Kundendaten enthält, wurde etwas handschriftlich notiert. Hier muss nun ein Prozess zur Änderung bzw. Erfassung der Kundendaten angestossen werden.
Die Herausforderung für KTM bestand nun darin, zu erkennen, ob in bestimmten Regionen des Formulars Handschrift enthalten war.
Hier ein Beispiel eines vollständig maschinell ausgefüllten und vom Kunden unterschriebenen SEPA-Mandats:
Und hier nun ein Beispiel, in dem der Kunde handschriftliche Änderungen hinzugefügt hat:
Zur Identifizierung der handschriftlichen Einträge bietet sich in KTM die OCR-Engine ‚Gemischte Schrift‘ an. Sie dient normalerweise dazu Maschinenschrift und Handschrift auf einem Dokument zu lesen. Allerdings interessiert uns der Inhalt der Handschrift gar nicht, wir wollen ja nur wissen, ob überhaupt handschriftliche Notizen vorhanden sind. Die ‚Gemischte Schrift‘-Engine liefert in unseren Fällen auch meist keine inhaltlichen Ergebnisse, da Maschinen- und Handschrift häufig zeilenweise überlappen oder ineinander übergehen.
Allerdings liefert die Engine Informationen, ob Handschrift überhaupt gefunden wurde. Handschriftliche Kandidaten werden mit sogenannten ‚Boxes‘ gekennzeichnet. Diese kann man sich sehr gut mit dem XDOC Browser aus der KTM-Installation anschauen. Dazu lässt man über ein Dokument zunächst die ‚Gemischte Schrift‘-Engine laufen und schaut sich die daraus resultierende xdc-Datei mit dem XDOC Browser an:
In der ‚Representation 0‘ (die ‚Gemischte Schrift‘-Engine) des obigen Beispiels gibt es drei ‚Boxes‘. Jede Box repräsentiert eine erkannte Stelle mit Kandidaten für Handschrift. Diese Boxes können auch per KTM-Skript abgefragt werden. Legt man nun noch den Bereich der Seite fest, auf dem nach existierenden Boxes gesucht werden soll, hat man bereits alle Voraussetzungen geschaffen, um zu beurteilen, ob handschriftliche Ergänzungen vorliegen.
Zur Festlegung des Suchbereichs könnte man zum Beispiel nach den Begriffen ‚one-off payment‘ (oben rechts, legt obere Grenze der Suchregion fest) und ‚Ich ermächtige‘ (Textblock unterhalb der Kundendaten, legt untere Grenze der Suchregion fest) suchen. Die Suche kann bspw. mit Formatlokatoren oder durch direkte Suche im OCR-Ergebnis durchgeführt werden. Im folgenden Beispiel wird einfach im OCR-Ergebnis gesucht. Die Funktion Ist_Handschrift liefert TRUE, wenn mindestens eine Box in der Suchregion gefunden wurde.
Damit das Beispiel funktioniert muss im KTM Scripting noch eine Referenz auf ‚Kofax Memphis Forms 4.0‘ gesetzt werden:
Im zugrundeliegenden Projekt wird standardmäßig zunächst die OCR-Erkennung mit der RecoStar- oder FineReader-Engine durchgeführt. Zum Test auf vorhandene Handschriftergänzungen kann dann die folgende Funktion genutzt werden:
1Function Ist_Handschrift(pXDoc As CASCADELib.CscXDocument) As Boolean
2'Prüfung, ob ein SEPA-Mandat handschriftlich vom Kunden ergänzt wurde
3
4Dim i As Integer
5Dim BoxAnzahl As Integer
6Dim StartTOP As Long
7Dim EndeTOP As Long
8
9BoxAnzahl=0
10StartTOP=0
11EndeTOP=0
12Ist_Handschrift=False
13
14'Suche 'one-off payment' und addiere auf TOP noch 80. Nur südlich davon nach Handschrift suchen.
15For i=0 To pXDoc.TextLines.Count-1
16 If InStr(LCase(pXDoc.TextLines(i).Text),"one-off payment")>0 Then
17 StartTOP=pXDoc.TextLines(i).Top
18 StartTOP=StartTOP+80 'ungefähre Zeilenhöhe
19 Exit For
20 End If
21Next
22
23'Suche 'Ich ermächtige'. Nur nördlich davon nach Handschrift suchen
24For i=0 To pXDoc.TextLines.Count-1
25 If InStr(LCase(pXDoc.TextLines(i).Text),"ich ermächtige")>0 Then
26 EndeTOP=pXDoc.TextLines(i).Top
27 Exit For
28 End If
29Next
30
31'Re-OCR mit Engine 'Gemischte Schrift'
32FullPageRecognition_1(pXDoc, "", "Gemischte Schrift") 'Re-OCR mit Engine 'Gemischte Schrift'
33
34'nur alle Boxen südlich von StartTOP zählen
35'und nur alle Boxes nördlich von EndeTOP
36'Box.width>200 um Klecksereien zu vermeiden
37'Box.left>275 um den linken Rand auszulassen (Heftlöcher, Barcodes)
38
39For i= 0 To pXDoc.Boxes.Count-1
40 If pXDoc.Boxes.ItemByIndex(i).Top>StartTOP And pXDoc.Boxes.ItemByIndex(i).Width>200 And pXDoc.Boxes.ItemByIndex(i).Left>275 And pXDoc.Boxes.ItemByIndex(i).Top<EndeTOP Then
41 BoxAnzahl=BoxAnzahl+1
42 End If
43Next
44
45'OCR zurück nach RecoStar, damit Standardextraktion funktioniert
46FullPageRecognition_1(pXDoc, "", "RecoStar")
47
48If BoxAnzahl>0 Then 'gibt es mindestens eine Box: Handschrift gefunden!
49 Ist_Handschrift= True
50Else
51 Ist_Handschrift= False
52End If
53End Function
Und hier noch die aufgerufene Prozedur FullPageRecognition_1, mit der eine Re-OCR ausgeführt werden kann:
1Public Sub FullPageRecognition_1(ByVal pXDoc As CscXDocument, ByVal ImageCleanProfile As String, ByVal OCRProfile As String) 2 'remove existing OCR results and perform OCR on page one with profile OCRProfile 3 Dim i as Integer 4 Dim oPRP As IMpsPageRecogProfile 5 Dim oPR As New MpsPageRecognizing 6 7 'OCR only on page 1 8 pXDoc.CDoc.Pages(0).SuppressOCR=False 9 10 '# Remove any representations, before proceeding to perform full page recognition 11 For i = pXDoc.Representations.Count -1 To 0 Step -1 12 pXDoc.Representations.Remove (i) 13 Next 14 15 Set oPRP = Project.RecogProfiles.ItemByName(OCRProfile) '# Use the page recognition profile OCRProfile 16 oPR.Recognize(pXDoc, oPRP, 0) '# Perform recognition on the first page 17 18 '# At design time the text lines need to be analysed. At runtime this will be done automatically 19 If Project.ScriptExecutionMode = CscScriptExecutionMode.CscScriptModeServerDesign Then pXDoc.Representations(0).AnalyzeLines 20End Sub
Ältere Blog-Artikel über KTM und KC:
Kofax Transformation Modules (KTM): ‘Freiformerkennung’ für handschriftliche Nummern
Kofax Capture – Dokumententrennung mit Barcodes
KTM im Versicherungseinsatz: Heller, grauer und dunkler Posteingang
Dokumentenklassifizierung mit Kofax Transformation Modules (KTM)
Kofax Transformation Modules – Formatlokatoren und dynamische reguläre Ausdrücke – Teil 2
Kofax Transformation Modules – Formatlokatoren und dynamische reguläre Ausdrücke
Weitere Beiträge
von Jürgen Voss
Dein Job bei codecentric?
Jobs
Agile Developer und Consultant (w/d/m)
Alle Standorte
Gemeinsam bessere Projekte umsetzen.
Wir helfen deinem Unternehmen.
Du stehst vor einer großen IT-Herausforderung? Wir sorgen für eine maßgeschneiderte Unterstützung. Informiere dich jetzt.
Hilf uns, noch besser zu werden.
Wir sind immer auf der Suche nach neuen Talenten. Auch für dich ist die passende Stelle dabei.
Blog-Autor*in
Jürgen Voss
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.
Du hast noch Fragen zu diesem Thema? Dann sprich mich einfach an.