image2data

Der Tech-Blog

...weitermachen, wo OCR aufhört

Plugin "Rechnungsdatenerkennung" (i2dxIDEx)

Feb 252015

Das image2data-Plugin "Rechnungsdatenerkennung" (i2dxIDEx) ermöglicht das Erkennen von deutschen, österreichischen oder schweizerischen Rechnungsdaten. Konkret können darüber folgende Daten gefunden werden: Kreditor (also Absender), Rechnungsnummer und -datum, Netto-, Brutto- und USt.-Betrag sowie der USt.-Satz. Dafür muss lediglich die Adresse des Kreditors erfasst werden.

Das folgende Skript fügt dem Plugin zwei Kreditoren sowie einen Rechnungstext hinzu. Der Rechnungstext enthält fehlerhafte Daten: Nullen wurden teilweise als kleines "o" erkannt, der Kreditorname enthält ebenso einen Schreibfehler wie seine Postleitzahl. Durch die Toleranzen aber, die im Kreditoreintrag erlaubt wurden (.MaxErrors := ...), kann der richtige Kreditor trotzdem gefunden werden. Auch die korrekte Ermittlung der übrigen Rechnungsdaten (s.o.) erfolgt trotz fehlerhaften Rechnungstexts problemlos. Der Aufruf "i2dxIDExExtractInvoiceData" erwartet als Parameter u.a. die zugelassenen Ländereinstellungen (hier "DE,AT,CH") und USt.-Sätze (hier 19% und 7%).

// *******************************************************************
// * sample_i2dxidex.i2dspt                                          *
// *                                                                 *
// * Sample script for the i2dxIDEx (invoice data extraction) plugin *
// * REQUIRES THE INSTALLED PLUGIN TO COMPILE AND RUN!               *
// *                                                                 *
// * Press F9 to execute the code or F7/F8 to debug it               *
// *                                                                 *
// * Contact www.norpa.eu if the plugin is required but missing      *
// *******************************************************************
 
{$I i2dxIDEx}
 
type
  TCreditor = record
    Number: Integer;
    Identifier: array[0..4] of String;
    MaxErrors: array[0..4] of Integer;
    InvoiceNumberRegEx: String;
    AccountNo1: Integer;
    AccountNo2: Integer;
  end;
  TCreditors = array of TCreditor;
 
var
  i, j: Integer;
 
  iCreditorIndex: Integer;
  sInvoiceText: String;
 
  sInvoiceNumber: String;
  dInvoiceDate: TDateTime;
  fAmountNet: Currency;
  fVATRate: Currency;
  fAmountVAT: Currency;
  fAmountGross: Currency;
  sCountryCode: String;
 
  aCreditors: TCreditors;
 
begin
  // Add some simple creditors
  SetLength(aCreditors, 2);
 
  aCreditors[0].Number := 0;
  aCreditors[0].Identifier[0] := 'Rechnung';
  aCreditors[0].MaxErrors[0] := 0;
  aCreditors[0].Identifier[1] := 'Max Meyer GmbH';
  aCreditors[0].MaxErrors[1] := 1;
  aCreditors[0].Identifier[2] := 'Schloßallee 5';
  aCreditors[0].MaxErrors[2] := 1;
  aCreditors[0].Identifier[3] := '12345 Hamburg';
  aCreditors[0].MaxErrors[3] := 1;
  aCreditors[0].AccountNo1 := 1000;
  aCreditors[0].AccountNo2 := 3000;
 
  aCreditors[1].Number := 1;
  aCreditors[1].Identifier[0] := 'Rechnung';
  aCreditors[1].MaxErrors[0] := 0;
  aCreditors[1].Identifier[1] := 'Peter Petersen AG';
  aCreditors[1].MaxErrors[1] := 1;
  aCreditors[1].Identifier[2] := 'Parkstraße 16';
  aCreditors[1].MaxErrors[2] := 1;
  aCreditors[1].Identifier[3] := '54321 Berlin';
  aCreditors[1].MaxErrors[3] := 1;
  aCreditors[1].AccountNo1 := 1001;
  aCreditors[1].AccountNo2 := 3001;
 
  i2dxIDExAddCreditorData(aCreditors[0].Identifier[0], aCreditors[0].MaxErrors[0],
  aCreditors[0].Identifier[1], aCreditors[0].MaxErrors[1], aCreditors[0].Identifier[2],
  aCreditors[0].MaxErrors[2], aCreditors[0].Identifier[3], aCreditors[0].MaxErrors[3],
  aCreditors[0].Identifier[4], aCreditors[0].MaxErrors[4]);
 
  i2dxIDExAddCreditorData(aCreditors[1].Identifier[0], aCreditors[1].MaxErrors[0],
  aCreditors[1].Identifier[1], aCreditors[1].MaxErrors[1], aCreditors[1].Identifier[2],
  aCreditors[1].MaxErrors[2], aCreditors[1].Identifier[3], aCreditors[1].MaxErrors[3],
  aCreditors[1].Identifier[4], aCreditors[1].MaxErrors[4]);
 
  sInvoiceText := 'Rechnungsnr. 2013045 [some text] Datum: 13. Januar 2015 [some text] EUR 80,o0 [some text] EUR 90,00 [some text] EUR 1.20O,00 [some text]'
                + 'EUR 228,0O [some text] EUR 88,00 [some text] EUR 1428,o0 [some text] Peter Petarsen AG [some text] Parkstraße 18 [some text] 44321 Berlin';
 
  // Find the best matching creditor using the invoice text
  iCreditorIndex := i2dxIDExFindCreditor(sInvoiceText);
  if iCreditorIndex > -1 then begin
    // Extract the invoice data
    i2dxIDExExtractInvoiceData('DE,AT,CH', sInvoiceText, aCreditors[iCreditorIndex].InvoiceNumberRegEx, 19, 7, MAXINT, 0, sCountryCode,
    sInvoiceNumber, dInvoiceDate, fAmountNet, fVATRate, fAmountVAT, fAmountGross, i, j);
 
    i2dDebugOut('Country code: ' + sCountryCode);
    i2dDebugOut('Invoice number : ' + sInvoiceNumber);
    i2dDebugOut('Invoice date : ' + DateTimeToStr(dInvoiceDate));
    i2dDebugOut('Amount net : ' + FloatToStr(fAmountNet));
    i2dDebugOut('VAT rate : ' + FloatToStr(fVATRate));
    i2dDebugOut('VAT amount : ' + FloatToStr(fAmountVAT));
    i2dDebugOut('Amount gross : ' + FloatToStr(fAmountGross));
  end else
    i2dCancelProcess('Creditor not found');
end.

Atom

powered by Nibbleblog