logo
menu

Hoe tekst uit een PDF te extraheren in Python (3 Bibliotheken Vergeleken)

By Lynote Team | June 8, 2026

Tekst extraheren uit een PDF lijkt eenvoudig, maar elke ontwikkelaar die het heeft geprobeerd, weet dat het een vakgebied is bezaaid met uitzonderingen, kapotte lay-outs en hardnekkige, op afbeeldingen gebaseerde documenten. Deze gids snijdt door de ruis heen. We beginnen met een directe vergelijking van de beste Python-bibliotheken voor de taak, zodat je direct de juiste tool voor je project kunt kiezen.

extract-text-from-pdf-python.jpg

Vervolgens doorlopen we codevoorbeelden voor drie van de meest effectieve bibliotheken – PyPDF2, pdfplumber en PyMuPDF (Fitz) – en behandelen we alles van basis tekstschrapen tot het navigeren door complexe tabellen. We pakken ook de moeilijkste uitdaging aan: gescande PDF's die Optische Tekenherkenning (OCR) vereisen, en laten we je een pragmatische manier zien om deze te verwerken zonder complexe lokale installaties. Uiteindelijk beschik je over de code en de strategie om je PDF-verwerkingsworkflows betrouwbaar te automatiseren.

Snel Oordeel: Beste Python-bibliotheken voor PDF-tekstextractie

Voordat we in de code duiken, volgt hier een overzicht op hoog niveau van de topkandidaten. Je keuze hangt volledig af van of je snelheid, eenvoud of precieze lay-outanalyse nodig hebt.

BibliotheekBeste voorLay-out/TabelverwerkingPrestatiesGebruiksgemak (1-5)
PyPDF2Eenvoudige, alleen-tekst documenten; basis PDF-manipulatie (samenvoegen/splitsen)Slecht (extraheert tekststroom, geen positionele gegevens)Matig5
pdfplumberGegevens extraheren uit tabellen; documenten met gestructureerde lay-outsUitstekend (biedt coördinaten voor tekst, lijnen en rechthoeken)Langzamer4
PyMuPDF (Fitz)Snelle batchverwerking; omgaan met afbeeldingen en annotatiesGoed (kan tekst extraheren met basis positionele info)Uitstekend (snelst)4

Conclusie: Begin met PyPDF2 voor de eenvoudigste gevallen. Ga over op pdfplumber zodra je een tabel ziet. Kies PyMuPDF wanneer prestaties je voornaamste zorg zijn.

Voordat je begint: Je Python-omgeving instellen

Om de afhankelijkheden van je project schoon te houden en conflicten te voorkomen, werk je altijd binnen een virtuele omgeving. Dit is een ononderhandelbare best practice voor elk serieus Python-project.

Zo stel je het in je terminal in:

  1. Maak een virtuele omgeving aan:

    # On macOS/Linux
    python3 -m venv pdf_env
    
    # On Windows
    python -m venv pdf_env
    
  2. Activeer het:

    # On macOS/Linux
    source pdf_env/bin/activate
    
    # On Windows
    .\pdf_env\Scripts\activate
    

    Je terminalprompt zou nu (pdf_env) moeten tonen.

  3. Installeer de bibliotheken: We installeren alle drie de bibliotheken die we vergelijken, zodat je gemakkelijk kunt experimenteren.

    pip install pypdf2 pdfplumber pymupdf
    

    Hiermee is je omgeving klaar voor de onderstaande codevoorbeelden.


Methode 1: Basis tekstextractie met PyPDF2

PyPDF2 is de standaardbibliotheek voor fundamentele PDF-bewerkingen. Het is eenvoudig, bestaat al lang en is perfect voor "native" PDF's waarbij de tekst selecteerbaar is en geen deel uitmaakt van een afbeelding. Als je documenten eenvoudige rapporten, artikelen of tekstgebaseerde exports zijn, klaart PyPDF2 de klus met minimale code.

De belangrijkste beperking? Het leest de interne tekststroom van de PDF, die niet altijd overeenkomt met de visuele leesvolgorde, vooral bij lay-outs met meerdere kolommen. Het heeft ook geen concept van tabellen; het zal gewoon alle celtekst samenvoegen.

Hier is een eenvoudig script om alle tekst uit een PDF te extraheren:

# requirements: pip install pypdf2

import PyPDF2

def extract_text_with_pypdf2(pdf_path):
    """
    Extracts text from a PDF file using the PyPDF2 library.

    Args:
        pdf_path (str): The file path to the PDF.

    Returns:
        str: The extracted text content, or an error message.
    """
    try:
        with open(pdf_path, 'rb') as file:
            reader = PyPDF2.PdfReader(file)
            num_pages = len(reader.pages)
            print(f"Total pages: {num_pages}")

            full_text = ""
            for page_num in range(num_pages):
                page = reader.pages[page_num]
                full_text += page.extract_text() + "\n"
        
        return full_text

    except FileNotFoundError:
        return f"Error: The file at {pdf_path} was not found."
    except Exception as e:
        return f"An unexpected error occurred: {e}"

# --- Usage Example ---
pdf_file = 'path/to/your/document.pdf'
extracted_text = extract_text_with_pypdf2(pdf_file)

if "Error" not in extracted_text:
    print("--- Extracted Text ---")
    print(extracted_text)
else:
    print(extracted_text)

Dit script werkt prachtig voor eenvoudige tekst met één kolom. Maar wat gebeurt er als je het een financieel overzicht met nette tabellen geeft? Je krijgt een wirwar van tekst en cijfers zonder structuur. Dat is waar onze volgende bibliotheek uitblinkt.

Methode 2: Tabellen en lay-outs verwerken met pdfplumber

Wanneer je taak het extraheren van gestructureerde gegevens omvat, is pdfplumber de juiste tool. Gebouwd bovenop pdfminer.six, is het ontworpen om je gedetailleerde toegang te geven tot de geometrie van een PDF-pagina. Het "ziet" karakters, lijnen en rechthoeken, en het heeft een fantastische ingebouwde methode voor het detecteren en extraheren van tabellen.

Dit is een gamechanger voor data science en bedrijfsprocesautomatisering. Stel je voor dat je kwartaalcijfers uit een PDF-rapport van een bedrijf probeert te halen. Met PyPDF2 is het een nachtmerrie van stringparsing. Met pdfplumber kun je de gegevens als een schone lijst van lijsten pakken, klaar voor een Pandas DataFrame.

De belangrijkste reden waarom pdfplumber PyPDF2 overtreft voor gestructureerde gegevens, is het vermogen om de visuele lay-out te interpreteren, niet alleen de ruwe tekststroom. Het begrijpt dat bepaalde tekstelementen zijn uitgelijnd in rijen en kolommen, gescheiden door lijnen.

Hier is een eenvoudig script om alle tekst uit een PDF te extraheren:

# requirements: pip install pdfplumber

import pdfplumber
import pandas as pd

def extract_tables_with_pdfplumber(pdf_path, page_number=0):
    """
    Extracts all tables from a specific page of a PDF using pdfplumber.

    Args:
        pdf_path (str): The file path to the PDF.
        page_number (int): The page number to extract tables from (0-indexed).

    Returns:
        list of pandas.DataFrame: A list where each element is a DataFrame
                                  representing a table found on the page.
    """
    tables = []
    try:
        with pdfplumber.open(pdf_path) as pdf:
            if page_number >= len(pdf.pages):
                print(f"Error: Page {page_number} is out of range. The PDF has {len(pdf.pages)} pages.")
                return tables
            
            page = pdf.pages[page_number]
            # .extract_tables() is the key method here
            extracted_tables = page.extract_tables()
            
            for table_data in extracted_tables:
                # Convert the list of lists into a pandas DataFrame
                df = pd.DataFrame(table_data[1:], columns=table_data[0])
                tables.append(df)
        
        return tables

    except FileNotFoundError:
        print(f"Error: The file at {pdf_path} was not found.")
        return tables
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
        return tables

# --- Usage Example ---
# You'll need pandas for this example: pip install pandas
pdf_file_with_table = 'path/to/your/report.pdf'
all_tables = extract_tables_with_pdfplumber(pdf_file_with_table, page_number=0)

if all_tables:
    print(f"Found {len(all_tables)} table(s) on page 0.")
    for i, table_df in enumerate(all_tables):
        print(f"\n--- Table {i+1} ---")
        print(table_df)
else:
    print("No tables found on the specified page.")

De afweging voor deze precisie is snelheid. pdfplumber doet meer werk met het analyseren van de pagina, dus het is inherent langzamer dan bibliotheken die alleen de tekst dumpen.

Methode 3: Hoogwaardige extractie met PyMuPDF (Fitz)

Wanneer je honderden of duizenden PDF's snel moet verwerken, wordt prestatie de doorslaggevende factor. Dit is waar PyMuPDF, dat je importeert als fitz, domineert. Het is een Python-binding voor MuPDF, een lichtgewicht C-bibliotheek, wat het uitzonderlijk snel maakt.

Ik had eens een project waarbij enkele duizenden juridische documenten met meerdere pagina's verwerkt moesten worden. Mijn oorspronkelijke pdfplumber-script zou naar verwachting uren duren. Overstappen op PyMuPDF bracht de uitvoeringstijd terug tot minder dan 30 minuten. Het snelheidsverschil is zo dramatisch.

Naast snelheid is PyMuPDF een krachtpatser aan functies. Het kan pagina's renderen als afbeeldingen (cruciaal voor OCR-workflows), ingebedde afbeeldingen extraheren en annotaties verwerken. Hoewel de tabel-extractie niet zo kant-en-klaar is als die van pdfplumber, is de snelheid van ruwe tekstextractie ongeëvenaard.

Hier is het PyMuPDF-equivalent voor snelle tekstextractie:

# requirements: pip install PyMuPDF

import fitz  # The PyMuPDF library

def extract_text_with_pymupdf(pdf_path):
    """
    Extracts text from a PDF file using the high-performance PyMuPDF (Fitz) library.

    Args:
        pdf_path (str): The file path to the PDF.

    Returns:
        str: The extracted text content, or an error message.
    """
    try:
        doc = fitz.open(pdf_path)
        full_text = ""
        for page in doc:
            # .get_text() is the core function
            full_text += page.get_text() + "\n"
        
        doc.close()
        return full_text

    except FileNotFoundError:
        return f"Error: The file at {pdf_path} was not found."
    except Exception as e:
        # PyMuPDF can raise specific errors, e.g., fitz.fitz.FitzError
        return f"An error occurred with PyMuPDF: {e}"

# --- Usage Example ---
pdf_file = 'path/to/your/document.pdf'
fast_extracted_text = extract_text_with_pymupdf(pdf_file)

if "Error" not in fast_extracted_text:
    print("--- Extracted Text (Fast Method) ---")
    print(fast_extracted_text)
else:
    print(fast_extracted_text)

Voor pure doorvoer bij tekstgebaseerde PDF's is PyMuPDF de onbetwiste kampioen.


Speciaal geval: Omgaan met gescande PDF's met behulp van OCR

Je vraagt je misschien af: wat gebeurt er als geen van deze methoden werkt? Als je de bovenstaande code uitvoert op een gescand document – zoals een foto van een contract of een gedigitaliseerde boekpagina – krijg je een lege string terug.

Dit gebeurt omdat er geen tekstlaag is. De PDF bevat een afbeelding, geen tekens. Om dit op te lossen, heb je Optische Tekenherkenning (OCR) nodig om de afbeelding te 'lezen' en om te zetten in machinaal leesbare tekst.

De standaard Python-oplossing is pytesseract, een wrapper voor Google's Tesseract OCR-engine. Hoewel krachtig, brengt het een grote uitdaging met zich mee: je moet Tesseract afzonderlijk op je systeem installeren (bijv. via brew op Mac of een installer op Windows) en ervoor zorgen dat Python het uitvoerbare bestand kan vinden. Deze setup kan kwetsbaar zijn, vooral bij het implementeren van je code op een server of het delen ervan met collega's.

Alternatief: Complexe PDF's voorbewerken met een No-Code Tool

Wanneer je een strakke deadline hebt of simpelweg geen gedoe wilt met het beheren van OCR-afhankelijkheden, is een praktisch alternatief om de tekstextractie eerst uit te besteden aan een speciale tool. Dit scheidt het complexe OCR-probleem van je kern Python-logica.

Een AI-gestuurde tool zoals de Lynote AI PDF-tekstextractor kan fungeren als een krachtige voorverwerker. Je kunt je lastige gescande PDF uploaden, en deze zal de OCR achter de schermen afhandelen, waardoor je schone tekst krijgt die je vervolgens in je script kunt invoeren. Dit is vooral handig voor eenmalige taken of bij het omgaan met een kleine batch problematische bestanden.

Zo eenvoudig is de workflow:

  1. Upload je PDF-bestand. Navigeer naar de Lynote-werkruimte. Op het tabblad 'Bestand uploaden' kun je je PDF slepen en neerzetten of door je computer bladeren om het te selecteren. Dit werkt voor zowel tekstgebaseerde als gescande, op afbeeldingen gebaseerde PDF's.
  2. Extraheer tekst uit de PDF. Nadat het bestand is geüpload, klik je op de knop "Notitie maken". Lynote's AI-engine verwerkt het document, past automatisch OCR toe als het een op afbeeldingen gebaseerd bestand detecteert, en genereert een schone, doorzoekbare tekstversie.
  3. Kopieer de geëxtraheerde tekst. Zodra de tekst in de editor verschijnt, kun je deze controleren, kleine correcties aanbrengen en vervolgens de kopieerknop gebruiken om de hele inhoud te pakken. Het staat nu op je klembord, klaar om als stringvariabele in je Python-script te worden geplakt.

file-upload.jpg

extract-pdf-text.jpg

Deze aanpak stelt je in staat om je te concentreren op het data-analysegedeelte van je code, en niet op de infrastructuur en foutafhandeling van een lokale OCR-setup.

Veelvoorkomende valkuilen en geavanceerde tips

Tekst extraheren uit PDF's is zelden een perfect proces. Hier zijn enkele veelvoorkomende problemen die je waarschijnlijk zult tegenkomen:

  • Karaktercodering: Je kunt een UnicodeDecodeError tegenkomen. Dit gebeurt vaak bij oudere PDF's of PDF's die zijn gegenereerd door onbekende software. De meeste moderne bibliotheken verwerken UTF-8 goed, maar het specificeren van de codering kan soms helpen als de bibliotheek dit toestaat.
  • Met wachtwoord beveiligde PDF's: Als een PDF een wachtwoord vereist om te openen, zullen al deze bibliotheken falen. Je moet het wachtwoord opgeven tijdens het openingsproces. Bijvoorbeeld, PyPDF2.PdfReader(file, password='your_password').
  • Verlies van opmaak: Onthoud dat tekstextractie bijna altijd opmaak verliest, zoals vet, cursief, lettergrootte en kleur. Je krijgt de ruwe tekstinhoud, geen visuele weergave.
  • Verwarde tekst uit kolommen: Zoals vermeld bij PyPDF2, kunnen lay-outs met meerdere kolommen (zoals in academische papers) resulteren in tekst die regels uit verschillende kolommen door elkaar haalt. pdfplumber is veel beter in het scheiden hiervan, omdat het de geometrie van de pagina begrijpt.

Expert Tip: Test je script altijd op een representatieve steekproef van je documenten. Een oplossing die perfect werkt op de ene PDF, kan volledig falen op een andere van een andere bron.

Veelgestelde vragen

Waarom veranderde de geëxtraheerde tekst uit mijn tabel in één lange, rommelige string?

Dit is de klassieke faalmodus van bibliotheken zoals PyPDF2 die de paginalay-out niet analyseren. Ze lezen de ruwe tekststroom in de volgorde waarin deze in het bestand is opgeslagen, wat vaak niet overeenkomt met de visuele rij- en kolomstructuur. Om dit op te lossen, moet je een lay-outbewuste bibliotheek gebruiken zoals **pdfplumber**, die specifiek is ontworpen om tabulaire gegevens te herkennen.

Kan Python tekst extraheren uit een specifiek gebied van een PDF-pagina?

Ja, maar je hebt een bibliotheek nodig die coördinateninformatie biedt. pdfplumber en PyMuPDF zijn hier uitstekend voor. Met pdfplumber kun je de methode .crop((x0, top, x1, bottom)) gebruiken om een begrenzingskader te maken en vervolgens .extract_text() of .extract_tables() alleen binnen dat bijgesneden gebied uit te voeren.

Waarom is de geëxtraheerde tekst leeg voor mijn gescande PDF?

Je PDF bevat een afbeelding van tekst, geen daadwerkelijke tekstgegevens. Standaardbibliotheken kunnen geen afbeeldingen 'lezen'. Je moet een Optische Tekenherkenning (OCR)-proces gebruiken. Je kunt ofwel een lokale OCR-engine instellen met pytesseract of een voorverwerkingstool zoals Lynote gebruiken om de op afbeeldingen gebaseerde PDF eerst naar schone tekst te converteren.

Hoe ga ik om met PDF's met meerdere talen?

Moderne bibliotheken zoals PyMuPDF en pdfplumber verwerken Unicode (dat de meeste talen ondersteunt) over het algemeen goed. De grootste uitdaging komt tijdens OCR. Tesseract vereist bijvoorbeeld dat je de taalpakketten downloadt en specificeert die je wilt gebruiken (bijv. -l eng+fra voor Engels en Frans).

Conclusie: De juiste Python PDF-tool kiezen

Er is geen enkele "beste" bibliotheek voor het extraheren van tekst uit PDF's in Python. De juiste keuze wordt altijd bepaald door de aard van je documenten en de doelen van je project.

Laten we het samenvatten in een eenvoudige beslissingsboom:

  • Als je PDF's eenvoudige, tekstgebaseerde documenten zijn en je alleen de ruwe inhoud nodig hebt, is PyPDF2 het gemakkelijkst en snelst te implementeren.
  • Als je PDF's tabellen of gestructureerde lay-outs bevatten die je moet parsen naar gegevens (bijv. voor het laden in een database of een Pandas DataFrame), is pdfplumber de duidelijke winnaar.
  • Als je een groot volume documenten verwerkt en pure snelheid je topprioriteit is, is PyMuPDF (Fitz) de krachtigste en meest performante optie.
  • Als je te maken hebt met gescande, op afbeeldingen gebaseerde PDF's, moet je OCR gebruiken. Voor een snelle en betrouwbare oplossing zonder lokale installatieproblemen, is het voorbewerken van het bestand met een externe tool vaak de meest pragmatische weg voorwaarts voordat je de schone tekst in je Python-omgeving brengt.