Rechnungen mit Python verarbeiten

Portrait of Sylvain Josserand
von Sylvain Josserand
8 Minuten Lesezeit
Zuletzt aktualisiert am

Wichtigste Erkenntnisse:

  • Python kann Ihnen helfen, die Datenextraktion aus Rechnungen zu automatisieren, aber es gibt kein Patentrezept.
  • Parseur nutzt Python, um Daten aus Rechnungen für Sie zu extrahieren.
  • PDF ist kein Datenformat, sondern eine typografische Darstellung eines Papierdokuments.

Das PDF-Format

Das PDF-Format ist vielseitig und ermöglicht die genaue Darstellung von Papierdokumenten wie Rechnungen, ohne deren Gestaltung einzuschränken. Es stammt aus der Welt des Papierdrucks und ist als digitale Darstellung einer Druckseite konzipiert. Diese Flexibilität bietet große Freiheit, sodass PDF-Ersteller sich ausdrücken und verschiedene Normen und Vorschriften einhalten können.

Die Herausforderung besteht jedoch darin, dass die Daten in einem PDF-Dokument eingeschlossen sind. Die freie Form und Komplexität des Formats kann im Widerspruch zu dem strukturierten und konsistenten Ansatz stehen, der für die Verwaltung der riesigen Datenmengen erforderlich ist, die ein Unternehmen täglich verarbeitet.

Eine Bildschirmaufnahme der Ebenen des PDF-Dateiformats
Ebenen des PDF-Dateiformats

Was sind die Schritte, um Daten aus einer Rechnung zu extrahieren?

Eine Rechnung ist ein Dokument, das in der Regel im PDF-Format vorliegt. Eine Rechnung formalisiert eine Transaktion zwischen einem Lieferanten und einem Kunden, bei der ein Produkt oder eine Dienstleistung gegen einen bestimmten Geldbetrag ausgetauscht wird. Hier sind die Schritte, die erforderlich sind, um Daten aus diesem Dokument zu extrahieren:

  1. Definieren Sie ein Schema für die Daten, die Sie aus Ihren Rechnungen extrahieren möchten.
  2. Konvertieren Sie Ihre Rechnung von einem Bild in Text.
  3. Extrahieren Sie den Text aus Ihrer Rechnung gemäß Ihrem Datenschema.
  4. Sammeln Sie die extrahierten Daten.

Eine Bildschirmaufnahme des Prozesses der Rechnungdatenextraktion
Prozess der Rechnungdatenextraktion

Definieren Sie ein Schema für Ihre Rechnungsdaten

Rechnungen stammen von verschiedenen Lieferanten, und jeder Lieferant neigt dazu, das Aussehen seiner Rechnungen individuell zu gestalten. Trotz dieser realen Vielfalt in der Form ist der Inhalt aller Rechnungen im Grunde derselbe: Man braucht einen Lieferanten, einen Kunden, eine Rechnungsnummer, ein Datum und eine Liste von Artikeln mit der dazugehörigen Menge, Beschreibung und Kosten. Ein guter Ausgangspunkt für die Definition Ihres Rechnungsformats wäre Ihre Buchhaltungssoftware, da Sie Ihre extrahierten Rechnungsdaten höchstwahrscheinlich dort speichern werden. Wenn Sie nur ein Datenformat wünschen, das alle Fälle abdeckt, empfehle ich Ihnen die Website schema.org, die praktischerweise eine Reihe von Industriestandard-Datenformaten für viele Dinge definiert, einschließlich Rechnungen. Parseur definiert ein Standarddatenschema für Ihre Rechnungen, aber Sie können es an Ihren Anwendungsfall anpassen, indem Sie die Felder in Ihrem Rechnungseingang umbenennen, wie hier erläutert. Sobald Ihr Datenformat definiert ist, können Sie Ihre Rechnung von einem Bild in Text konvertieren.

Sie können beispielsweise die folgenden Felder für Ihre Rechnung im JSON-Swagger-Format definieren:

{
    "InvoiceNumber": {
        "type": "string",
        "description": "The invoice number"
    },
    "InvoiceIssueDate": {
        "type": "string",
        "description": "The invoice date"
    },
    "Items": {
        "type": "array",
        "description": "The list of items in the invoice",
        "items": {
            "type": "object",
            "properties": {
                "quantity": {
                    "type": "number",
                    "description": "The quantity of the item"
                },
                "description": {
                    "type": "string",
                    "description": "The description of the item"
                },
                "unit_price": {
                    "type": "number",
                    "description": "The unit price of the item"
                },
                "price": {
                    "type": "number",
                    "description": "The total price of the item"
                }
            }
        }
    }
}

Konvertieren Sie Ihre Rechnung von einem Bild in Text

Eine Bildschirmaufnahme einer Rechnung, die mit einem Smartphone aufgenommen wurde
Bild einer Rechnung, die mit einem Smartphone aufgenommen wurde

Eine PDF-Datei kann ein Bild enthalten. Zum Beispiel kann Ihr Mitarbeiter einen Schnappschuss einer Rechnung mit der Kamera seines Smartphones machen. Dieser wird dann als PDF gespeichert und an Ihre Buchhaltungsabteilung geschickt. Ihr Buchhaltungsteam ist dafür zuständig, die Daten aus dieser Rechnung zu extrahieren und sie fehlerfrei in Ihr Buchhaltungssystem zu übertragen. Der nächste Schritt besteht darin, dieses Bild mit einem optischen Zeichenerkennungssystem in Text umzuwandeln. Eines der beliebtesten OCR-Systeme ist Tesseract. Tesseract ist in C und C++ geschrieben. Um Tesseract von unserem Python-Programm aus verwenden zu können, müssen wir eine Bindung wie PyTesseract verwenden. Eine Bindung ist eine Möglichkeit, eine Softwarebibliothek (hier Tesseract) aus einer Sprache heraus aufzurufen, in der sie nicht geschrieben ist (hier Python). Es gibt viele solcher Systeme, und ihre Ergebnisse sind sehr unterschiedlich, je nach der zugrundeliegenden Technologie und der Qualität des Scans des Dokuments, an dem sie arbeiten. Parseur erkennt transparent, ob es sich bei Ihrem Dokument um ein Bild handelt, und wandelt es intern automatisch in Text um. Sobald die Daten des Dokuments in Textform vorliegen, können sie extrahiert werden.

Extrahieren Sie den Text aus Ihrer Rechnung gemäß Ihrem Datenschema.

Sobald sich Ihr PDF in Textform (oder durchsuchbarer Form) befindet, können Sie die Python-Bibliothek pdftotext verwenden, um die Daten aus der PDF-Datei als Text zu extrahieren. Hier ist ein Code-Snippet, um den Text aus einer PDF-Datei zu extrahieren:

import pdftotext

# Load your invoice
with open("invoice.pdf", "rb") as file_handle:
    pdf = pdftotext.PDF(file_handle)

# Iterate over all the pages
for page in pdf:
    print(page)

Nennen Sie dieses Skript convert_pdf_to_text.py und führen Sie es aus. Sie erhalten die Rechnung als Text in der Standardausgabe. Wenn Sie die Ausgabe in eine Datei umleiten möchten, können Sie Folgendes ausführen:

$ python convert_pdf_to_text.py > invoice.txt

Nachdem Sie die Rechnung nun in Textform vorliegen haben, können Sie die gewünschten Daten mit einer beliebigen Kombination der folgenden Techniken extrahieren:

  • Sie können einen regulären Ausdruck verwenden, um die gewünschten Daten zu extrahieren. Reguläre Ausdrücke sind eine leistungsstarke Möglichkeit, Daten aus Text zu extrahieren, aber sie sind auch sehr fehleranfällig. Wenn sich das Rechnungsformat ändert, müssen Sie Ihren regulären Ausdruck aktualisieren. Außerdem sind reguläre Ausdrücke nicht sehr gut geeignet, um Daten aus Tabellen zu extrahieren.
  • Sie können ein visuelles Template-System verwenden, das idealerweise Dynamisches OCR und Zonales OCR nutzt. Dies ist eine fortschrittlichere Methode, um Daten aus Text zu extrahieren. Sie ist robuster als reguläre Ausdrücke, aber auch komplexer zu implementieren.
  • Schließlich können Sie ein maschinelles Lernsystem verwenden. Maschinelles Lernen ist eine sehr leistungsstarke Methode, um Daten aus Text zu extrahieren. Sie ist aber auch am komplexesten zu implementieren. Sie müssen Ihr maschinelles Lernsystem mit einer großen Datenmenge trainieren. Dies ist ein sehr zeitaufwändiger Prozess. Außerdem sind Systeme für maschinelles Lernen nicht perfekt, und Sie müssen die Ergebnisse manuell überprüfen, um sicherzustellen, dass sie korrekt sind.

Lassen Sie uns Daten aus Ihrer Rechnung mit dem Python-Modul re für reguläre Ausdrücke extrahieren. Hier ist ein Code-Snippet, um die Rechnungsnummer aus Ihrer Rechnung zu extrahieren:

import re

# Load your invoice
with open("invoice.txt", "r") as file_handle:
    invoice = file_handle.read()

# Extract the invoice number
invoice_number = re.search(r"Invoice number: (\w+)", invoice).group(1)
print(invoice_number)

Nennen Sie dieses Skript extract.py und führen Sie es aus. Sie erhalten die Rechnungsnummer in der Standardausgabe:

$ python extract.py

Und Sie erhalten etwa Folgendes:

INV-1234

Beachten Sie, dass dies nur bei Rechnungen funktioniert, die mit einer Zeile wie Invoice number: INV-1234 formatiert sind. Wenn sich das Rechnungsformat ändert, müssen Sie Ihren regulären Ausdruck aktualisieren. Dies kann schnell zu einem Zeitfresser werden, wenn Sie es mit vielen verschiedenen Rechnungsformaten zu tun haben.

Parseur kann Ihnen dabei helfen.

Erstellen Sie Ihr kostenloses Konto
Sparen Sie Zeit und Mühe mit Parseur. Automatisieren Sie Ihre Dokumente.

Wenn Sie sich für die Verwendung von regulären Ausdrücken entscheiden, hilft Ihnen unsere Template-Engine bei der Verwaltung dieser Ausdrücke. Außerdem erhalten Sie Zugriff auf eine Bibliothek von Templates, die wir im Laufe der Jahre erstellt haben. Wir lassen Ihnen die Wahl der besten Extraktionsmethode für Ihren Anwendungsfall: Sie können reguläre Ausdrücke verwenden, aber auch visuelle Vorlagenerstellung und -abgleich (OCR-Engine) oder maschinelles Lernen (KI-Engine). Sie können diese Methoden sogar kombinieren, um das Beste aus allen Welten zu erhalten. Mit Parseur können Sie außerdem die Ergebnisse der Extraktion überprüfen und bei Bedarf korrigieren. Dies ist ein sehr wichtiger Schritt, da er Ihnen helfen wird, die Genauigkeit der Extraktion im Laufe der Zeit zu verbessern.

Sammeln Sie die extrahierten Daten

Mit Python können Sie die Rechnungsdateien in einem bestimmten Ordner durchlaufen und die Daten aus diesen Dateien extrahieren. Nehmen wir an, wir extrahieren die Rechnungsnummer und den Gesamtbetrag und geben das Ergebnis im CSV-Format aus:

import os
import re

import pdftotext

# Iterate over all the PDF files in the folder
for filename in os.listdir("invoices/"):
    if not filename.endswith(".pdf"):
        continue

    # Load your invoice
    with open("invoices/" + filename, "rb") as file_handle:
        pdf = pdftotext.PDF(file_handle)

    # Print the CSV column header
    print("InvoiceNumber,TotalAmount")

    # Iterate over all the pages
    for page in pdf:
        # Extract the invoice number
        invoice_number = re.search(r"Invoice number: (\w+)", page).group(1)
        total_amount = re.search(r"Total amount: (\w+)", page).group(1)
        print(invoice_number, total_amount, sep=",")

Nennen Sie dieses Skript extract_to_csv.py und führen Sie es aus. Sie erhalten die Rechnungsnummer und den Gesamtbetrag in der Standardausgabe, die Sie in eine CSV-Datei umleiten können, die Sie später mit Ihrer bevorzugten Tabellenkalkulationssoftware wie Excel öffnen können:

$ python extract_to_csv.py > invoices.csv

Sobald Sie die Daten aus Ihren Rechnungen extrahiert haben, können Sie sie in Parseur als Tabellenkalkulation herunterladen oder direkt in Ihre Buchhaltungssoftware exportieren, indem Sie die direkte Webhook-Integration, Make, Zapier oder Microsoft Power Automate verwenden. Sie können auch unsere API verwenden, um die Daten im JSON-Format abzurufen.

Fazit

Ich hoffe, dieser Artikel war hilfreich für Sie. Kurz gesagt: Das Extrahieren von Daten aus Rechnungen mit Python ist ein komplexer Prozess, aber es ist möglich, solange Ihre Rechnungen konsistent sind und Sie viel Zeit dafür aufwenden können. Falls Ihre Zeit begrenzt ist, können Sie die gesammelten Erfahrungen und das Wissen nutzen, die im Laufe der Jahre in Parseur eingeflossen sind, um Ihr Ziel schneller zu erreichen und Daten aus all Ihren Rechnungen flexibel und präzise zu extrahieren.

Zuletzt aktualisiert am

KI-basierte Datenextraktionssoftware.
Nutzen Sie Parseur noch heute.

Automatisieren Sie die Textextraktion aus E-Mails, PDFs und Tabellen.
Sparen Sie Hunderte von Stunden manueller Arbeit.
Nutzen Sie die Arbeitsautomatisierung mit KI.

Kostenlos anmelden
Parseur rated 5/5 on Capterra
Parseur.com has the highest adoption on G2
Parseur.com has the happiest users badge on Crozdesk
Parseur rated 5/5 on GetApp
Parseur rated 4.5/5 on Trustpilot