DocumentReader-APP

DocumentReader-App

 Basisinformationen

In diesem Thema findest du allgemeine Informationen zur Document Reader-App API.

 Über Document Reader-App API

In dieser Dokumentation erfährst du, wie du die Programmierschnittstelle der Document Reader-App für eigene Entwicklungen nutzen kannst. Die Document Reader-App stellt Funktionalitäten rund um das Klassifizieren von Dokumenten mit und ohne Stammdatenbezug bereit.

 Funktionsumfang von Document Reader-App

Die Document Reader-App umfasst die Texterkennung, Klassifizierung und Indexierung von Dokumenten. Folgende Funktionen sind enthalten:

  • Import von Dokumenten auf der Weboberfläche oder per API-Aufruf
  • Export der Stapel oder Dokumente an weiterführende Systeme (z.B. DMS-App, Azure Service Bus, SharePointAdapter-App)
  • Indexierung der Dokumente
  • Einfaches Berechtigungskonzept
  • Import von Stammdaten auf der Weboberfläche oder per API-Aufruf
  • Verbesserung der Erkennung mithilfe von validierten Ergebnissen

 Verwenden der API-Funktionen

Nachfolgend erfährst du, wie du die Programmierschnittstelle der Document Reader-App für eigene Entwicklungen nutzen kannst.

Die Document Reader-App beinhaltet mehrere Ausprägungen. Jede Ausprägung hat ihren eigenen Endpunkt. Achte beim Verwenden der API-Funktionen darauf, den richtigen Endpunkt anzugeben.

Die unterstützten Ausprägungen und die dazugehörigen Endpunkte kannst du aus der Liste der Ausprägungen entnehmen.

 Authentifizierung

Die API-Funktionen der Document Reader-App benötigen eine gültige Authentifizierung von der IdentityProvider-App.

Der Benutzer, der für den API-Schlüssel hinterlegt ist, muss über Adminrechte verfügen.

Weitere Informationen zur Authentifizierung findest du in der API-Dokumentation der IdentityProvider-App.

 Bereitstellen eines Dokuments für die Verarbeitung

Mit dieser Funktion kannst du ein Dokument zur weiteren Verarbeitung bereitstellen.

Request


POST /classcon-documentreader/Api/CreateDocumentRecognitionJobV2
Accept: application/json
  
{
  "Content": "Byte-Array (Base64)",
  "ContentLink": "link to the file",
  "Language": "",
  "CallbackURI": "",
  "ErrorCallbackURI": "",
  "Schema": "",
  "DocumentName": "invoice.pdf",
  "Description": "Invoice Description",
  "PageAreas": [
    "1",
    "3-5",
    "Last-1"
  ],
  "PredefinedProperties": [
    {
      "PropertyName": "ProcessingRule",
      "PropertyValue": "Api"
    }
  ],
  "InheritedProperties": {
    "ExtractedAttributes": [
      {
        "AttributeName": "OrderNum",
        "ExtractedValue": "12345678"
      },
      {
        "AttributeName": "InvoiceDate",
        "ExtractedValue": "20.01.2022"
      }
    ],
    "ExtractedTables": [
      {
        "StructureName": "positions",
        "Rows": [
          {
            "Attributes": [
              {
                "AttributeName": "Pos.Quantity",
                "ExtractedValue": "1000"
              },
              {
                "AttributeName": "Pos.Description",
                "ExtractedValue": "Mid-Range Speaker"
              },
              {
                "AttributeName": "Pos.UPrice",
                "ExtractedValue": "57,66"
              },
              {
                "AttributeName": "Pos.OrderNum",
                "ExtractedValue": "12345678"
              },
              {
                "AttributeName": "Pos.SPrice",
                "ExtractedValue": "576,60"
              },
              {
                "AttributeName": "Pos.OrderPos",
                "ExtractedValue": "1"
              },
              {
                "AttributeName": "Pos.Article",
                "ExtractedValue": "D0001"
              },
              {
                "AttributeName": "Pos.DeliveryNote",
                "ExtractedValue": "1234"
              }
            ]
          }
        ]
      }
    ]
  }
}

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
ContentDie eigentliche Datei, die als Byte-Array (Base64) bereitgestellt wird. Folgende Formate sind zulässig: PDF, JPG, PNG, XML, TIF, ZIP. Du kannst auch mehrere Dokumente mit einem Aufruf bereitstellen, indem die Dokumente als Zip-Paket übergeben werden.
ContentLinkDu kannst die Datei, die klassifiziert werden soll, als Link bereitstellen. Wenn du einen Link angegeben hast, wird immer der Link zur Abfrage der Datei genutzt und der Wert in der Eigenschaft Content wird ignoriert.
LanguageMit dieser Eigenschaft kannst du die Sprache angeben, die bei der Texterkennung genutzt wird. Wenn du keinen Wert übergibst, wird standardmäßig "Deutsch" verwendet.
CallbackURIDie Callback-URI wird aufgerufen, wenn die Verarbeitung der Aufgabe erfolgreich beendet wurde. (Optional)
ErrorCallbackURIDie ErrorCallback-URI wird aufgerufen, wenn die Verarbeitung der Aufgabe mit einem Fehler beendet wurde. (Optional)
SchemaZur Abbildung verschiedener Stammdatensätze kann diese Eigenschaft genutzt werden. Ist der Wert nicht gesetzt, wird immer das Standardschema genutzt. Außerdem müssen vorher Stammdaten mit dem entsprechenden Schema bereitgestellt werden. Der Wert muss mit einem Buchstaben beginnen. (Optional)
DocumentNameDateiname der hochgeladenen Datei mit Dateiendung.
DescriptionBeschreibung der hochgeladenen Datei. In der Übersicht der Stapel wird die Beschreibung als Stapelbezeichnung verwendet. (Optional)
PageAreasEine Liste an Seitenbereichen, die für die Verarbeitung relevant sind. Mögliche Angaben können feste Seitenzahlen z.B. "1" oder Bereiche z.B. "3-5" sein. Um die Verarbeitung auf die letzten beiden Seiten einzugrenzen, kann z.B. der Ausdruck "Last-1" verwendet werden. (Optional)
PredefinedPropertiesDu kannst eine Liste von vordefinierten Eigenschaften übergeben, die für die Verarbeitung relevant sind.
InheritedPropertiesErmöglicht die Vorbelegung von Eigenschaftenswerten, die nach der Verarbeitung im Ergebnis der Dokumenteigenschaften auftauchen. Dies gilt sowohl für Kopf- und Positionsdaten. Die Liste an möglichen Eigenschaften findest du unter dem Punkt Abfragen von klassifizierten Ergebnissen.

Hinweis

Du musst den Parameter PredefinedProperties wie im Beispiel mit der Eigenschaft ProcessingRule und dem Wert Api übergeben. Wenn du diesen Parameter nicht mit übergibst, werden die Dokumente in den Verarbeitungsschritt zur manuellen Dokumentprüfung (WebIndex) übergeben und werden anschließend an die konfigurierten Zielsysteme exportiert. Du kannst die Ergebnisse nicht per API abfragen. Die Document Reader-App unterstützt mehrere vordefinierte Eigenschaften, die in der nachfolgenden Tabelle aufgeführt sind.

Unterstützte vordefinierte Eigenschaften

EigenschaftBeschreibung
ProcessingRuleWenn die Eigenschaft mit dem Wert Api übergeben wird, können die erkannten Ergebnisse über die API abgefragt werden.
DebitorNumVorgabe des Mandantenkürzels, welches den Mandanten (Rechnungsempfänger) der übermittelten Dokumente festlegt.

Wenn das Dokument erfolgreich bereitgestellt wurde, erhältst du in der Antwort im JSON-Format eine ID. Diese ID wird im Weiteren als TaskId bezeichnet und ermöglicht dir, das hochgeladene Dokument in den weiteren Verarbeitungsschritten abzufragen. Wenn du mehrere Dokumente bereitgestellt hast, werden die Dokumente in einem "Stapel" zusammengefasst und die ID bezieht sich auf alle Dokumente im Stapel.

Response


HTTP-Statuscode 200 Ok

{
  "TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d"
}

Wenn beim Bereitstellen der Dokumente ein Fehler auftritt, wird ein entsprechender HTTP-Statuscode angegeben und im Body befindet sich die dazugehörige Fehlermeldung. Folgende Statuscodes können auftreten:

  • 400 Bad Request: Der Aufruf konnte nicht verarbeitet werden, z.B. aufgrund fehlender Informationen beim Aufruf oder die Stammdatenbereitstellung wird für das Produkt nicht unterstützt.
  • 401 Unauthorized: Der mitgelieferte API-Schlüssel ist ungültig oder der Benutzer hat nicht genug Berechtigungen, um Dokumente bereitstellen zu können.
  • 404 Not Found: Der angegebene Kunde oder das Abonnement wurden nicht gefunden.
  • 500 Internal Server Error: Ein interner Fehler ist aufgetreten.

Diese HTTP-Statuscodes werden auch bei den anderen Aufrufen im Fehlerfall zurückgeliefert.

Bei der Angabe einer CallbackURI oder einer ErrorCallbackURI wird bei erfolgreicher bzw. fehlgeschlagener Verarbeitung eines Stapels die angegebene URL aufgerufen.

Die Antwort enthält die TaskId des Stapels:

Response


HTTP-Statuscode 200 Ok
  
{
  "TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d"
}

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
TaskIdEindeutige ID für die bereitgestellten Dokumente.

Bei erfolgreicher Verarbeitung des Stapels können die klassifizierten Ergebnisse mit der TaskId abgefragt werden. Wenn kein Wert für die Eigenschaft CallbackURI angegeben wurde, kann der Status ebenfalls über die API abgefragt werden.

 Abfragen des Status

Nachdem die Dokumente hochgeladen wurden, durchlaufen sie die einzelnen Verarbeitungsschritte.

Um herauszufinden, in welchem Zustand sich die Dokumente in der Verarbeitung befinden, kannst du den Status mit der API abfragen:

Request


POST /classcon-documentreader/Api/GetProcessingStatus
Accept: application/json
   
{
  "TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d"
}

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
TaskIdEindeutige ID für die bereitgestellten Dokumente. Die ID wurde bei der Bereitstellung der Dokumente zurückgegeben.

Als Antwort erhältst du folgenden JSON-Body:

Response


HTTP-Statuscode 200 Ok
  
{
  "Status": 0
}

Der Status wird mit einem der folgenden Werte angegeben:

  • 0: Die Dokumente warten darauf, verarbeitet zu werden.
  • 1: Die Dokumente befinden sich in der Verarbeitung.
  • 2: Die Dokumente wurden erfolgreich verarbeitet. Du kannst die Ergebnisse abfragen.
  • 3: Beim Verarbeiten der Dokumente ist ein Fehler aufgetreten.

Wenn der Status mit dem Wert 2 zurückgeliefert wird, kannst du die Ergebnisse der Dokumentklassifizierung abfragen.

Außerdem besteht die Möglichkeit alle Stapel in der Verarbeitung mit einem Aufruf abzufragen:

Request


POST /classcon-documentreader/Api/GetDocumentRecognitionJobs
Accept: application/json

Eine Liste über die einzelnen Stapel wird als Antwort zurückgegeben:

Response


HTTP-Statuscode 200 Ok
  
[
  {
    "TaskId": "01a425eb-6b9f-4f15-8d99-29c8844f0955",
    "Position": "DataExchange",
    "Status": 2
  },
  {
    "TaskId": "44db072f-4b40-4219-8303-fdb3f7334b63",
    "Position": "WebIndex",
    "Status": 0
  },
  {
    "TaskId": "0c4987bf-d7f5-4136-af00-0befa65144a5",
    "Position": "WebIndex",
    "Status": 1
  }
]

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
TaskIdEindeutige ID für die bereitgestellten Dokumente.
PositionAktuelle Position des Stapels in der Verarbeitung. Stapel auf der Position DataExchange können per API abgefragt. Die Position WebIndex gibt an, dass sich ein Stapel in der Sichtprüfung befindet. Befindet sich ein Stapel in einer anderen Position ist die Verarbeitung noch nicht abgeschlossen.
StatusAktueller Status des Stapels in der Verarbeitung. Entspricht den bereits beschriebenen Statuswerten.

 Abfragen von klassifizierten Ergebnissen

Du kannst die Ergebnisse der Dokumentklassifizierung im JSON-Format mit der API abfragen. Verwende zum Abfragen folgende Anfrage:

Request


POST /classcon-documentreader/Api/GetExtractedResults
Accept: application/json
   
{
  "TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d"
}

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
TaskIdEindeutige ID für die bereitgestellten Dokumente. Die ID wurde bei der Bereitstellung der Dokumente zurückgegeben.

Als Rückgabewert erhältst du eine Liste, die für jedes Dokument die klassifizierten Ergebnisse enthält:

Response


HTTP-Statuscode 200 Ok
 
[
  {
    "DocumentName": "Invoice",
    "Extracted": {
      "ExtractedAttributes": [
        {
          "AttributeName": "DocumentType",
          "Clues": [
            {
              "Extracted": "Invoice",
              "Zone": {
                "Bottom": 0,
                "Height": 0,
                "Left": 0,
                "Length": 0,
                "Page": 0
              }
            }
          ],
          "Confidence": 100.00000000000002,
          "ExtractedValue": "Invoice"
        },
        {
          "AttributeName": "GrossAmountCurrency",
          "Clues": [
            {
              "Extracted": "EUR",
              "Zone": {
                "Bottom": 0,
                "Height": 0,
                "Left": 0,
                "Length": 0,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "EUR"
        },
        {
          "AttributeName": "DEBITOR_NUM",
          "Clues": [
            {
              "Extracted": "ceu",
              "Zone": {
                "Bottom": 0,
                "Height": 0,
                "Left": 0,
                "Length": 0,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "ceu"
        },
        {
          "AttributeName": "NAME",
          "Clues": [
            {
              "Extracted": "ecstraordinary gmbh",
              "Zone": {
                "Bottom": 736,
                "Height": 36,
                "Left": 139,
                "Length": 353,
                "Page": 0
              }
            },
            {
              "Extracted": "ecstraordinary gmbh",
              "Zone": {
                "Bottom": 1100,
                "Height": 36,
                "Left": 1264,
                "Length": 354,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "ecstraordinary GmbH"
        },
        {
          "AttributeName": "STR",
          "Clues": [
            {
              "Extracted": "helsinki str. 20",
              "Zone": {
                "Bottom": 1136,
                "Height": 28,
                "Left": 1266,
                "Length": 285,
                "Page": 0
              }
            }
          ],
          "Confidence": 88.23529052734375,
          "ExtractedValue": "Helsinki street 20"
        },
        {
          "AttributeName": "ZIP",
          "Clues": [
            {
              "Extracted": "81829",
              "Zone": {
                "Bottom": 859,
                "Height": 28,
                "Left": 179,
                "Length": 95,
                "Page": 0
              }
            },
            {
              "Extracted": "81829",
              "Zone": {
                "Bottom": 1179,
                "Height": 28,
                "Left": 1304,
                "Length": 95,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "81829"
        },
        {
          "AttributeName": "CITY",
          "Clues": [
            {
              "Extracted": "munich",
              "Zone": {
                "Bottom": 859,
                "Height": 28,
                "Left": 295,
                "Length": 147,
                "Page": 0
              }
            },
            {
              "Extracted": "munich",
              "Zone": {
                "Bottom": 1179,
                "Height": 28,
                "Left": 1420,
                "Length": 147,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "Munich"
        },
        {
          "AttributeName": "VENDOR_NUM",
          "Clues": [],
          "Confidence": 0,
          "ExtractedValue": "8001"
        },
        {
          "AttributeName": "VENDOR_NAME",
          "Clues": [
            {
              "Extracted": "schubert gmbh",
              "Zone": {
                "Bottom": 644,
                "Height": 26,
                "Left": 140,
                "Length": 235,
                "Page": 0
              }
            },
            {
              "Extracted": "schubert gmbh",
              "Zone": {
                "Bottom": 444,
                "Height": 32,
                "Left": 2036,
                "Length": 302,
                "Page": 0
              }
            },
            {
              "Extracted": "schubert gmbh",
              "Zone": {
                "Bottom": 2963,
                "Height": 32,
                "Left": 1445,
                "Length": 301,
                "Page": 0
              }
            },
            {
              "Extracted": "schubert gmbh",
              "Zone": {
                "Bottom": 3127,
                "Height": 37,
                "Left": 789,
                "Length": 290,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "Schubert GmbH"
        },
        {
          "AttributeName": "VENDOR_STR",
          "Clues": [
            {
              "Extracted": "new alley 21-23",
              "Zone": {
                "Bottom": 646,
                "Height": 27,
                "Left": 408,
                "Length": 237,
                "Page": 0
              }
            },
            {
              "Extracted": "new alley 21-23",
              "Zone": {
                "Bottom": 504,
                "Height": 39,
                "Left": 2029,
                "Length": 310,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "New Alley 21-23"
        },
        {
          "AttributeName": "VENDOR_CITY",
          "Clues": [
            {
              "Extracted": "weilrod",
              "Zone": {
                "Bottom": 643,
                "Height": 24,
                "Left": 779,
                "Length": 105,
                "Page": 0
              }
            },
            {
              "Extracted": "weilrod",
              "Zone": {
                "Bottom": 549,
                "Height": 31,
                "Left": 2197,
                "Length": 140,
                "Page": 0
              }
            },
            {
              "Extracted": "weilrod",
              "Zone": {
                "Bottom": 3122,
                "Height": 31,
                "Left": 1835,
                "Length": 140,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "Weilrod"
        },
        {
          "AttributeName": "VENDOR_VAT_REGISTRATION_ID",
          "Clues": [
            {
              "Extracted": "de111294343",
              "Zone": {
                "Bottom": 813,
                "Height": 31,
                "Left": 2071,
                "Length": 264,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "DE111294343"
        },
        {
          "AttributeName": "VENDOR_ZIP_CODE",
          "Clues": [],
          "Confidence": 0,
          "ExtractedValue": "64276"
        },
        {
          "AttributeName": "VENDOR_IBAN",
          "Clues": [
            {
              "Extracted": "de94512500000037875006",
              "Zone": {
                "Bottom": 3175,
                "Height": 31,
                "Left": 662,
                "Length": 528,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "DE94512500000037875006"
        },
        {
          "AttributeName": "OrderNum",
          "Clues": [
            {
              "Extracted": "00000252",
              "Zone": {
                "Bottom": 1393,
                "Height": 27,
                "Left": 511,
                "Length": 168,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "00000252"
        },
        {
          "AttributeName": "GrossAmount",
          "Clues": [
            {
              "Extracted": "885.12",
              "Zone": {
                "Bottom": 2771,
                "Height": 31,
                "Left": 2202,
                "Length": 114,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "885,12"
        },
        {
          "AttributeName": "NetAmount1",
          "Clues": [
            {
              "Extracted": "743.80",
              "Zone": {
                "Bottom": 2531,
                "Height": 31,
                "Left": 2202,
                "Length": 114,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "743,80"
        },
        {
          "AttributeName": "VatRate1",
          "Clues": [
            {
              "Extracted": "19 %",
              "Zone": {
                "Bottom": 2606,
                "Height": 25,
                "Left": 1837,
                "Length": 74,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "19,00"
        },
        {
          "AttributeName": "VatAmount1",
          "Clues": [
            {
              "Extracted": "141.32",
              "Zone": {
                "Bottom": 2611,
                "Height": 31,
                "Left": 2205,
                "Length": 108,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "141,32"
        },
        {
          "AttributeName": "InvoiceNumber",
          "Clues": [
            {
              "Extracted": "20190527-V1",
              "Zone": {
                "Bottom": 900,
                "Height": 25,
                "Left": 2136,
                "Length": 198,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "20190527-V1"
        },
        {
          "AttributeName": "InvoiceDate",
          "Clues": [
            {
              "Extracted": "27.05.19",
              "Zone": {
                "Bottom": 942,
                "Height": 25,
                "Left": 2208,
                "Length": 128,
                "Page": 0
              }
            }
          ],
          "Confidence": 100,
          "ExtractedValue": "27.05.2019"
        }
      ],
      "ExtractedTables": [
        {
          "StructureName": "positions",
          "Rows": [
            {
              "Attributes": [
                {
                  "AttributeName": "Pos.Quantity",
                  "Clues": [
                    {
                      "Extracted": "10",
                      "Zone": {
                        "Bottom": 1967,
                        "Height": 27,
                        "Left": 144,
                        "Length": 36,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "10"
                },
                {
                  "AttributeName": "Pos.Description",
                  "Clues": [
                    {
                      "Extracted": "Mid-Range Speaker",
                      "Zone": {
                        "Bottom": 1976,
                        "Height": 36,
                        "Left": 557,
                        "Length": 326,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "Mid-Range Speaker"
                },
                {
                  "AttributeName": "Pos.UPrice",
                  "Clues": [
                    {
                      "Extracted": "57.66",
                      "Zone": {
                        "Bottom": 1971,
                        "Height": 31,
                        "Left": 1931,
                        "Length": 90,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "57,66"
                },
                {
                  "AttributeName": "Pos.OrderNum",
                  "Clues": [
                    {
                      "Extracted": "00000252",
                      "Zone": {
                        "Bottom": 1393,
                        "Height": 27,
                        "Left": 511,
                        "Length": 168,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "00000252"
                },
                {
                  "AttributeName": "Pos.SPrice",
                  "Clues": [
                    {
                      "Extracted": "576,60",
                      "Zone": {
                        "Bottom": 1971,
                        "Height": 31,
                        "Left": 2202,
                        "Length": 114,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "576,60"
                },
                {
                  "AttributeName": "Pos.OrderPos",
                  "Clues": [
                    {
                      "Extracted": "1",
                      "Zone": {
                        "Bottom": 0,
                        "Height": 0,
                        "Left": 0,
                        "Length": 0,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "1"
                },
                {
                  "AttributeName": "Pos.Article",
                  "Clues": [
                    {
                      "Extracted": "D0001",
                      "Zone": {
                        "Bottom": 0,
                        "Height": 0,
                        "Left": 0,
                        "Length": 0,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "D0001"
                },
                {
                  "AttributeName": "Pos.DeliveryNote",
                  "Clues": [
                    {
                      "Extracted": "--",
                      "Zone": {
                        "Bottom": 0,
                        "Height": 0,
                        "Left": 0,
                        "Length": 0,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "--"
                }
              ],
              "Score": 0
            },
            {
              "Attributes": [
                {
                  "AttributeName": "Pos.Quantity",
                  "Clues": [
                    {
                      "Extracted": "10",
                      "Zone": {
                        "Bottom": 2047,
                        "Height": 27,
                        "Left": 144,
                        "Length": 36,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "10"
                },
                {
                  "AttributeName": "Pos.Description",
                  "Clues": [
                    {
                      "Extracted": "StandardSpeaker",
                      "Zone": {
                        "Bottom": 0,
                        "Height": 0,
                        "Left": 0,
                        "Length": 0,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "StandardSpeaker"
                },
                {
                  "AttributeName": "Pos.UPrice",
                  "Clues": [
                    {
                      "Extracted": "16.78",
                      "Zone": {
                        "Bottom": 2051,
                        "Height": 31,
                        "Left": 1934,
                        "Length": 90,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "16,78"
                },
                {
                  "AttributeName": "Pos.OrderNum",
                  "Clues": [
                    {
                      "Extracted": "00000252",
                      "Zone": {
                        "Bottom": 1393,
                        "Height": 27,
                        "Left": 511,
                        "Length": 168,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "00000252"
                },
                {
                  "AttributeName": "Pos.SPrice",
                  "Clues": [
                    {
                      "Extracted": "167,80",
                      "Zone": {
                        "Bottom": 2051,
                        "Height": 31,
                        "Left": 2205,
                        "Length": 108,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "167,80"
                },
                {
                  "AttributeName": "Pos.OrderPos",
                  "Clues": [
                    {
                      "Extracted": "2",
                      "Zone": {
                        "Bottom": 0,
                        "Height": 0,
                        "Left": 0,
                        "Length": 0,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "2"
                },
                {
                  "AttributeName": "Pos.Article",
                  "Clues": [
                    {
                      "Extracted": "D0002",
                      "Zone": {
                        "Bottom": 0,
                        "Height": 0,
                        "Left": 0,
                        "Length": 0,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "D0002"
                },
                {
                  "AttributeName": "Pos.DeliveryNote",
                  "Clues": [
                    {
                      "Extracted": "--",
                      "Zone": {
                        "Bottom": 0,
                        "Height": 0,
                        "Left": 0,
                        "Length": 0,
                        "Page": 0
                      }
                    }
                  ],
                  "Confidence": 60,
                  "ExtractedValue": "--"
                }
              ],
              "Score": 0
            }
          ]
        }
      ]
    }
  }
]

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
DocumentNameBezeichnung des Dokuments, um das Ergebnis eindeutig einem Dokument zuordnen zu können. Wenn du die Dokumente als ZIP-Paket bereitgestellt hast, wird für die Eigenschaft DocumentName der Dateiname des ZIP-Pakets verwendet. Der übergebene Dokumentname bei der Bereitstellung des ZIP-Pakets hat keinen Einfluss.
ExtractedEnthält die extrahierten Ergebnisse auf Positionsebene und Eigenschaftsebene.
ExtractedAttributesExtrahierte Ergebnisse auf Eigenschaftsebene.
ExtractedTablesExtrahierte Ergebnisse auf Positionsebene.
StructureNameBezeichnung der Positionsebene. Der Wert positions steht für Bestellpositionen.
RowsJede Reihe besteht aus derselben Anzahl von Eigenschaften z.B. Bestellmenge der Position.

 Aufbau einer extrahierten Eigenschaft

Eine Eigenschaft besteht aus dem extrahierten Wert und folgenden zusätzlichen Informationen:

EigenschaftBeschreibung
AttributeNameBezeichnung der Eigenschaft.
ExtractedValueExtrahierter Wert, der mithilfe des Dokuments oder mit den Stammdaten ermittelt wurde.
ConfidenceGibt Auskunft über die Richtigkeit eines klassifizierten Ergebnisses. Der maximale Wert ist 100.
CluesPosition auf dem Dokument, von der das Ergebnis extrahiert wurde.
ExtractedWert, der vom Dokument extrahiert wurde. Dieser Wert muss nicht mit dem Wert von ExtractedValue übereinstimmen, da mit dem extrahierten Wert die Stammdaten abgefragt werden.
ZoneExakte Position des extrahierten Werts auf dem Dokument. Mit der Eigenschaft Page wird die Seite angegeben. Wenn der Wert auf der ersten Seite extrahiert wurde, hat Page den Wert "0".

Folgende Eigenschaften werden auf Eigenschaftsebene durch die Document Reader-App klassifiziert (Rechnungsleser business Ausprägung):

Eigenschaften des Mandanten

EigenschaftBeschreibung
DEBITOR_NUMNummer des Mandanten.
NAMEName des Mandanten.
STRStraße des Mandanten.
CITYOrt des Mandanten.
ZIPPostleitzahl des Mandanten.

Eigenschaften des Lieferanten

EigenschaftBeschreibung
VENDOR_NUMNummer des Lieferanten.
VENDOR_NAMEName des Lieferanten.
VENDOR_STRStraße des Lieferanten.
VENDOR_CITYOrt des Lieferanten.
VENDOR_ZIP_CODEPostleitzahl des Lieferanten.
VENDOR_VAT_REGISTRATION_IDUSt-ID des Lieferanten.
VENDOR_REGISTRATION_IDSteuernummer des Lieferanten.
VENDOR_IBANIBAN des Lieferanten.

Eigenschaften der Rechnungsdaten

EigenschaftBeschreibung
DocumentTypeDokumenttyp. Folgende Werte sind möglich: Invoice (Rechnung), CreditAdvice (Gutschrift), CorrectionOfInvoice (Rechnungskorrektur).
InvoiceNumberRechnungsnummer.
InvoiceDateRechnungsdatum.
PerformanceDateLeistungsdatum.
OrderNumBestellnummer.
GrossAmountCurrencyWährung.
GrossAmountBruttowert.
AdditionalCostsZusatzkosten z.B. Transportkosten.
NetAmount1Nettowert 1.
VatRate1Steuersatz 1.
VatAmount1Steuerwert 1.
NetAmount2Nettowert 2.
VatRate2Steuersatz 2.
VatAmount2Steuerwert 2.

Folgende Eigenschaften werden auf Positionsebene durch die Document Reader-App klassifiziert:

Eigenschaften der Bestellpositionen

EigenschaftBeschreibung
Pos.OrderNumBestellnummer.
Pos.OrderPosBestellposition.
Pos.UPriceEinzelpreis.
Pos.SPriceGesamtpreis.
Pos.QuantityMenge.
Pos.ArticleArtikelnummer.
Pos.DescriptionArtikelbeschreibung.
Pos.DeliveryNoteLieferscheinnummer.

Folgende Eigenschaften werden zusätzlich aus QR-Rechnungen extrahiert:

Zusätzliche Eigenschaften einer QR-Rechnung

EigenschaftBeschreibung
QR-IBANQR-IBAN.
QR-REFERENCEQR-REFERENCE.

Wenn es zu einer Eigenschaft keinen Wert gibt, wird die Eigenschaft in den klassifizierten Ergebnissen nicht aufgelistet.

 Übermitteln von validierten Ergebnissen

Wenn die Informationen eines Dokuments nicht korrekt erkannt und extrahiert wurden, kannst du die Angaben korrigieren. Mit deinen Korrekturen trainierst du auch den Autotrainer, der die Qualität der Eigenschaftserkennung verbessert. Um die extrahierten Informationen zu korrigieren und den Autotrainer zu trainieren, musst du die korrigierten Werte zurückliefern. Verwende zum Übermitteln der korrigierten Werte folgende Anfrage:

Request


POST /classcon-documentreader/Api/RegisterValidatedValuesV2
Accept: application/json
  
{
  "TaskId": "0dbbd591-432b-4c2f-8f55-640fc952f54d",
  "ProvedResults": [
    {
      "DocumentName": "Invoice",
      "Extracted": {
        "ExtractedAttributes": [
          {
            "AttributeName": "GrossAmountCurrency",
            "ExtractedValue": "EUR"
          },
          {
            "AttributeName": "DEBITOR_NUM",
            "ExtractedValue": "ceu"
          },
          {
            "AttributeName": "NAME",
            "ExtractedValue": "ecstraordinary GmbH"
          },
          {
            "AttributeName": "STR",
            "ExtractedValue": "Helsinki Street 20"
          },
          {
            "AttributeName": "ZIP",
            "ExtractedValue": "81829"
          },
          {
            "AttributeName": "CITY",
            "ExtractedValue": "Munich"
          },
          {
            "AttributeName": "VENDOR_NUM",
            "ExtractedValue": "8001"
          },
          {
            "AttributeName": "VENDOR_NAME",
            "ExtractedValue": "Schubert GmbH"
          },
          {
            "AttributeName": "VENDOR_STR",
            "ExtractedValue": "New Alley 21-23"
          },
          {
            "AttributeName": "VENDOR_CITY",
            "ExtractedValue": "Weilrod"
          },
          {
            "AttributeName": "VENDOR_VAT_REGISTRATION_ID",
            "ExtractedValue": "DE111294343"
          },
          {
            "AttributeName": "VENDOR_ZIP_CODE",
            "ExtractedValue": "64276"
          },
          {
            "AttributeName": "VENDOR_IBAN",
            "ExtractedValue": "DE94512500000037875006"
          },
          {
            "AttributeName": "OrderNum",
            "ExtractedValue": "00000252"
          },
          {
            "AttributeName": "GrossAmount",
            "ExtractedValue": "885.12"
          },
          {
            "AttributeName": "NetAmount1",
            "ExtractedValue": "743.80"
          },
          {
            "AttributeName": "VatRate1",
            "ExtractedValue": "19.00"
          },
          {
            "AttributeName": "VatAmount1",
            "ExtractedValue": "141.32"
          },
          {
            "AttributeName": "InvoiceNumber",
            "ExtractedValue": "20190527-V1"
          },
          {
            "AttributeName": "InvoiceDate",
            "ExtractedValue": "27.05.2019"
          },
          {
            "AttributeName": "DocumentType",
            "ExtractedValue": "Invoice"
          }
        ],
        "ExtractedTables": [
          {
            "StructureName": "positions",
            "Rows": [
              {
                "Attributes": [
                  {
                    "AttributeName": "Pos.OrderNum",
                    "ExtractedValue": "00000252"
                  },
                  {
                    "AttributeName": "Pos.UPrice",
                    "ExtractedValue": "57.66"
                  },
                  {
                    "AttributeName": "Pos.SPrice",
                    "ExtractedValue": "576.60"
                  },
                  {
                    "AttributeName": "Pos.Quantity",
                    "ExtractedValue": "10"
                  },
                  {
                    "AttributeName": "Pos.OrderPos",
                    "ExtractedValue": "1"
                  },
                  {
                    "AttributeName": "Pos.DeliveryNote",
                    "ExtractedValue": "--"
                  },
                  {
                    "AttributeName": "Pos.Article",
                    "ExtractedValue": "D0001"
                  },
                  {
                    "AttributeName": "Pos.Description",
                    "ExtractedValue": "Mid-Range Speaker"
                  }
                ]
              },
              {
                "Attributes": [
                  {
                    "AttributeName": "Pos.OrderNum",
                    "ExtractedValue": "00000252"
                  },
                  {
                    "AttributeName": "Pos.UPrice",
                    "ExtractedValue": "16.78"
                  },
                  {
                    "AttributeName": "Pos.SPrice",
                    "ExtractedValue": "167.80"
                  },
                  {
                    "AttributeName": "Pos.Quantity",
                    "ExtractedValue": "10"
                  },
                  {
                    "AttributeName": "Pos.OrderPos",
                    "ExtractedValue": "2"
                  },
                  {
                    "AttributeName": "Pos.DeliveryNote",
                    "ExtractedValue": "--"
                  },
                  {
                    "AttributeName": "Pos.Article",
                    "ExtractedValue": "D0002"
                  },
                  {
                    "AttributeName": "Pos.Description",
                    "ExtractedValue": "StandardSpeaker"
                  }
                ]
              }
            ]
          }
        ]
      }
    }
  ]
}

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
TaskIdEindeutige ID für die bereitgestellten Dokumente. Die ID wurde bei der Bereitstellung der Dokumente zurückgegeben.
ProvedResultsDie korrigierten Eigenschaftswerte. Die Struktur stimmt mit der vorher bei der Abfrage der Ergebnisse erhaltenen JSON-Struktur überein. Beim Übermitteln der validierten Ergebnisse musst du nur die Eigenschaften AttributeName und ExtractedValue für die einzelnen validierten Eigenschaften befüllen.

Um den Autotrainer anhand des Dokuments zu trainieren, musst du die Ergebnisse der extrahierten Eigenschaften vorher per API abgefragt haben.

Damit du die korrigierten Ergebnisse für das richtige Dokument lieferst, musst du sowohl die ID der bereitgestellten Dokumente (TaskId) als auch den Namen des Dokuments in der Eigenschaft DocumentName angeben. Wenn zu einer ID mehrere Dokumente gehören, kannst du die validierten Ergebnisse für mehrere Dokumente in einem Aufruf übergeben. Die Eigenschaft DocumentName entspricht der Benennung des Dokuments im ZIP-Paket.

Wenn das Hochladen der validierten Ergebnisse erfolgreich war, wird folgender HTTP-Statuscode zurückgegeben:

Response


HTTP-Statuscode 200 Ok

 Bereitstellen von Stammdaten

Du kannst Stammdaten bereitstellen, die für die Verarbeitung der Dokumente herangezogen werden. Diese Funktion kannst du nur für die Ausprägungen nutzen, für die separate Stammdaten aktiviert ist. Für welche Ausprägungen dies gilt, kannst du über der Liste der Ausprägungen ermitteln.

Verwende folgende Anfrage zum Bereitstellen von Stammdaten:

Request


POST /classcon-documentreader/Api/ImportMasterFilesV2
Accept: application/json
  
{
  "Content": "Byte-Array (Base64)",
  "ContentLink": "Link to the file",
  "Schema": "",
  "DocumentName": "masterdata.zip",
  "MasterDataTableList": [
    {
      "TableName": "CC_COMPANIES",
      "ExpectedRowCount": 3
    },
    {
      "TableName": "CC_VENDORS",
      "ExpectedRowCount": 5
    },
    {
      "TableName": "CC_VENDOR_BANK",
      "ExpectedRowCount": 9
    },
    {
      "TableName": "CC_ORDERS",
      "ExpectedRowCount": 9
    },
    {
      "TableName": "CC_ORDERLINES",
      "ExpectedRowCount": 19
    },
    {
      "TableName": "CC_RECEIPTS",
      "ExpectedRowCount": 19
    },
    {
      "TableName": "EXTENDED_VENDOR_SETTINGS",
      "ExpectedRowCount": 10
    }
  ]
}

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
ContentDie eigentliche Datei, die als Byte-Array (Base64) bereitgestellt wird. Folgende Formate sind zulässig: CSV, ZIP. Du kannst mehrere Stammdaten mit einem Aufruf bereitstellen.
ContentLinkDu kannst die Datei, die die Stammdaten beinhaltet, als Link bereitstellen. Wenn du einen Link angibst, wird immer der Link zur Abfrage der Datei genutzt und der Wert in der Eigenschaft Content wird ignoriert.
SchemaZur Abbildung verschiedener Stammdatensätze kann diese Eigenschaft genutzt werden. Ist der Wert nicht gesetzt, wird immer das Standardschema genutzt. Der Wert muss mit einem Buchstaben beginnen. (Optional)
DocumentNameDateiname der hochgeladenen Datei mit Dateiendung.
MasterDataTableListDu kannst weitere Informationen zur einer Stammdatentabelle übergeben. Sie sollen dabei helfen Fehler frühzeitig festzustellen. (Optional)

Folgende Informationen können pro Tabelle angegeben werden:

EigenschaftBeschreibung
TableNameDie Bezeichnung der Tabelle, damit die Informationen zugeordnet werden können.
ExpectedRowCountAngabe der erwarteten Zeilen, über die am Ende des Imports die jeweilige Tabelle verfügen muss. Eine mögliche Abweichung kann im Stammdatenbereich der Document Reader-App eingesehen werden.

Wenn das Bereitstellen der Stammdaten erfolgreich war, wird folgender HTTP-Statuscode zurückgeliefert:

Response


HTTP-Statuscode 200 Ok

Die bereitgestellten Stammdaten sind nicht sofort verfügbar. Die Daten werden nach der Bereitstellung eines Dienstes noch einmal überprüft und anschließend in das System integriert. Dieser Vorgang kann einige Sekunden dauern.

Die basic-Variante der Document Reader-App arbeitet ohne extern bereitgestellte Stammdaten.

 Verwenden der API-Funktionen in der Process-App

Du kannst die API der Document Reader-App verwenden, um die Klassifizierung von Dokumenten als asynchronen Dienst für die Process-App bereitzustellen.

Du musst für jedes Dokument, das klassifiziert werden soll, einen separaten Prozess starten.

Um den asynchronen Prozess für ein Dokument zu starten, benötigt die Process-App folgende Angaben:

  • documentName: Name des Dokuments mit Dateiendung, z.B. Rechnung.pdf.
  • documentFileLink: Link zum Dokument.
  • documentOcrLink (optional): Link zur OCR-Datei, die für die Klassifizierung genutzt wird. Erlaubte Dateitypen sind .hocr und .addx. Wenn du keinen Link angibst, erfolgt die Texterkennung durch die Document Reader-App.

In folgendem beispielhaften Prozess sind sämtliche Eigenschaften aufgeführt, die von der Document Reader-App an die Process-App zurückgeliefert werden.

Beispielprozess BPMN


<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" targetNamespace="">
  <process id="DocumentReaderBusinessAPI" name="Document Reader Business API Demo" isExecutable="true">
    <extensionElements>
      <camunda:properties>
        <camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:in:documentName" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:in:documentMimeType" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:in:documentFileLink" value="URL" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:in:documentOcrLink" value="URL" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorNum" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorName" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorCity" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorStreet" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorZipCode" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorVatRegistrationId" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorRegistrationId" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vendorIban" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyNum" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyName" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyCity" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyStreet" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:companyZipCode" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:invoiceNumber" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:invoiceDate" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:performanceDate" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:documentType" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:grossAmountCurrency" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:grossAmount" value="Number" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:additionalCosts" value="Number" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:netAmount1" value="Number" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vatAmount1" value="Number" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vatRate1" value="Number" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:netAmount2" value="Number" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vatAmount2" value="Number" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:vatRate2" value="Number" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:orderNum" value="String" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_orderNum" value="[String]" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_unitPrice" value="[Number]" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_sumPrice" value="[Number]" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_quantity" value="[String]" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_orderPosition" value="[String]" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_deliveryNote" value="[String]" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_articleNum" value="[String]" />
		<camunda:property name="service:/classcon-documentreader/DataExchange/UploadProcessApp:out:pos_description" value="[String]" />
		<camunda:property name="variable:documentName" value="String" />
		<camunda:property name="variable:documentMimeType" value="String" />
		<camunda:property name="variable:documentFileLink" value="URL" />
		<camunda:property name="variable:documentOcrLink" value="URL" />
		<camunda:property name="variable:vendorNum" value="String" />
		<camunda:property name="variable:vendorName" value="String" />
		<camunda:property name="variable:vendorCity" value="String" />
		<camunda:property name="variable:vendorStreet" value="String" />
		<camunda:property name="variable:vendorZipCode" value="String" />
		<camunda:property name="variable:vendorVatRegistrationId" value="String" />
		<camunda:property name="variable:vendorRegistrationId" value="String" />
		<camunda:property name="variable:vendorIban" value="String" />	
		<camunda:property name="variable:companyNum" value="String" />
		<camunda:property name="variable:companyName" value="String" />
		<camunda:property name="variable:companyCity" value="String" />
		<camunda:property name="variable:companyStreet" value="String" />
		<camunda:property name="variable:companyZipCode" value="String" />
		<camunda:property name="variable:invoiceNumber" value="String" />
		<camunda:property name="variable:invoiceDate" value="String" />
		<camunda:property name="variable:performanceDate" value="String" />
		<camunda:property name="variable:documentType" value="String" />
		<camunda:property name="variable:grossAmountCurrency" value="String" />
		<camunda:property name="variable:grossAmount" value="Number" />
		<camunda:property name="variable:additionalCosts" value="Number" />
		<camunda:property name="variable:netAmount1" value="Number" />
		<camunda:property name="variable:vatAmount1" value="Number" />
		<camunda:property name="variable:vatRate1" value="Number" />
		<camunda:property name="variable:netAmount2" value="Number" />
		<camunda:property name="variable:vatAmount2" value="Number" />
		<camunda:property name="variable:vatRate2" value="Number" />
		<camunda:property name="variable:orderNum" value="String" />
		<camunda:property name="variable:pos_orderNum" value="[String]" />
		<camunda:property name="variable:pos_unitPrice" value="[Number]" />
		<camunda:property name="variable:pos_sumPrice" value="[Number]" />
		<camunda:property name="variable:pos_quantity" value="[String]" />
		<camunda:property name="variable:pos_orderPosition" value="[String]" />
		<camunda:property name="variable:pos_deliveryNote" value="[String]" />
		<camunda:property name="variable:pos_articleNum" value="[String]" />
		<camunda:property name="variable:pos_description" value="[String]" />
      </camunda:properties>
    </extensionElements>    
    <startEvent id="start"/>
    <sendTask id="call_documentReaderAPI" name="Call 'Document Reader API'" camunda:delegateExpression="${asyncService}" camunda:asyncBefore="true" camunda:exclusive="true">
      <extensionElements>
		    <camunda:inputOutput>
	        	<camunda:inputParameter name="service.uri">/classcon-documentreader/DataExchange/UploadProcessApp</camunda:inputParameter>
      			<camunda:inputParameter name="documentName">${variables.get("documentName")}</camunda:inputParameter>
				<camunda:inputParameter name="documentMimeType">${variables.get("documentMimeType")}</camunda:inputParameter>
				<camunda:inputParameter name="documentFileLink">${variables.get("documentFileLink")}</camunda:inputParameter>
				<camunda:inputParameter name="documentOcrLink">${variables.get("documentOcrLink")}</camunda:inputParameter>
    		</camunda:inputOutput>
  		</extensionElements>
	</sendTask>
    <receiveTask id="receive_documentReaderAPI" name="Wait for 'Document Reader API'" camunda:asyncAfter="true" camunda:exclusive="true">
      <extensionElements>
		    <camunda:inputOutput>
				<camunda:outputParameter name="vendorNum">${variables.get("vendorNum")}</camunda:outputParameter>
				<camunda:outputParameter name="vendorName">${variables.get("vendorName")}</camunda:outputParameter>
				<camunda:outputParameter name="vendorCity">${variables.get("vendorCity")}</camunda:outputParameter>
				<camunda:outputParameter name="vendorStreet">${variables.get("vendorStreet")}</camunda:outputParameter>
				<camunda:outputParameter name="vendorZipCode">${variables.get("vendorZipCode")}</camunda:outputParameter>
				<camunda:outputParameter name="vendorVatRegistrationId">${variables.get("vendorVatRegistrationId")}</camunda:outputParameter>
				<camunda:outputParameter name="vendorRegistrationId">${variables.get("vendorRegistrationId")}</camunda:outputParameter>
				<camunda:outputParameter name="vendorIban">${variables.get("vendorIban")}</camunda:outputParameter>
				<camunda:outputParameter name="companyNum">${variables.get("companyNum")}</camunda:outputParameter>
				<camunda:outputParameter name="companyName">${variables.get("companyName")}</camunda:outputParameter>
				<camunda:outputParameter name="companyCity">${variables.get("companyCity")}</camunda:outputParameter>
				<camunda:outputParameter name="companyStreet">${variables.get("companyStreet")}</camunda:outputParameter>
				<camunda:outputParameter name="companyZipCode">${variables.get("companyZipCode")}</camunda:outputParameter>
				<camunda:outputParameter name="invoiceNumber">${variables.get("invoiceNumber")}</camunda:outputParameter>
				<camunda:outputParameter name="invoiceDate">${variables.get("invoiceDate")}</camunda:outputParameter>
				<camunda:outputParameter name="performanceDate">${variables.get("performanceDate")}</camunda:outputParameter>
				<camunda:outputParameter name="documentType">${variables.get("documentType")}</camunda:outputParameter>
				<camunda:outputParameter name="grossAmountCurrency">${variables.get("grossAmountCurrency")}</camunda:outputParameter>
				<camunda:outputParameter name="grossAmount">${variables.get("grossAmount")}</camunda:outputParameter>
				<camunda:outputParameter name="additionalCosts">${variables.get("additionalCosts")}</camunda:outputParameter>
				<camunda:outputParameter name="netAmount1">${variables.get("netAmount1")}</camunda:outputParameter>
				<camunda:outputParameter name="vatAmount1">${variables.get("vatAmount1")}</camunda:outputParameter>
				<camunda:outputParameter name="vatRate1">${variables.get("vatRate1")}</camunda:outputParameter>
				<camunda:outputParameter name="netAmount2">${variables.get("netAmount2")}</camunda:outputParameter>
				<camunda:outputParameter name="vatAmount2">${variables.get("vatAmount2")}</camunda:outputParameter>
				<camunda:outputParameter name="vatRate2">${variables.get("vatRate2")}</camunda:outputParameter>
				<camunda:outputParameter name="orderNum">${variables.get("orderNum")}</camunda:outputParameter>
				<camunda:outputParameter name="pos_orderNum">${variables.get("pos_orderNum")}</camunda:outputParameter>
				<camunda:outputParameter name="pos_unitPrice">${variables.get("pos_unitPrice")}</camunda:outputParameter>
				<camunda:outputParameter name="pos_sumPrice">${variables.get("pos_sumPrice")}</camunda:outputParameter>
				<camunda:outputParameter name="pos_quantity">${variables.get("pos_quantity")}</camunda:outputParameter>
				<camunda:outputParameter name="pos_orderPosition">${variables.get("pos_orderPosition")}</camunda:outputParameter>
				<camunda:outputParameter name="pos_deliveryNote">${variables.get("pos_deliveryNote")}</camunda:outputParameter>
				<camunda:outputParameter name="pos_articleNum">${variables.get("pos_articleNum")}</camunda:outputParameter>
				<camunda:outputParameter name="pos_description">${variables.get("pos_description")}</camunda:outputParameter>
    		</camunda:inputOutput>
  		</extensionElements>
	</receiveTask>
    <endEvent id="end"/>       
    <sequenceFlow id="s1" sourceRef="start" targetRef="call_documentReaderAPI" />
    <sequenceFlow id="s2" sourceRef="call_documentReaderAPI" targetRef="receive_documentReaderAPI" />
    <sequenceFlow id="s3" sourceRef="receive_documentReaderAPI" targetRef="end" />
  </process> 
</definitions>

 Serverless Hooks

Die Document Reader-App bietet verschiedene Einsprungspunkte, die während der Verarbeitung aufgerufen werden können. Wenn ein Einsprungspunkt gesetzt ist, wird eine Nachricht an eine Azure Service Bus-Warteschlange geschickt. Die Warteschlange kann von einer Azure Function überwacht werden, die dann als weiteren Verarbeitungsschritt genutzt werden kann. Dadurch besteht die Möglichkeit eine Eigenschaft zu bearbeiten oder weitere Funktionen anhand eines Eigenschaftswerts auszuführen. Außerdem kannst du auf die Stammdaten in der Datenbank zugreifen. Wenn ein Dokument mittels Inbound an die Document Reader-App übergeben wird, können ebenfalls die Eigenschaften von Inbound ausgewertet werden.

Folgende Einsprungspunkte sind im Standard verfügbar: - Nach der Extraktion. (Klassifizierung wurde abgeschlossen und die erkannten Eigenschaftswerte können zur Weiterverarbeitung genutzt werden.) - Vor der Extraktion. (Vorbelegung von Eigenschaften.) - Nach dem Indexieren. (Validierte Eigenschaften können vor dem Export mit zusätzlichen Informationen aufbereitet werden.)

Die Verbindungszeichenfolge und die Warteschlange des Azure Service Bus müssen für den entsprechenden Einsprungspunkt in der Konfiguration hinterlegt werden.

 Verwenden der Serverless Hooks

Nachfolgend findest du die Implementierung eines Serverless Hooks in der Programmiersprache C#. Für eine einfache Nutzung der Funktionalitäten steht ein Nuget-Paket bereit. Der Name des Pakets lautet Classcon.Cloud.ServerlessHooks und befindet sich im d.velop nuget feed. Bitte wende dich an deinen d.velop Ansprechpartner, wenn du das Paket extern beziehen willst.

Beispiel 1: Änderung des Mandantennamens abhängig von der Mandantennummer


    public class DRaaSScriptingTest
    {
        [FunctionName("PostExtractionHook")]
        public void Run([ServiceBusTrigger("postextraction_queue", Connection = "ServiceBusConnectionString")]string myQueueItem)
        {
            /*Erstellt ein neues Objekt der Klasse Kontext
            Kontext enhält alle zu verarbeitenden Dokumente in einer Liste*/
            Context context = new Context(myQueueItem);
            foreach (Document document in context.DocumentList)
            {
                //Überprüft, ob ein Dokument die Mandantennummer "ceu" besitzt
                if (document.GetAttribute("DEBITOR_NUM") != null && document.GetAttribute("DEBITOR_NUM").ExtractedValue.Equals("ceu"))
                {
                    //Der Name des Mandanten wird geändert
                    document.SetAttribute("DEBITOR_NUM", "Test Debitor");
                }
            }

            //Schreibt die vorgenommenen Änderungen in den Azure Blobspeicher und meldet eine erfolgreiche Verarbeitung zurück            
            context.Commit();
        }
    }

Beispiel 2: Setzen des Mandanten abhängig von einer Eigenschaft, die in Inbound gesetzt wurde


    public class DRaaSScriptingTest
    {
        [FunctionName("PostExtractionHook")]
        public void Run([ServiceBusTrigger("postextraction_queue", Connection = "ServiceBusConnectionString")]string myQueueItem)
        {
            /*Erstellt ein neues Objekt der Klasse Kontext
            Kontext enhält alle zu verarbeitenden Dokumente in einer Liste*/
            Context context = new Context(myQueueItem);
            foreach (Document document in context.DocumentList)
            {
                //Überprüft, ob eine Inbound Eigenschaft mit einem Wert gefüllt ist und setzt davon abhängig den Mandanten
                InboundProperty inboundProperty = document.GetInboundProperty("InboundDebitorProperty");
                if (inboundProperty != null && inboundProperty.PropertyValues != null && inboundProperty.PropertyValues.Count > 0)
                {
                    //Baue eine SQL Verbindung zur Datenbank auf
                    using (SqlConnection sqlConnection = new SqlConnection(context.DBConnectionString))
                    {
                        //Abfrage des Mandanten aus den Stammdaten
                        using (SqlCommand command = new SqlCommand(string.Format("SELECT * FROM CC_COMPANIES WHERE COMPANY_NUM='{0}'", inboundProperty.PropertyValues[0]), sqlConnection))
                        {
                            sqlConnection.Open();
                            using (SqlDataReader reader = command.ExecuteReader())
                            {
                                if (reader.Read())
                                {
                                    document.SetAttribute("DEBITOR_NUM", reader["COMPANY_NUM"].ToString());
                                    document.SetAttribute("NAME", reader["NAME"].ToString());
                                    document.SetAttribute("STR", reader["STR"].ToString());
                                    document.SetAttribute("CITY", reader["CITY"].ToString());
                                    document.SetAttribute("ZIP", reader["ZIP"].ToString());
                                }
                            }
                        }
                    }
                }
            }

            //Schreibt die vorgenommenen Änderungen in den Azure Blobspeicher und meldet eine erfolgreiche Verarbeitung zurück          
            context.Commit();
        }
    }

 Ausprägungen

Folgende Ausprägungen werden durch die Document Reader-App unterstützt:

AusprägungEndpunktUnterstützte KonfigurationsprofileSeparate Stammdaten
Rechnungsleser businessclasscon-documentreaderd.velop invoices, SAPJa
Rechnungsleser basicclasscon-genericinvoicesNein
Rechnungsleser business (Immobilienwirtschaft)classconinvoicesrealestateJa
Rechnungsleser business (US)classconinvoicesusJa
Rechnungsleser business (2)classconinvoicesv2Ja
Rechnungsleser business (3)classconinvoicesv3Ja
Intelligente PostverteilungclassconmailroutingJa
AuftragsbestätigungsleserclassconorderconfirmationsJa
BestellungsleserclassconordersJa
PersonaldokumenteclassconpersonnelfilesJa
LieferscheinleserclasscondeliverynotesJa
ZollausfuhrdokumenteclassconcustomsexportdocsJa
VerträgeclassconcontractsJa
Dynamische KlassifizierungclasscondynamicclassificationJa
Generische ErkennungsappclasscongenericNein

 Konfiguration und Aktivierung einer Ausprägung

Eine Ausprägung kann über den Aufruf des folgenden Endpunkts aktiviert und konfiguriert werden.

Request


POST /classcon-documentreader/Api/Setup
Accept: application/json
  
{
  "Profiles": [
    "d.velop invoices"
  ],
  "TargetSystems": [],
  "RoutingRules": [],
  "MasterDataDefinitions": []
}

Hinweise zu den Eigenschaften

EigenschaftBeschreibung
ProfilesÜber die Profile können vordefinierte Konfigurationen aktiviert werden, womit automatisch Zielsysteme, Routingregeln und Stammdatenstrukturen zu einer Ausprägung hinzugefügt werden. Die unterstützten Konfigurationsprofile findest du in der Liste der Ausprägungen.
TargetSystemsEine Liste an Zielsystemen, die bei der Aktivierung der Ausprägung hinzugefügt werden sollen.n (Optional)
RoutingRulesEine Liste an Routingregeln, die bei der Aktivierung der Ausprägung hinzugefügt werden sollen. (Optional)
MasterDataDefinitionsEine Liste an Stammdatenstrukturen, die bei der Aktivierung der Ausprägung hinzugefügt werden sollen. (Optional)

Die Konfiguration einer Ausprägung erfolgt im Hintergrund. Der Status einer Ausprägung kann auf der Konfigurationsseite Ausprägungen der Document Reader-App eingesehen werden.

Response


HTTP-Statuscode 200 Ok

Nachfolgend findest du einen Beispielaufruf zur Übergabe von zusätzlichen Zielsystemen, Routingregeln und Stammdatenstrukturen

Request


POST /classcon-documentreader/Api/Setup
Accept: application/json
  
{
  "Profiles": [
    "d.veop invoices"
  ],
  "TargetSystems": [
    {
      "Name": "D3EndpointService",
      "RepositoryId": "Repository-ID",
      "ApiKey": "API-Schlüssel"
    }
  ],
  "RoutingRules": [
    {
      "IsRoutingActivated": true,
      "AutoProcessingRuleDescription": "VENDOR_NUM='1420'",
      "DestinationProcessSequence": "0189e289-edcc-48ae-974e-3edde2029070",
      "DestinationNodeID": "irbBeforeExportHook",
      "DocumentClass": null,
      "TaskNameTemplate": "Kreditor 1420 Export",
      "UserGroupIDs": null,
      "ManualCreated": false,
      "Name": "Kreditor 1420",
      "AttributeResetInstructions": []
    }
  ],
  "MasterDataDefinitions": [
    {
      "TableName": "TEST_TABLE",
      "Description": null,
      "Columns": [
        {
          "ColumnName": "Column1",
          "Description": null,
          "ColumnType": 1,
          "MaxLength": 20,
          "CreateIndex": true,
          "TryIdentifyPattern": false,
          "SingleValueEntityName": null,
          "SemanticType": 0,
          "SignificantCharacters": null,
          "DefaultValue": "",
          "CreateFulltextIndex": false
        },
        {
          "ColumnName": "Column2",
          "Description": null,
          "ColumnType": 1,
          "MaxLength": 20,
          "CreateIndex": true,
          "TryIdentifyPattern": false,
          "SingleValueEntityName": null,
          "SemanticType": 0,
          "SignificantCharacters": null,
          "DefaultValue": "",
          "CreateFulltextIndex": false
        },
        {
          "ColumnName": "Column3",
          "Description": null,
          "ColumnType": 1,
          "MaxLength": 20,
          "CreateIndex": false,
          "TryIdentifyPattern": false,
          "SingleValueEntityName": null,
          "SemanticType": 0,
          "SignificantCharacters": null,
          "DefaultValue": "",
          "CreateFulltextIndex": false
        }
      ]
    }
  ]
}

Response


HTTP-Statuscode 200 Ok