← PDF → Markdown (quality): all libraries · Reader board
Docling vs Marker: which one passes more of the page checks?
Docling 2.148.0 and Marker 2.1.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.
Docling passed more page checks: 64.1% vs 36.6%. Docling broke (error, hang or crash) on 0 files that Marker read; Marker broke on 93 files that Docling read.
| Library | Text from | 🔴 Fails where the other reads | 🟡 Empty where the other reads | ⏱ Hangs or crashes | ✅ Checks passed | Median ms/file | Total seconds |
|---|---|---|---|---|---|---|---|
| Docling 2.148.0 | 190 | 0 | 0 | 0 | 64.1% | 5697 | 1,564.0 |
| Marker 2.1.0 | 97 | 93 | 0 | 0 | 36.6% | 636 | 228.9 |
By kind of page: checks passed
| Pages | Docling | Marker |
|---|---|---|
| headers & footers 40 pages | 89.0% | 72.5% |
| multi-column 40 pages | 73.7% | 47.4% |
| old scans 40 pages | 20.9% | 0.0% |
| tables 40 pages | 68.8% | 32.8% |
| tiny text 30 pages | 79.2% | 46.9% |
Files only Docling reads (93)
| pdfs/headers_footers/0722235b45282fd9c4b9d92efc9dbf6e9704d798_page_2_processed.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/headers_footers/077c9c1f4595af86a2efb0f5b4209350fea8a9b6_page_2_processed.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/headers_footers/14cd43ae9b6ad4d5a839bf1c7c1a7cf84046657b_page_7.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/headers_footers/34530cb517fd67278fde916e2f082d174698e97c_page_25.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/headers_footers/7f1e2bb730f139f2f56c09f6e2fbdbafba2ac454_page_1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/headers_footers/911b693208d793ae2d4acb6669bf7e7954636678_page_64.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/headers_footers/a09e03201840ca874de0bb5da518259659196e1c_page_6.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/headers_footers/b1bcaf906a9826646b1e8ae04c885a0dc6c8adc8_page_13.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/headers_footers/f9440f15438ba36671183460e36dd9decbbb80dc_page_3.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/10c_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/11_pg186_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/11_pg36_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/14a_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/14b_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/14d_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/15b_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/15d_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/16a_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/17_pg17_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/17_pg34_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/17_pg4_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/long_tiny_text/17_pg86_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/01119fb525785eb7153ee600241ff1e01959_page_2_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/02a3e23da54b82c414d272051b0b5d8f44d8_page_17_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/02e31046996b59b4997b8413f09ae163ade5_page_10_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/031262e6346a8b7db19239800839b132c1ce_page_13_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/0621a0090414e4681e90a4e1ea543acca910_page_20_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/0621a0090414e4681e90a4e1ea543acca910_page_4_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/068682d533c39f817bd7855be4760d9a56ef_page_3_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/0b045ab838c05c4ff1ac844caf826f8f368d_page_20_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/0b045ab838c05c4ff1ac844caf826f8f368d_page_26_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/0b045ab838c05c4ff1ac844caf826f8f368d_page_32_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/0cf93d937e0f519965d4ff67daec8dd5dea1_page_5_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/multi_column/0d7f2cbc54e1b8e58b42a867c3f7620bcd29_page_8_pg1.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/old_scans/12.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/old_scans/14.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/old_scans/18.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/old_scans/20.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/old_scans/25.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
| pdfs/old_scans/26.pdf | Marker: SpawnError: llama-server binary not found. Install with: macOS: brew install llama.cpp Linux: brew install llama.cpp OR download from https://g |
…and 53 more: see each library's page.
Files only Marker 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
- Each library runs a short recipe from its own docs (board/targets.py):
open the file, get all text. Installed with the extras the docs recommend for reading
(
pypdf[full]: AES decryption, Brotli), nothing else. One worker process per CPU; per file 60 s / 120 s / 180 s / 300 s / 600 s at most (the any-document table allows longer: some tools load models), killed above the memory limit. - Fails where another reads: the library raised an error, hung or crashed on a file from which another library in the same table got text. Files that every library fails on (encrypted, truncated, fuzzed) are not counted against anyone.
- Empty where another reads: no error, but no text. This is often the recipe, not the library: for example
python-docx's paragraphs+tables recipe skips headers, text boxes and nested tables. Check the file list. - Any document → text: a file type the tool's docs don't list, or that the tool itself rejects as unsupported, counts as "not supported", not as a failure (lists in board/libs.json). Returning a file's raw RTF source counts as empty, for every tool. Each tool runs with default settings: no OCR switched on by hand.
- OCR: each image comes with the human-written ground-truth text published with its dataset. Words found is the share of its words that appear anywhere in the engine's output (reading order doesn't matter); an image that fails or comes back empty counts as 0. The ground truth of receipts and document pages covers only their annotated text, so a character error rate would punish engines for reading more than was annotated; it is in the raw results but not ranked. English models, CPU, default settings.
- Speech: each clip comes with its dataset's reference transcript. Both texts go through Whisper's English text normalizer (case, punctuation, "twenty" = "20"); word error rate is all substituted, missing and extra words over all reference words, the usual corpus-level WER. A clip that fails or comes back empty counts all its words as errors. The three Whisper implementations use the same base.en model; each other engine its documented default model. English, CPU, default decoding settings.
- Language detection: each text's language is known from Tatoeba. An answer counts as correct if the library's code matches after mapping variants to ISO 639-1 (zh-cn → zh, nb → no, iw → he). Close languages count as different: Croatian detected as Bosnian or Serbian, or Norwegian as Danish, is wrong. One call per text with default settings and all languages enabled.
- PDF → Markdown: pages from AI2's olmOCR-bench (ODC-BY), scored with its own checks (vendored, Apache-2.0): a sentence must be present, a page header or footer absent, two passages in the right order, a table cell next to the right neighbour. Checks passed is all passed checks over all checks; a page that fails or comes back empty passes none. Math pages are left out (their checks need a browser to render formulas). Default settings: whatever OCR a tool does on its own, it does.
- Text quality (order, tables, layout) is not ranked in the other tables; they are about not breaking. The raw results have every output's size and hash.
- Same files for every version: the test collections are pinned to one commit. GitHub-hosted runner, so times are comparable within one table, roughly.