← PDF → Markdown (quality): all libraries · Reader board

Docling vs pymupdf4llm: which one passes more of the page checks?

Docling 2.148.0 and pymupdf4llm 2.1 on the same 190 PDF pages with checks written by AI2's olmOCR-bench: multi-column articles, tiny print, old scans, tables, pages with headers and footers from olmOCR-bench (AI2), 190 pages. Measured, not opinion; re-tested by itself on every new PyPI release. Updated 06 November 2026.

More checks passedDocling64.1% vs 38.6%
Faster on this setpymupdf4llm116.5 s vs 1,564.0 s total (13× faster)
Both read135only Docling: 55 · only pymupdf4llm: 0

Docling passed more page checks: 64.1% vs 38.6%. Docling broke (error, hang or crash) on 0 files that pymupdf4llm read; pymupdf4llm broke on 0 files that Docling read.

LibraryText from🔴 Fails where
the other reads
🟡 Empty where
the other reads
⏱ Hangs or
crashes
✅ Checks
passed
Median
ms/file
Total
seconds
Docling 2.148.019000064.1%56971,564.0
pymupdf4llm 2.1135055038.6%407116.5

By kind of page: checks passed

PagesDoclingpymupdf4llm
headers & footers 40 pages89.0%40.4%
multi-column 40 pages73.7%61.2%
old scans 40 pages20.9%0.0%
tables 40 pages68.8%64.1%
tiny text 30 pages79.2%34.5%

Files only Docling reads (55)

pdfs/long_tiny_text/10c_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/14a_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/14b_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/14d_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/15b_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/15d_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/16a_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/17_pg17_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/17_pg34_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/17_pg4_pg1.pdfpymupdf4llm: no text
pdfs/long_tiny_text/17_pg86_pg1.pdfpymupdf4llm: no text
pdfs/multi_column/02a3e23da54b82c414d272051b0b5d8f44d8_page_17_pg1.pdfpymupdf4llm: no text
pdfs/multi_column/0cf93d937e0f519965d4ff67daec8dd5dea1_page_5_pg1.pdfpymupdf4llm: no text
pdfs/multi_column/0d7f2cbc54e1b8e58b42a867c3f7620bcd29_page_8_pg1.pdfpymupdf4llm: no text
pdfs/old_scans/12.pdfpymupdf4llm: no text
pdfs/old_scans/14.pdfpymupdf4llm: no text
pdfs/old_scans/18.pdfpymupdf4llm: no text
pdfs/old_scans/20.pdfpymupdf4llm: no text
pdfs/old_scans/25.pdfpymupdf4llm: no text
pdfs/old_scans/26.pdfpymupdf4llm: no text
pdfs/old_scans/33.pdfpymupdf4llm: no text
pdfs/old_scans/34.pdfpymupdf4llm: no text
pdfs/old_scans/39.pdfpymupdf4llm: no text
pdfs/old_scans/4.pdfpymupdf4llm: no text
pdfs/old_scans/41.pdfpymupdf4llm: no text
pdfs/old_scans/42.pdfpymupdf4llm: no text
pdfs/old_scans/44.pdfpymupdf4llm: no text
pdfs/old_scans/45.pdfpymupdf4llm: no text
pdfs/old_scans/46.pdfpymupdf4llm: no text
pdfs/old_scans/48.pdfpymupdf4llm: no text
pdfs/old_scans/50.pdfpymupdf4llm: no text
pdfs/old_scans/54.pdfpymupdf4llm: no text
pdfs/old_scans/56.pdfpymupdf4llm: no text
pdfs/old_scans/58.pdfpymupdf4llm: no text
pdfs/old_scans/6.pdfpymupdf4llm: no text
pdfs/old_scans/60.pdfpymupdf4llm: no text
pdfs/old_scans/62.pdfpymupdf4llm: no text
pdfs/old_scans/64.pdfpymupdf4llm: no text
pdfs/old_scans/65.pdfpymupdf4llm: no text
pdfs/old_scans/67.pdfpymupdf4llm: no text

…and 15 more: see each library's page.

Files only pymupdf4llm reads (0)

None.

What this does not tell you

This compares not breaking: whether each library gets any text out of each file. It does not rank text quality (reading order, tables, headings), and speed is one GitHub-hosted runner, default settings, no OCR switched on. If you need structure for RAG, also look at the output on your own files.

How this is measured