Documentanalyse met Gemini
Gemini begrijpt PDF-documenten op een hoger niveau dan traditionele tekst-extractietools: het snapt context, tabellen, opmaak en de relatie tussen verschillende secties. Voor gescande documenten voert het automatisch OCR uit. Dit maakt het geschikt voor contractanalyse, factuurverwerking, rapportextractie en compliance-controle.
In plaats van losse tekstfragmenten krijg je antwoorden die rekening houden met de hele lay-out van het document, inclusief meerkolomspagina's, diagrammen en formuliervelden.
Nieuwe SDK sinds 2025
De oude google-generativeai library is sinds 30 november 2025 deprecated. Gebruik voortaan de unified google-genai SDK (pip install google-genai). Alle voorbeelden hieronder zijn daarop gebaseerd. Heb je nog oude code? Bekijk de officiële migratiegids van Google.
Voorbereiding
Installeer de SDK en zet je API-sleutel klaar als omgevingsvariabele.
pip install google-genai
export GEMINI_API_KEY="jouw-sleutel"
De client leest GEMINI_API_KEY automatisch uit de omgeving, dus je hoeft de sleutel niet hard te coderen.
PDF uploaden en analyseren
Voor documenten die je vaker hergebruikt of die groter zijn, upload je het bestand via de Files API. Geüploade bestanden blijven 48 uur beschikbaar.
from google import genai
client = genai.Client()
pdf_file = client.files.upload(file="contract.pdf")
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
pdf_file,
"Geef een samenvatting van dit document en markeer de meest kritieke clausules."
]
)
print(response.text)
Voor kleine, eenmalige documenten kun je de PDF ook direct inline meesturen, zonder upload:
from google import genai
from google.genai import types
import pathlib
client = genai.Client()
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
types.Part.from_bytes(
data=pathlib.Path("contract.pdf").read_bytes(),
mime_type="application/pdf",
),
"Vat dit document samen in vijf bullets."
]
)
print(response.text)
Gestructureerde data extraheren uit facturen
import json
from google import genai
client = genai.Client()
def extract_invoice_data(pdf_path: str) -> dict:
pdf_file = client.files.upload(file=pdf_path)
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
pdf_file,
"""Extraheer de volgende gegevens uit deze factuur als JSON:
{
"leverancier": {
"naam": "",
"adres": "",
"kvk": "",
"btwnummer": ""
},
"factuur": {
"nummer": "",
"datum": "",
"vervaldatum": "",
"betaalreferentie": ""
},
"regels": [
{
"omschrijving": "",
"aantal": 0,
"stukprijs": 0.0,
"btw_percentage": 0,
"totaal": 0.0
}
],
"totalen": {
"subtotaal": 0.0,
"btw": 0.0,
"totaal_incl_btw": 0.0
},
"bankrekening": ""
}
Retourneer alleen JSON, geen andere tekst.""",
],
)
return json.loads(response.text)
Forceer betrouwbare JSON
Vraag je om JSON, gebruik dan de structured-output optie van de SDK door een response_mime_type van application/json en een schema mee te geven via config. Gemini retourneert dan gegarandeerd geldige JSON in plaats van tekst die je nog moet opschonen.
Contracten analyseren
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
pdf_file,
"""Analyseer dit contract als juridisch adviseur:
1. Partijen en hun rollen
2. Looptijd en verlengingsclausules
3. Betalingsverplichtingen
4. Opzeggingstermijnen en -voorwaarden
5. Aansprakelijkheidsbeperkingen
6. Bijzondere risico's of ongebruikelijke clausules
7. Ontbrekende standaardclausules die je zou verwachten
Geef een risico-beoordeling (laag/gemiddeld/hoog).""",
],
)
Geen vervanging voor een jurist
Gemini geeft geen juridisch advies. Gebruik documentanalyse als eerste screening, maar laat contracten altijd door een gekwalificeerde jurist beoordelen bij juridisch bindende beslissingen.
Tabellen en data uit rapporten extraheren
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
pdf_file,
"""Zoek alle tabellen in dit document.
Converteer elke tabel naar een JSON-array van objecten.
Gebruik de kolomnamen als keys.
Retourneer: {"tables": [{"title": "", "data": [...]}]}""",
],
)
Meerdere documenten vergelijken
doc1 = client.files.upload(file="offerte_leverancier_a.pdf")
doc2 = client.files.upload(file="offerte_leverancier_b.pdf")
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
"Offerte A:",
doc1,
"Offerte B:",
doc2,
"""Vergelijk deze twee offertes in een tabel met:
- Prijs per eenheid
- Levertijd
- Garantievoorwaarden
- Betalingstermijnen
- Serviceniveau
Welke offerte adviseer je en waarom?""",
],
)
Compliance-controle automatiseren
import json
from google import genai
client = genai.Client()
def check_gdpr_compliance(document_path: str) -> dict:
pdf_file = client.files.upload(file=document_path)
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
pdf_file,
"""Controleer dit privacybeleid op AVG/GDPR-compliance.
Controleer aanwezigheid van:
- Verwerkingsdoeleinden (art. 13/14)
- Rechtsgronden per verwerking
- Rechten van betrokkenen
- Bewaartermijnen
- Derde partijen en doorgifte buiten EU
- Contactgegevens DPO/FG
- Klachtenprocedure AP
Geef per punt: aanwezig/afwezig/onvolledig met uitleg.
Formaat: JSON.""",
],
)
return json.loads(response.text)
Doorzoeken en vraagbeantwoording
def ask_about_document(pdf_path: str, question: str) -> str:
pdf_file = client.files.upload(file=pdf_path)
response = client.models.generate_content(
model="gemini-3.5-flash",
contents=[
pdf_file,
question,
"Citeer de relevante passage(s) letterlijk en geef het paginanummer als dat zichtbaar is.",
],
)
return response.text
Limieten en kosten in het kort
Houd rekening met deze grenzen
- Een PDF mag tot 1.000 pagina's of 50 MB groot zijn. Grotere documenten splits je vooraf op in delen.
- Elke documentpagina telt voor ongeveer 258 tokens. Een rapport van 100 pagina's kost dus al ruim 25.000 tokens aan invoer.
- Gebruik je hetzelfde document in meerdere vragen, zet dan context caching in om dezelfde tokens niet steeds opnieuw te betalen.
- Geüploade bestanden via de Files API blijven 48 uur beschikbaar. Daarna upload je opnieuw.
Hoeveel pagina's kan Gemini aan in één PDF?
Tot 1.000 pagina's of 50 MB per document, mits het geheel binnen het contextvenster van het model past. Voor grotere documenten splits je het PDF op in secties, of gebruik je context caching om tokenkosten te beperken.
Welk model gebruik ik en welke SDK?
Gebruik de unified google-genai SDK (pip install google-genai); de oude google-generativeai library is sinds eind 2025 deprecated. Voor documentanalyse is gemini-3.5-flash een goede en betaalbare keuze. Wil je maximale redeneerkwaliteit bij complexe contracten, kies dan een Pro-model.
Werkt documentanalyse ook met gescande, niet-doorzoekbare PDF?
Ja, Gemini voert automatisch OCR uit op gescande pagina's. De nauwkeurigheid is hoog bij duidelijk gescande documenten, maar kan tegenvallen bij slechte scankwaliteit, scheve pagina's of exotische lettertypen. Valideer kritieke velden altijd handmatig of met een controle in je code.
Kan ik ook Word- of Excel-bestanden meesturen?
Converteer die eerst naar PDF voor de beste resultaten. Gemini ondersteunt naast PDF ook platte tekst (.txt), maar niet native .docx of .xlsx.
Hoe krijg ik betrouwbaar gestructureerde JSON terug?
Geef in de config een response_mime_type van application/json mee, eventueel met een JSON-schema. Dan retourneert Gemini gegarandeerd geldige JSON die je direct met json.loads kunt inlezen, zonder losse tekst eromheen.
Hoe betrouwbaar is de data-extractie voor factuurverwerking?
Hoog voor gestructureerde, consistente factuurlay-outs. Voor diverse leveranciersformaten bouw je validatie in: vergelijk geëxtraheerde totalen met de optelsom van de regels en markeer discrepanties voor handmatige controle.