Extrahera data från fakturor med Python

Viktiga slutsatser:

  • Python är ett kraftfullt verktyg för att automatisera datautvinning från fakturor, men det saknas en universallösning
  • Parseur använder Python i bakgrunden för att extrahera information från fakturor åt dig
  • PDF är inget dataformat, utan en typografisk avbildning av ett pappersdokument

PDF-formatet

PDF är ett flexibelt format som gör det möjligt att återge pappersdokument som fakturor digitalt utan att begränsa designmöjligheterna. Formatet har sina rötter i traditionell tryckproduktion och är skapat för att digitalt efterlikna en tryckt sida. Denna flexibilitet innebär att skaparen av en PDF kan utforma den helt efter egna önskemål, och följa olika normer och regler.

Men när datan är inlåst i en PDF uppstår en utmaning. PDF:ens ostrukturerade natur kan stå i konflikt med det strukturerade angreppssätt som behövs för att hantera det stora antalet fakturor och mängden information som företag hanterar varje dag.

A screen capture of PDF file format layers
PDF file format layers

Vilka steg krävs för att extrahera data från en faktura?

Fakturor levereras oftast i PDF-format. En faktura formellt dokumenterar en transaktion mellan en leverantör och en kund, där produkter eller tjänster byts mot ett visst belopp. Så här ser processen ut för att extrahera relevant information:

  1. Specificera ett dataschema för de uppgifter du vill ta ut från dina fakturor
  2. Konvertera fakturan från bild till text
  3. Extrahera texten från fakturan enligt ditt dataschema
  4. Samla ihop den extraherade datan

A screen capture of Invoice data extraction process
Invoice data extraction process

Definiera ett schema för din fakturadata

Dina leverantörer skickar fakturor i olika utformning, men själva innehållet är alltid ungefär detsamma: du har en leverantör, en kund, ett fakturanummer, ett datum och en lista med artiklar, antal, beskrivning och kostnader. För att komma igång kan du se över det format ditt bokföringssystem använder, då det antagligen blir slutdestinationen för datan du extraherar. Om du behöver ett schema som täcker de flesta specialfall, rekommenderar vi att titta på schema.org där det finns branschstandardiserade dataformat, exempelvis för fakturor. Parseur erbjuder ett standardschema för fakturadata, men du kan anpassa det efter dina behov genom att byta namn på fälten, så här. När du har ditt dataschema på plats går du vidare till att konvertera fakturan från bild till text.

Exempel på hur ett fakturaschema kan se ut i JSON Swagger-format:

{
    "InvoiceNumber": {
        "type": "string",
        "description": "Fakturanumret"
    },
    "InvoiceIssueDate": {
        "type": "string",
        "description": "Fakturadatumet"
    },
    "Items": {
        "type": "array",
        "description": "Listan över artiklar i fakturan",
        "items": {
            "type": "object",
            "properties": {
                "quantity": {
                    "type": "number",
                    "description": "Antalet av artikeln"
                },
                "description": {
                    "type": "string",
                    "description": "Beskrivningen av artikeln"
                },
                "unit_price": {
                    "type": "number",
                    "description": "Styckpriset på artikeln"
                },
                "price": {
                    "type": "number",
                    "description": "Totala priset för artikeln"
                }
            }
        }
    }
}

Konvertera din faktura från bild till text

A screen capture of an invoice taken from a smartphone
Picture of an invoice taken from a smartphone

En PDF-fil kan innehålla en bild, till exempel när en anställd tar ett foto av en faktura med sin smartphone. Bilden sparas som PDF och skickas till ekonomiavdelningen, som förväntas extrahera all relevant data och registrera den felfritt i bokföringssystemet. Nästa steg blir att konvertera bilden till text med Optical Character Recognition (OCR). Ett av de vanligaste open source-OCR-verktygen är Tesseract – skrivet i C och C++. För att använda Tesseract i ett Python-flöde använder du en så kallad binding, PyTesseract. En binding gör det möjligt att köra bibliotek skrivna i andra språk direkt från Python. Det finns många OCR-lösningar och vilken som passar bäst beror på flera faktorer, däribland dokumentets kvalitet. Parseur känner automatiskt av om ett dokument är en bild och konverterar det automatiskt till text, vilket gör nästa steg möjligt: datautvinning.

Extrahera texten från din faktura enligt ditt dataschema

När du har fått din PDF till text- eller sökbart format, kan du använda pdftotext-biblioteket i Python för att omvandla PDF-innehållet till ren text. Här är ett exempel på hur du gör:

import pdftotext

# Ladda din faktura
with open("invoice.pdf", "rb") as file_handle:
    pdf = pdftotext.PDF(file_handle)

# Iterera igenom alla sidor
for page in pdf:
    print(page)

Döp detta skript till convert_pdf_to_text.py och kör det för att se fakturans textdata i utgången. Vill du spara innehållet till en fil, kör:

$ python convert_pdf_to_text.py > invoice.txt

Nu när du har fakturan som text kan du gå vidare och extrahera den information du behöver. Du kan använda:

  • Reguljära uttryck. De är kraftfulla för att känna igen och plocka ut information ur text, men kräver underhåll om fakturan ändras. De är inte heller optimala för tabeller.
  • Visuella mallar och zonbaserad eller dynamisk OCR (Zonal OCR och Dynamisk OCR). Dessa tekniker är robustare än reguljära uttryck men mer avancerade att bygga.
  • Maskininlärning. Denna metod innebär att du tränar modeller med ett stort antal exempel, vilket kräver tid och resurser. Maskininlärningssystem behöver ofta också efterkontrolleras manuellt.

Här visar vi hur du kan använda Pythons modul för reguljära uttryck, re, för att plocka ut ett fakturanummer:

import re

# Ladda din faktura
with open("invoice.txt", "r") as file_handle:
    invoice = file_handle.read()

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

Döp detta skript till extract.py och kör det så får du ut fakturanumret:

$ python extract.py

Resultatet kan till exempel bli:

INV-1234

Observera att detta fungerar så länge raden Invoice number: INV-1234 finns i fakturan. Byter leverantören format, måste du ändra uttrycket – något som snabbt blir tidsödande om du har fakturor i varierande format.

Det är här Parseur kommer in i bilden.

Skapa ditt gratis konto
Spara tid och ansträngning med Parseur. Automatisera dina dokument.

Med Parseur kan du använda reguljära uttryck och få hjälp av mallmotorn för att underlätta hantering. Dessutom får du tillgång till ett bibliotek med mallar vi byggt upp under åren. Du kan välja det extraktionssätt som passar dig bäst: reguljära uttryck, visuella mallar (OCR-motor) eller maskininlärning (AI). Dessa kan även kombineras för optimal flexibilitet. Parseur låter dig också gå igenom och korrigera extraktionerna, vilket är viktigt för att förbättra precisionen över tid.

Samla in den extraherade datan

Med Python kan du iterera över fakturafiler i en katalog och extrahera de uppgifter du vill ha. Till exempel, för att hämta fakturanummer och totalsumma och spara som CSV:

import os
import re

import pdftotext

# Skriv ut CSV-kolumnrubriker
print("InvoiceNumber,TotalAmount")

# Iterera genom alla PDF-filer i mappen
for filename in os.listdir("invoices/"):
    if not filename.endswith(".pdf"):
        continue

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

    # Iterera genom alla sidor
    for page in pdf:
        # Extrahera fakturanummer och totalsumma
        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=",")

Döp skriptet till extract_to_csv.py och kör det för att generera en CSV som enkelt kan öppnas i t.ex. Excel:

$ python extract_to_csv.py > invoices.csv

I Parseur har du, efter att ha extraherat fakturadata, möjlighet att ladda ner allt i kalkylbladsformat eller skicka det direkt till ditt bokföringssystem via webhook-integration, Make, Zapier eller Microsoft Power Automate. Du kan även använda vårt API för att hämta datan i JSON-format.

Slutsats

Jag hoppas du fått nytta av denna genomgång. Att extrahera information från fakturor med Python är en genomförbar men ibland utmanande process, speciellt om fakturaformaten varierar och tiden är knapp. Om du vill automatisera och hantera olika fakturaformat snabbare och säkrare kan du dra nytta av expertisen i Parseur – för flexibel och exakt datautvinning från alla dina fakturor.

Senast uppdaterad

Kom igång

Redo att få bort det manuella arbetet
ur er verksamhet?

Skapa ett gratis konto på några minuter och se hur Parseur kan förenkla ert arbetsflöde.

Ingen modellträning krävs
Byggt för verkliga arbetsflöden, inte för experiment
Från enkelt gränssnitt till full API-integration