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

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

Kreuzberg 4.10.4 and Docling 2.148.0 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 28.8%
Faster on this setKreuzberg9.1 s vs 1,564.0 s total (172× faster)
Both read136only Kreuzberg: 0 · only Docling: 54

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

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

By kind of page: checks passed

PagesKreuzbergDocling
headers & footers 40 pages61.5%89.0%
multi-column 40 pages56.6%73.7%
old scans 40 pages0.0%20.9%
tables 40 pages0.5%68.8%
tiny text 30 pages43.4%79.2%

Files only Kreuzberg reads (0)

None.

Files only Docling reads (54)

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

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

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