Belangrijkste punten:
- Met Python kun je het extraheren van gegevens uit facturen automatiseren, maar er is geen wonderoplossing.
- Parseur maakt gebruik van Python om gegevens uit facturen voor jou te halen.
- PDF is geen dataformaat, maar een typografische weergave van een papieren document.
Het PDF-formaat
Het PDF-formaat is veelzijdig en zorgt voor een nauwkeurige weergave van papieren documenten, zoals facturen, zonder beperkingen qua ontwerp. De oorsprong ligt in de papieren printwereld en het is bedoeld als digitale versie van een geprinte pagina. Deze flexibiliteit biedt veel vrijheid, zodat PDF-makers zich kunnen uitdrukken en kunnen voldoen aan verschillende standaarden en regelgeving.
De uitdaging ontstaat wanneer gegevens opgesloten zijn in een PDF. De vrije en complexe aard van het formaat kan botsen met de gestructureerde en consistente aanpak die nodig is om de enorme hoeveelheid gegevens te beheren die een bedrijf dagelijks verwerkt.

Wat zijn de stappen om data uit een factuur te halen?
Een factuur wordt meestal als PDF aangeleverd. Een factuur formaliseert een transactie tussen een leverancier en een klant, waarbij een product of dienst wordt geleverd voor een nauwkeurig bedrag. Dit zijn de stappen die nodig zijn om gegevens uit dit document te halen:
- Bepaal een schema voor de gegevens die je uit je facturen wilt halen
- Zet je factuur om van afbeelding naar tekst
- Haal de tekst uit je factuur op basis van je gegevenenschema
- Verzamel de geëxtraheerde gegevens

Definieer een schema voor je factuurgegevens
Facturen komen van verschillende leveranciers en iedere leverancier past de lay-out van zijn facturen vaak aan. Ondanks deze diversiteit in vorm is de inhoud van facturen in de basis hetzelfde: je hebt een leverancier, een klant, een factuurreferentie, een datum en een lijst van items met hoeveelheid, beschrijving en prijs. Een goed startpunt voor het definiëren van je factuurformaat is jouw boekhoudsoftware, want daar sla je de geëxtraheerde factuurgegevens waarschijnlijk uiteindelijk toch op, nietwaar? Wil je een formaat dat alle uitzonderingen dekt? Bekijk dan de website van schema.org, waar je een reeks industriestandaard dataschema’s vindt voor heel veel zaken, waaronder facturen. Parseur definieert een standaard dataschema voor jouw facturen, maar je kunt dit schema aanpassen aan jouw situatie door de velden in jouw factuurmailbox te hernoemen, zoals hier uitgelegd. Heb je eenmaal je dataformaat vastgelegd, dan kun je de factuur gaan omzetten van afbeelding naar tekst.
Hieronder vind je een voorbeeld van een schema in JSON Swagger-formaat:
{
"InvoiceNumber": {
"type": "string",
"description": "Het factuurnummer"
},
"InvoiceIssueDate": {
"type": "string",
"description": "De factuurdatum"
},
"Items": {
"type": "array",
"description": "De lijst met items op de factuur",
"items": {
"type": "object",
"properties": {
"quantity": {
"type": "number",
"description": "De hoeveelheid van het item"
},
"description": {
"type": "string",
"description": "De beschrijving van het item"
},
"unit_price": {
"type": "number",
"description": "De eenheidsprijs van het item"
},
"price": {
"type": "number",
"description": "De totale prijs van het item"
}
}
}
}
}
Zet je factuur om van afbeelding naar tekst

Een PDF kan een afbeelding bevatten. Bijvoorbeeld als een medewerker snel een foto van een factuur maakt met een smartphone. Deze wordt als PDF opgeslagen en naar de administratie gestuurd. Jouw boekhoudteam is vervolgens verantwoordelijk voor het extraheren van de gegevens en voor het foutloos invoeren in het boekhoudsysteem. De volgende stap is de afbeelding om te zetten naar tekst met behulp van een Optical Character Recognition systeem. Een van de populairste OCR-systemen is Tesseract. Tesseract is geschreven in C en C++. Om Tesseract vanuit Python te gebruiken, heb je bijvoorbeeld PyTesseract nodig. Een binding is een manier om een softwarebibliotheek (hier Tesseract) aan te roepen vanuit een niet-ondersteunde programmeertaal (hier Python). Er bestaan veel van dergelijke systemen en de resultaten verschillen sterk afhankelijk van de onderliggende technologie en de kwaliteit van de scan. Parseur detecteert automatisch of je document een afbeelding is en zet het intern automatisch om naar tekst. Als het document als tekst beschikbaar is, kan de extractie beginnen.
Haal de tekst uit je factuur op basis van je gegevenenschema
Als je PDF eenmaal in tekst (of doorzoekbare) vorm is, kun je de pdftotext Python-library gebruiken om de tekst uit het PDF-bestand te halen. Hier zie je een codevoorbeeld om tekst uit een PDF-bestand te halen:
import pdftotext
# Laad je factuur
with open("invoice.pdf", "rb") as file_handle:
pdf = pdftotext.PDF(file_handle)
# Loop over alle pagina's
for page in pdf:
print(page)
Noem dit script convert_pdf_to_text.py en voer het uit; je krijgt de factuur als tekst naar de standaarduitvoer.
Wil je de uitvoer naar een bestand omleiden? Doe dan:
$ python convert_pdf_to_text.py > invoice.txt
Nu je de factuur als tekst hebt, kun je de gewenste gegevens eruit halen met de volgende technieken:
- Je kunt een reguliere expressie gebruiken om de benodigde data te extraheren. Regex is krachtig, maar ook kwetsbaar: als het formaat van de factuur verandert, moet je de reguliere expressie aanpassen. Bovendien werkt regex niet goed bij het extraheren van gegevens uit tabellen.
- Je kunt een visueel sjabloon-systeem gebruiken, bij voorkeur met gebruik van Dynamische OCR en Zonale OCR. Dit is een geavanceerdere manier en robuuster dan regex, maar het is ook ingewikkelder om te realiseren.
- Tenslotte kun je een machine learning systeem inzetten. Machine learning is krachtig, maar het meest complex om op te zetten. Je moet het systeem trainen met veel data, wat tijd kost. Ook zijn machine learning-systemen niet perfect en moet je de resultaten handmatig controleren.
Laten we eens data uit je factuur halen met behulp van Python’s reguliere expressies (re-module). Hier zie je een codevoorbeeld om het factuurnummer uit je factuur te halen:
import re
# Laad je factuur
with open("invoice.txt", "r") as file_handle:
invoice = file_handle.read()
# Haal het factuurnummer eruit
invoice_number = re.search(r"Invoice number: (\w+)", invoice).group(1)
print(invoice_number)
Noem dit script extract.py en voer het uit; je krijgt het factuurnummer naar de standaarduitvoer:
$ python extract.py
En je krijgt bijvoorbeeld:
INV-1234
Let op: dit werkt alleen bij facturen die een regel bevatten als Invoice number: INV-1234.
Als het formaat verandert, moet je de reguliere expressie aanpassen.
Dit kan al snel veel tijd kosten als je veel verschillende factuurformaten moet verwerken.
Daar kan Parseur je bij helpen.
Als je kiest voor parsing met reguliere expressies, helpt onze template-engine je bij het beheren daarvan. Je krijgt bovendien toegang tot een templatebibliotheek die we door de jaren heen hebben opgebouwd. Wij laten jou de beste extractiemethode voor jouw situatie kiezen: je kunt reguliere expressies gebruiken, maar ook visuele templatebouw en matching (OCR-engine), of machine learning (AI-engine). Je kunt deze zelfs combineren voor het beste van alle werelden. Parseur laat je ook de resultaten van de extractie controleren en waar nodig corrigeren. Dit is een belangrijke stap om de nauwkeurigheid van de extractie in de loop van de tijd te verbeteren.
Verzamel de geëxtraheerde gegevens
Met Python kun je over de factuurbestanden in een map itereren en per bestand de gewenste gegevens extraheren. Stel dat je het factuurnummer en het totaalbedrag wilt extraheren, en het resultaat als CSV wilt exporteren:
import os
import re
import pdftotext
# Loop over alle PDF-bestanden in de map
for filename in os.listdir("invoices/"):
if not filename.endswith(".pdf"):
continue
# Laad je factuur
with open("invoices/" + filename, "rb") as file_handle:
pdf = pdftotext.PDF(file_handle)
# Print de CSV-kopregel
print("InvoiceNumber,TotalAmount")
# Loop over alle pagina's
for page in pdf:
# Haal het factuurnummer eruit
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=",")
Noem dit script extract_to_csv.py en voer het uit; je krijgt het factuurnummer en totaalbedrag naar de standaarduitvoer,
die je kunt omleiden naar een CSV-bestand dat je later met je favoriete spreadsheetsoftware als Excel kunt openen:
$ python extract_to_csv.py > invoices.csv
In Parseur kun je, als je de gegevens uit je facturen hebt gehaald, alles downloaden als spreadsheet of direct exporteren naar je boekhoudsoftware, via directe webhook-integratie, Make, Zapier of Microsoft Power Automate. Je kunt onze API ook gebruiken om je data in JSON-formaat op te halen.
Conclusie
Hopelijk vond je dit artikel nuttig. Kortom: gegevens uit facturen halen met Python is een complex proces, maar het kan, zolang je facturen consistent zijn en je er veel tijd in steekt. Heb je minder tijd, maak dan gebruik van de opgebouwde ervaring en flexibiliteit van Parseur om sneller jouw doel te bereiken en nauwkeurig gegevens uit al je facturen te halen.
Laatst bijgewerkt op






