Meerdere PDF's in één keer naar Markdown converteren

Door pdftomd.tools-team · Bijgewerkt op · 7 min leestijd

Om meerdere PDF's tegelijk naar Markdown te converteren, selecteer je ze allemaal op een batchpagina, zoals onze converter voor meerdere PDF's, en download je één ZIP. Voor honderden bestanden of een terugkerende klus werkt een korte Python-lus beter, en voor lastige lay-outs het mapcommando van marker. Welke route je ook kiest: controleer daarna of er geen uitvoer leeg is gebleven.

Illustratie: een waaier van PDF-bestanden die in een ZIP-archief met Markdown-bestanden stroomt

Kies de methode op aantal

De juiste route hangt minder af van de PDF's zelf dan van hoeveel het er zijn en hoe vaak de klus terugkomt. Grofweg:

  • Een handvol tot een paar dozijn, eenmalig: een batchpagina in de browser. Niets te installeren, en de bestanden blijven op je apparaat.
  • Honderden, of elke week: een Python-lus over een map. Je kunt hem inplannen, loggen en de mapstructuur behouden.
  • Scans, formulieren, formules, ongewone lay-outs: een modelgebaseerde tool zoals marker. Op een gewone laptop is die flink trager. Hij is gebouwd om pagina's zonder tekstlaag met OCR te lezen, maar in onze CPU-run bleef onze gescande pagina toch leeg; test dus eerst een paar bestanden.
Illustratie: drie kaarten met steeds hogere stapels PDF's, bediend door een browservenster, een terminal en een serverrek
Kleine stapel: browser. Terugkerende stapel: script. Enorme of lastige stapel: een modelgebaseerde tool op een krachtige machine.

Om de drie routes eerlijk te vergelijken, gebruikten we een testset van 20 bestanden met samen 40 pagina's: twaalf tabel- en lay-outvoorbeelden, een Engelse handleiding, een Chinees rapport van 11 pagina's, een rapport van 4 pagina's met herhaalde kopteksten, een gescande pagina zonder tekstlaag en twee verschillende bestanden die allebei notes.pdf heten, in twee mappen. Alles draaide op onze buildmachine (Linux x86_64, 8 vCPU, 16 GB RAM, no GPU).

Meerdere PDF's naar Markdown converteren in de browser

Open vooraf twee of drie van de PDF's en probeer een zin te selecteren. Lukt dat, dan heeft het bestand een tekstlaag en werkt elke methode hieronder. Lukt het niet, dan is het een scan of afbeelding en haalt alleen een OCR-tool er woorden uit. Wie vooraf weet wat voor mix hij heeft, bespaart zich een tweede ronde.

Open de batchpagina, klik op Bestanden kiezen (of sleep een selectie naar het neerzetvlak) en kies alle PDF's in één keer. Elk bestand wordt in het tabblad geconverteerd, het een na het ander, en de pagina biedt één ZIP aan met een .md per PDF. Omdat het werk lokaal gebeurt, hangt de snelheid af van je apparaat, niet van een upload. Zo converteer je meerdere PDF's het snelst naar Markdown als ze allemaal op één computer staan.

Schermafbeelding: meerdere PDF's tegelijk naar Markdown converteren op onze batchpagina, resultatenlijst met aantal pagina's en tabellen en de knop ZIP downloaden
Schermafbeelding van onze run met 20 bestanden: elk bestand krijgt een rij met het aantal pagina's en tabellen.

In onze tests duurde de hele set, van bestanden kiezen tot kant-en-klare ZIP, ongeveer 0,8 seconde in Chrome 155.0.8059.84 (drie runs, tussen 0,8 en 1,0 seconde). De ZIP bevatte 20 Markdown-bestanden. De twee notes.pdf kwamen eruit als notes.md en notes-2.md, geen van beide overschreef de ander, en de gescande pagina werd in de lijst gemarkeerd in plaats van stilletjes te mislukken.

De grenzen: een browser kan uit zichzelf geen mappenstructuur lezen, dus bestanden uit meerdere mappen komen naast elkaar in één ZIP terecht, en heel grote aantallen worden begrensd door het geheugen van het tabblad. Voor een paar honderd bestanden splits je de selectie in rondes of stap je over op een script.

Een Python-lus met pymupdf4llm

Een Python-script voor deze klus is maar een paar regels lang. Dit script converteert een map vol PDF's naar Markdown: het loopt door de map, houdt in de uitvoer dezelfde structuur aan (zodat de twee notes-bestanden gescheiden blijven) en gaat door als een bestand mislukt:

import pathlib, pymupdf4llm

src, out = pathlib.Path("pdfs"), pathlib.Path("markdown")
for pdf in sorted(src.rglob("*.pdf")):
    dest = out / pdf.relative_to(src).with_suffix(".md")
    dest.parent.mkdir(parents=True, exist_ok=True)
    try:
        dest.write_text(pymupdf4llm.to_markdown(str(pdf)), encoding="utf-8")
    except Exception as e:
        print(f"skipped {pdf}: {e}")
Installeren met pip install pymupdf4llm. De bibliotheek valt onder AGPL-3.0; Artifex verkoopt een commerciële licentie.

Met dezelfde 20 bestanden was de lus in onze tests na 5,3 seconden klaar, inclusief het starten van Python en het importeren van de bibliotheek. Hij schreef 20 bestanden. Twee waren leeg: de gescande pagina, die geen leesbare tekst heeft, en een pagina met een tabel die 90 graden gedraaid is. Voor duizenden bestanden kan dezelfde lus in een procespool draaien, één worker per CPU-kern, want elk bestand staat op zichzelf. Onze Python-gids behandelt de opties voor tabellen en paginabereiken, en onze vergelijking van bibliotheken laat zien hoe pymupdf4llm het doet tegenover twee alternatieven.

Het mapcommando van marker

marker heeft een commando voor een hele map: marker /path/to/pdfs --output_dir out. Het leest alleen het bovenste niveau van de map (het script somt die op met os.listdir), dus kopieerden we onze bestanden eerst naar één platte map. Handige opties zijn --workers voor parallelle processen, --skip_existing om een onderbroken run te hervatten en --max_files voor een proefrun.

Met standaardinstellingen op onze machine zonder GPU duurde de map in onze tests 5 min 51 s, inclusief het laden van de modellen, en leverde hij 20 uitvoerbestanden op. Dat is ongeveer 66 keer zo lang als de Python-lus. De gedraaide tabel werd gered, maar wel dubbel geschreven, en voor de gescande pagina gaf hij in onze run toch een leeg bestand. Op een machine met een ondersteunde GPU ziet het er anders uit; gebruik marker op een laptop alleen voor de bestanden die het nodig hebben.

Bestandsnamen, dubbele namen en mapstructuur

Illustratie: twee mappen met elk een bestand met dezelfde naam, samengevoegd in een ZIP die twee aparte Markdown-bestanden bewaart
Twee bestanden, één naam: de ZIP moet ze allebei houden.
  • Dubbele namen: als je veel PDF's tegelijk converteert, bepaal dan wat er gebeurt met dezelfde bestandsnaam in twee mappen. Onze batchpagina voegt een nummer toe; de lus hierboven behoudt de submappen; een naïef script overschrijft het eerste bestand zonder waarschuwing.
  • Structuur: heeft de mappenstructuur betekenis (een map per klant of per jaar), behoud hem dan, met relative_to zoals hierboven of door de batchpagina per map te gebruiken.
  • Namen: houd de basisnaam van de PDF aan voor de .md, dan vind je de bron altijd terug. Wil je leesbaardere namen, hernoem dan later in je notitie-app.
  • Een ZIP met Markdown-bestanden is de makkelijkste overdracht aan iemand anders; een map is beter als de uitvoer naar een volgend script gaat.

Kwaliteitscontrole: gescande en lege uitvoer vinden

Wie meerdere PDF's in één run naar Markdown converteert, mist makkelijk problemen die een los bestand meteen zou laten zien. Elke tool in onze test leverde minstens één leeg of bijna leeg bestand op, en geen enkele kan een onleesbare pagina zonder OCR in tekst omzetten. Zoek dus na elke grote run naar bestanden die te kort zijn uitgevallen:

# Markdown files under 100 bytes are usually scans or image-only pages
find markdown -name '*.md' -size -100c
Uitvoeren in de uitvoermap (of de uitgepakte ZIP).
Schermafbeelding: resultatenlijst van de batch met een waarschuwing bij een bestand dat alleen een afbeelding bevat, gescand lijkt en geen tekstlaag heeft
Schermafbeelding: het bestand dat alleen een afbeelding is, staat gemarkeerd in de lijst; de Markdown meldt dat er geen uitleesbare tekst is.

Open daarna een paar willekeurige uitvoerbestanden en vergelijk ze met de PDF's: de koppen, een tabel, de laatste alinea. Gaan de bestanden naar een chatmodel, dan legt ons artikel over het beste documentformaat voor ChatGPT uit waarom deze controle loont voor nette Markdown.

Onze tijden met 20 bestanden

Dezelfde 20 PDF's (40 pagina's) via drie routes, volgens onze tests (19 okt. 2026, alleen CPU)
MethodeTijdUitvoerLege uitvoerDubbele namen
Onze batchpagina (browser)0,8 s20scanned-sample.mdGenummerd (notes, notes-2)
Python-lus, pymupdf4llm 1.28.25,3 s20rotated.md, scanned-sample.mdBehouden in submappen
Mapcommando van marker 2.0.05 min 51 s20scanned-sample.mdAlleen platte map (door ons hernoemd)
De browsertijd loopt van bestanden kiezen tot kant-en-klare ZIP. De tijden voor Python en marker bevatten het opstarten; bij marker ook het laden van de modellen. Eén machine en een kleine set, dus lees ze als ordegroottes.

Voor de meeste mensen is de conclusie eenvoudig: om meerdere PDF's in één keer naar Markdown te converteren, begin je in de browser, schrijf je een script als de klus terugkomt en bewaar je de modelgebaseerde tool voor de pagina's die de andere niet kunnen lezen.

Bronnen

  1. PyMuPDF4LLM (README and licence) — Artifex, GitHub
  2. marker (README, licence and model licence) — Datalab, GitHub
  3. pathlib: Path.rglob — Python documentation
  4. find(1) — GNU findutils manual

Veelgestelde vragen

Hoe converteer ik meerdere PDF's tegelijk naar Markdown?

Selecteer alle bestanden op een batchpagina zoals de onze en download de ZIP, of laat een korte Python-lus over de map lopen. Controleer daarna of er geen lege uitvoer tussen zit.

Is er een limiet aan het aantal bestanden op de batchpagina?

Er is geen vast aantal; de grens is het geheugen van je browser. In onze tests duurden 20 bestanden met 40 pagina's ongeveer een seconde. Werk voor honderden grote bestanden in rondes of gebruik een script.

Wat gebeurt er met bestanden met dezelfde naam?

Onze batchpagina nummert de tweede (notes.md, notes-2.md). In een script kies je zelf: submappen behouden, een achtervoegsel toevoegen of overslaan.

Kan ik gescande PDF's in batch converteren?

Niet met een tool die de tekstlaag leest: scans blijven leeg en onze tool markeert ze. Je hebt een OCR-stap nodig. marker is daarvoor bedoeld, maar gaf in onze run zonder GPU een leeg resultaat voor onze gescande pagina; test dus eerst een steekproef voor een grote klus.

Kan ik PDF naar MD volgens een schema in batch converteren?

Ja, met een script. Zet de Python-lus in een cronjob of geplande taak en voeg logica zoals --skip_existing toe, zodat alleen nieuwe bestanden worden geconverteerd.

Uploadt de batchpagina mijn bestanden?

Nee. De conversie gebeurt in het browsertabblad en de ZIP wordt op je apparaat gemaakt.