Warum Nanonets oder Rossum?

Weil OCR alleine nicht reicht.
Du willst keine Bilder, Du willst Felder: Rechnungsnummer, Datum, Betrag.
Nanonets und Rossum liefern Dir genau das.
Per REST. Und damit auch direkt aus Access per VBA.

Was Du brauchst

  • API-Key von Nanonets oder Rossum
  • Modell (Invoice Extraction)
  • PDF-Dateien (Rechnungen)
  • Tabellen für Upload, Ergebnis, Fehlerprotokoll

Tabellenstruktur

TabelleZweck
tblRechnungenPfade zu PDF-Dateien
tblFelderAusgelesene Werte
tblFehlerFehler und Logs

Variante 1: Nanonets ansprechen

Schritt 1: PDF einlesen und Base64 kodieren

Function LeseDateiAlsBase64(pfad As String) As String
    Dim bytes() As Byte
    Dim xml As Object

    Open pfad For Binary As #1
    ReDim bytes(LOF(1) - 1)
    Get #1, , bytes
    Close #1

    Set xml = CreateObject("MSXML2.DOMDocument").createElement("b64")
    xml.DataType = "bin.base64"
    xml.nodeTypedValue = bytes
    LeseDateiAlsBase64 = Replace(xml.Text, vbLf, "")
End Function

Schritt 2: Anfrage an Nanonets

Function AnalysiereMitNanonets(base64PDF As String) As String
    Dim http As Object
    Dim json As String
    Dim apiKey As String
    Dim modelID As String

    modelID = "DEIN_MODEL_ID"
    apiKey = "DEIN_API_KEY"

    json = "{" & _
           """file"":""" & base64PDF & """" & _
           "}"

    Set http = CreateObject("MSXML2.ServerXMLHTTP")
    http.Open "POST", "https://app.nanonets.com/api/v2/OCR/Model/" & modelID & "/LabelFile/", False
    http.setRequestHeader "Authorization", "Basic " & Base64Encode(apiKey & ":")
    http.setRequestHeader "Content-Type", "application/json"
    http.Send json

    AnalysiereMitNanonets = http.responseText
End Function

API-Key codieren (Basic Auth)

Function Base64Encode(text As String) As String
    Dim xml As Object
    Set xml = CreateObject("MSXML2.DOMDocument").createElement("base64")
    xml.DataType = "bin.base64"
    xml.nodeTypedValue = StrConv(text, vbFromUnicode)
    Base64Encode = Replace(xml.Text, vbLf, "")
End Function

Ergebnis extrahieren (vereinfacht)

Function ParseNanonetsJSON(json As String) As String
    Dim sc As Object
    Set sc = CreateObject("ScriptControl")
    sc.Language = "JScript"
    sc.AddCode "function parse(j){ var r=''; var d=JSON.parse(j).result[0].prediction; for(var i=0;i<d.length;i++){ r += d[i].label + '|' + d[i].ocr_text + '\n'; } return r; }"
    ParseNanonetsJSON = sc.Run("parse", json)
End Function

Variante 2: Rossum ansprechen

Datei hochladen (Rossum benötigt multipart/form-data)

Rossum hat dafür eine eigene Upload-API.
Hier empfiehlt sich:

  • Entweder curl.exe per Shell aufrufen
  • Oder eine kleine Python-Brücke einsetzen

Einfach per VBA schwer umzusetzen wegen Multipart-Form.

Alternativ: PDF auf Server hochladen und URL senden.

JSON abrufen (Vereinfachung)

Function AnalysiereMitRossum(token As String, documentID As String) As String
    Dim http As Object

    Set http = CreateObject("MSXML2.ServerXMLHTTP")
    http.Open "GET", "https://api.rossum.ai/v1/documents/" & documentID & "/", False
    http.setRequestHeader "Authorization", "token " & token
    http.Send

    AnalysiereMitRossum = http.responseText
End Function

Ergebnisse speichern

Sub SpeichereFelder(rechnungID As Long, json As String)
    Dim zeilen() As String
    Dim teile() As String
    Dim i As Long

    zeilen = Split(ParseNanonetsJSON(json), vbLf)

    For i = 0 To UBound(zeilen)
        If Trim(zeilen(i)) <> "" Then
            teile = Split(zeilen(i), "|")
            If UBound(teile) = 1 Then
                CurrentDb.Execute "INSERT INTO tblFelder (RechnungID, Feld, Wert) VALUES (" & _
                                  rechnungID & ", '" & Replace(teile(0), "'", "''") & "', '" & Replace(teile(1), "'", "''") & "')"
            End If
        End If
    Next i
End Sub

Beispielablauf in Access

Sub StarteAuslesung(pfad As String, rechnungID As Long)
    Dim base64 As String
    Dim json As String

    base64 = LeseDateiAlsBase64(pfad)
    json = AnalysiereMitNanonets(base64)
    SpeichereFelder rechnungID, json
    MsgBox "Rechnung verarbeitet."
End Sub

Was Du automatisch auslesen kannst

FeldBeschreibung
invoice_numberRechnungsnummer
invoice_dateRechnungsdatum
total_amountBruttosumme
supplier_nameAbsender/Firma
due_dateZahlungsziel

Was Du beachten musst

  • PDF muss klar lesbar sein (nicht gescanntes Chaos)
  • Felder müssen im Modell definiert sein
  • API-Limits beachten (z. B. 100/Monat im Free-Tarif)
  • Bei Fehlern: Log schreiben, Status prüfen

„Rechnungen einlesen nervt. Access übernimmt das – mit der richtigen API dahinter.“

Wenn Du sowas brauchst – ich baue Dir die Integration.
Ohne Cloud-Chaos, direkt in Deinem Access-Workflow.

Tags:

No responses yet

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert