Guten Morgen zusammen.
Vorab vielen Dank an ‘cgrunenberg’ für den entscheidenden Hinweis im Post ‘[url]Belegdatum aus PDF+Text ermitteln und anzeigen]’, dass es sich bei dem Search Pattern nicht um RegEx sondern um Grep handeln muss.
Nun denn - es hat zwar etwas gedauert, aber ich bin jetzt in der Lage einen Beleg nach dem Belegdatum zu durchsuchen und formatiert nach JJJJ-MM-TT anzeigen zu lassen. In meinem eigenen Workflow wird das gefundene Belegdatum dann vor den Belegnamen gesetzt und in das Erstellungsdatum des Beleges geschrieben. Der neue Belegname sieht in DEVONthink dann etwa wie folgt aus.
[2012-04-01] Speditionsrechnung #123987
Das folgende Skript funktioniert in über 99 % der Fälle. Das Belegdatum darf dabei in folgenden Formaten vorliegen.
1.4.12
01.04.2012
- April 12
- April 2012
- Apr 12
- Apr 2012
Ich bin zwar ein Applescript Newbie, aber die Geschwindigkeit mit der das Skript aktuell arbeitet liegt bei max. 1 Sekunde pro Beleg und ist zumindest für meine Belange mehr als ausreichend. Sollte es von euch noch jemand weiter optimieren können, so ist er herzlich eingeladen - ich würde mich freuen und bin für jeden Trick dankbar.
Allerdings haben sich im Laufe dieses Projektes bei mir zwei Fragen ergeben, zu denen ich bitte eure Hilfe brauche.
Frage 1:
Ich vermute mal die Frage kann, wenn überhaupt nur ABBYY oder DEVON Technologies beantworten.
Nehmen wir an, ich habe eine normale Standardrechnung, mit Kopf- und Fußtext, bei der das Belegdatum, als erstes Datum im oberen Drittel rechts am Rand steht. So wie man das allgemein kennt. Mein Script sucht jetzt nach dem ersten Wert auf dem das Search Pattern zutrifft und liefert mir eine Kontonummer (12 1223 1222) aus dem Fußtext. Im Applescript Event sehe ich, das direkt nach der Kontonummer das Datum gefunden wurde. Bei genauerer Analyse des Events zeigt sich, das der PDF Text den Originalbeleg nicht 1:1 wiedergibt sondern der erkannte Text durcheinander steht. Kurzgefasst - die Kontonummer steht vor dem Datum und wird deshalb richtigerweise als erstes gefunden. Warum geht die OCR nicht zeilenweise vor?
Frage 2:
Die ergibt sich zwangsweise aus Frage 1, da man vermutlich nicht in der Lage sein wird die Reihenfolge mit der die OCR vorgeht zu beinflussen und somit Frage 1 zu lösen.
Das Search Pattern findet aktuell auch Leerzeichen, da es die unterschiedliche Schreibweise eines Datums im Deutschen erfordert. Was aber alle obigen Datumsbeispiele gemeinsam haben, ist der Punkt nach dem Tageswert. Dieser ist in jeder Schreibweise immer vorhanden. Mal ist dieser an der zweiten Stelle zu finden, mal an der dritten. Je nach Schreibweise folgt ggf. noch ein Leerzeichen. Kann mir bitte jemand sagen wie ich mein Pattern
set mypattern to "[0-9]{1,2}([.]|. )([0-9]{1,2}|Januar|Jan|Februar|Feb|März|Mrz|April|Apr|Mai|Juni|Jun|Juli|Jul|August|Aug|September|Sep|Oktober|Okt|November|Nov|Dezember|Dez)([.]| )[0-9]{2,4}"
dahingehend abändere, das entweder an der zweiten oder an der dritten Stelle des Ergebnisses immer ein Punkt erwartet wird. Es würden dann nur noch vermeintliche Datumswerte in der Form
‘1.’ oder ‘10.’ jeweils ohne Leerzeichen
‘1.’ oder '10. ’ jeweils mit Leerzeichen
gefunden und keine durch ein Leerzeichen getrennte Zahlenfolgen mehr. Das würde dann automatisch das Problem der falschen Ergebnisse wie der Kontonummer oder ausländischen Telefonnummern erledigen.
Ich hoffe das Skript ist für einige von euch so hilfreich wie für mich.
Efty
-- Script: Belegdatum ermitteln
-- Version: 1.01
-- Code: Efty Edge
-- Datum: 4.4.2012
global myDate
-- zu suchende Datumsformate definieren
set mypattern to "[0-9]{1,2}([.]|. )([0-9]{1,2}|Januar|Jan|Februar|Feb|März|Mrz|April|Apr|Mai|Juni|Jun|Juli|Jul|August|Aug|September|Sep|Oktober|Okt|November|Nov|Dezember|Dez)([.]| )[0-9]{2,4}"
tell application id "com.devon-technologies.thinkpro2"
try
set theselection to the selection
if theselection is {} then error "Bitte mindestens einen Beleg auswählen."
repeat with theRecord in theselection
set rcdtext to the plain text of theRecord
set thisRecord to the name of theRecord
set mycat to rcdtext as text
set myDate to "XXXX-XX-XX"
try
-- PDF Text nach der Logik des 'mypattern durchsuchen
do shell script "echo " & quoted form of mycat & " | grep -E -o -e " & quoted form of mypattern
set myDate to first paragraph of result as text
end try
-- Gefundenen Datums-Strings zerlegen
if (count of myDate) = 6 and (count of myDate) = 11 then
-- Ergebnis an 'text'-String übergeben
set od to text item delimiters of AppleScript
set text item delimiters of AppleScript to "."
-- String zerlegen und an Variablen übergeben
set myDay to text item 1 of myDate
set myMonth to text item 2 of myDate
set myYear to text item 3 of myDate
-- Einstellige Tage in Tage mit führender Null umwandeln
if myDay is in {"1", "2", "3", "4", "5", "6", "7", "8", "9"} then
set myDay to "0" & myDay
end if
-- Einstellige Monate in Monate mit führender Null umwandeln
if myMonth is in {"1", "2", "3", "4", "5", "6", "7", "8", "9"} then
set myMonth to "0" & myMonth
end if
--Zweistellige Jahreszahl in vierstellige Jahreszahl umwandeln
if (count of myYear) is 2 then
set myYear to "20" & myYear
end if
else
set AppleScript's text item delimiters to space
set myDate to the text items of myDate
set AppleScript's text item delimiters to {""}
-- return these_items
set myDay to text item 1 of myDate
set myMonth to text item 2 of myDate
set myYear to text item 3 of myDate
-- Einstellige Tage in Tage mit führender Null umwandeln
set myDayLength to count of myDay
set myDay to texts 1 thru (myDayLength - 1) of myDay
if myDay is in {"1", "2", "3", "4", "5", "6", "7", "8", "9"} then
set myDay to "0" & myDay
end if
--Monatsnamen in Monatszahl umwandeln
if myMonth = "Januar" or myMonth = "Jan" then set myMonth to "01"
if myMonth = "Februar" or myMonth = "Feb" then set myMonth to "02"
if myMonth = "März" or myMonth = "Mrz" then set myMonth to "03"
if myMonth = "April" or myMonth = "Apr" then set myMonth to "04"
if myMonth = "Mai" then set myMonth to "05"
if myMonth = "Juni" or myMonth = "Jun" then set myMonth to "06"
if myMonth = "Juli" or myMonth = "Jul" then set myMonth to "07"
if myMonth = "August" or myMonth = "Aug" then set myMonth to "08"
if myMonth = "September" or myMonth = "Sep" then set myMonth to "09"
if myMonth = "Oktober" or myMonth = "Okt" then set myMonth to "10"
if myMonth = "November" or myMonth = "Nov" then set myMonth to "11"
if myMonth = "Dezember" or myMonth = "Dez" then set myMonth to "12"
--Zweistellige Jahreszahl in vierstellige Jahreszahl umwandeln
if (count of myYear) is 2 then
set myYear to "20" & myYear
end if
end if
--Gefundenes Datum formatiert ausgeben
display dialog myYear & "-" & myMonth & "-" & myDay
end repeat
end try
end tell