# Documenten analyseren met de Gemini API [[TOC]] ## 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. :::info title="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. ```bash 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. ```python 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: ```python 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 ```python 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) ``` :::tip title="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 ```python 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).""", ], ) ``` :::warn title="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 ```python 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 ```python 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 ```python 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 ```python 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 :::howto title="Houd rekening met deze grenzen" 1. Een PDF mag tot **1.000 pagina's** of **50 MB** groot zijn. Grotere documenten splits je vooraf op in delen. 2. Elke documentpagina telt voor ongeveer **258 tokens**. Een rapport van 100 pagina's kost dus al ruim 25.000 tokens aan invoer. 3. Gebruik je hetzelfde document in meerdere vragen, zet dan **context caching** in om dezelfde tokens niet steeds opnieuw te betalen. 4. Geüploade bestanden via de Files API blijven **48 uur** beschikbaar. Daarna upload je opnieuw. ::: :::faq ### 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. :::