Belangrijkste punten:
- Met Python kun je het extraheren van gegevens uit facturen automatiseren, maar er is geen wonderoplossing.
- Parseur maakt gebruik van Python om automatisch data uit facturen te halen.
- PDF is geen echt dataformaat, maar een typografische afbeelding van een papieren document.
Het PDF-formaat
Het PDF-formaat is veelzijdig en zorgt voor een nauwkeurige weergave van papieren documenten, zoals facturen, zonder dat het ontwerp wordt beperkt. De oorsprong ligt in de papierwereld en het is bedoeld als digitale versie van een geprinte pagina. Deze flexibiliteit biedt veel vrijheid aan makers, waardoor PDF-bestanden aan verschillende standaarden en regels kunnen voldoen.
De uitdaging ontstaat wanneer gegevens opgesloten zijn in een PDF. De vrije en complexe aard van het formaat kan botsen met de behoefte aan structuur en consistentie wanneer bedrijven dagelijks grote hoeveelheden data willen verwerken.

Wat zijn de stappen om data uit een factuur te halen?
Facturen worden meestal als PDF aangeleverd. Een factuur documenteert de transactie tussen leverancier en klant, waarbij een product of dienst wordt geleverd tegen een bepaald bedrag. Hieronder vind je de gebruikelijke stappen om data uit zo'n document te halen:
- Bepaal welke gegevens je uit je facturen wilt halen en leg een schema vast.
- Zet de factuur om van afbeelding naar tekst.
- Haal de gewenste tekst uit de factuur volgens je gegevenenschema.
- Verzamel de geëxtraheerde gegevens.

Definieer een schema voor je factuurgegevens
Facturen komen van uiteenlopende leveranciers en elk gebruikt meestal een eigen lay-out. Ondanks de verschillen is de basisinhoud vrijwel gelijk: je vindt altijd gegevens van de leverancier, klant, een factuurnummer, datum en een lijst met items, zoals hoeveelheid, beschrijving en prijs. Een goed beginpunt voor het definiëren van een factuurschema is je boekhoudsoftware, want daarin sla je de geëxtraheerde data waarschijnlijk op. Wil je een universeel dataformaat dat zoveel mogelijk facturen dekt? Bekijk dan de website van schema.org, waar standaard dataschema’s worden beschreven voor allerlei sectoren, waaronder facturen. Parseur biedt standaard dataschema’s voor facturen, die je makkelijk aanpast aan jouw eisen door veldnamen in de mailbox te wijzigen, zoals hier uitgelegd. Staat je datastructuur vast, dan kun je aan de slag met de omzetting van je factuur van afbeelding naar tekst.
Hieronder vind je een voorbeeld van een opgezet factuurschema in JSON Swagger-indeling:
{
"InvoiceNumber": {
"type": "string",
"description": "Het factuurnummer"
},
"InvoiceIssueDate": {
"type": "string",
"description": "De factuurdatum"
},
"Items": {
"type": "array",
"description": "De lijst met producten/diensten 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 wanneer een collega snel een foto van een factuur maakt met een smartphone. Daarna wordt deze afbeelding als PDF opgeslagen en doorgezet naar de administratie. Het boekhoudteam haalt vervolgens de noodzakelijke data uit deze factuur en zet deze correct in het systeem. De volgende stap is om van deze afbeelding tekst te maken met een Optical Character Recognition (OCR)-systeem. Een van de populairste OCR-engines is Tesseract. Dit programma is geschreven in C en C++. Om Tesseract met Python aan te sturen, gebruik je bijvoorbeeld PyTesseract, een binding die communicatie tussen Python en Tesseract mogelijk maakt. Er zijn veel van dergelijke systemen en hun resultaten hangen sterk af van de gebruikte technologie en van de kwaliteit van de scan. Parseur detecteert automatisch of je document een afbeelding is en zet deze intern om naar tekst. Zodra je document tekstueel is, kun je de gegevens eruit halen.
Haal de tekst uit je factuur volgens je gegevenenschema
Zodra je over een doorzoekbare tekstversie van de factuur beschikt, kun je de pdftotext Python-library inzetten om de volledige tekst te extraheren. Hier zie je hoe dat er in Python uit zou kunnen zien:
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)
Sla dit script op als convert_pdf_to_text.py
en voer het uit om de factuurtekst naar het scherm te sturen.
Wil je de uitvoer in een bestand opslaan? Dat kan zo:
$ python convert_pdf_to_text.py > invoice.txt
Nu kun je uit de tekst de gewenste data halen met de volgende technieken:
- Gebruik reguliere expressies om patronen te herkennen en data te extraheren. Regex is krachtig, maar ook gevoelig voor aanpassingen: als het factuurformaat wijzigt, moet de regex worden aangepast. Bovendien zijn reguliere expressies minder geschikt voor tabellen.
- Een visueel sjabloon of templatesysteem, liefst gebaseerd op Dynamische OCR en Zonale OCR, werkt betrouwbaarder dan regex, maar is lastiger te bouwen.
- Geavanceerder is het inzetten van machine learning. Dit vereist meer opzet en trainingsdata, en de resultaten moeten nauwkeurig worden gecontroleerd. ML is krachtig maar vraagt aanzienlijke voorbereiding en validatie.
Laten we als voorbeeld data extraheren met reguliere expressies via Python’s re-module. Zo kun je het factuurnummer uit een factuurtekst 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)
Sla het bestand op als extract.py
en voer het uit:
$ python extract.py
Dit levert bijvoorbeeld op:
INV-1234
Let op: deze aanpak werkt alleen als de facturen steeds een regel bevatten als Invoice number: INV-1234
.
Verandert het format, dan moet je de reguliere expressie aanpassen. Dat kan tijdrovend zijn bij veel verschillende layouts.
Daar helpt Parseur je bij.
Maak je gebruik van parsing op basis van reguliere expressies, dan ondersteunt onze template-engine je bij het beheren hiervan, en daarnaast krijg je toegang tot een bibliotheek met sjablonen die we in de loop der jaren hebben samengesteld. Wij laten jou de extractiemethode kiezen die bij jouw situatie past: je kunt gebruikmaken van reguliere expressies, maar ook visuele templates opstellen (OCR-engine) of machine learning inzetten (AI-engine). Deze methodes kun je zelfs combineren voor maximale flexibiliteit. Parseur helpt je bovendien bij het controleren en eventueel corrigeren van de resultaten. Dit is een belangrijke stap, zodat je extractienauwkeurigheid met elk verwerkt document verbetert.
Verzamel de geëxtraheerde gegevens
Met Python kun je over alle factuurbestanden in een map itereren en per bestand de gewenste gegevens extraheren. Wil je bijvoorbeeld het factuurnummer en totaalbedrag verzamelen en dit als CSV opslaan? Zo kan dat:
import os
import re
import pdftotext
# Print de CSV-kopregel
print("InvoiceNumber,TotalAmount")
# Loop over alle PDF-bestanden in de map
for filename in os.listdir("invoices/"):
if not filename.endswith(".pdf"):
continue
with open("invoices/" + filename, "rb") as file_handle:
pdf = pdftotext.PDF(file_handle)
for page in pdf:
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=",")
Sla het script op als extract_to_csv.py
en voer het uit. De resultaten kun je vervolgens omleiden naar een CSV-bestand,
dat je kunt openen in bijvoorbeeld Excel:
$ python extract_to_csv.py > invoices.csv
Gebruik je Parseur om data uit facturen te halen, dan kun je de resultaten downloaden als spreadsheet of rechtstreeks exporteren naar je boekhoudprogramma, via directe webhook-integratie, Make, Zapier of Microsoft Power Automate. Je kunt ook onze API raadplegen om data in JSON-formaat te ontvangen.
Conclusie
Hopelijk heb je wat aan dit artikel gehad. Gegevens uit facturen halen met Python kan een complex proces zijn, zeker als je facturen erg verschillen van opmaak. Als je facturen consistent zijn én je investeert graag tijd, kun je prima uit de voeten met Python. Maar als je snel resultaat en hoge nauwkeurigheid wilt, kies dan voor het platform en de ervaring van Parseur om flexibel en betrouwbaar je data uit alle facturen te halen.
Laatst bijgewerkt op