What the numbers mean

This is a small, inspectable benchmark. It does not establish a universal best PDF parser.

The scoring pipeline

Scoring pipeline: PDF to parser to Markdown to normalise to compare to expected to percentPDFsource fileParserone of sixMarkdownraw outputNormalisecase, whitespace, boldCompareagainst reference
Every score on this page follows the same five steps: a parser turns a PDF into Markdown, the output is normalised for case, whitespace and bold markers, then compared to a hand-written reference to produce a percent.

What each fixture breaks

FixtureTableReading orderHeadingOCR routing
text-layer.pdf··✓✓
tables.pdf✓·✓✓
ragged-table.pdf✓·✓✓
multi-column.pdf·✓✓✓
scanned.pdf✓·✓✓
interleaved-columns.pdf✓·✓✓
nse-market-pulse.pdf···✓
A checkmark means that axis was scored on that fixture. Every synthetic fixture is scored on heading structure and OCR routing; table and reading-order scores only appear where that fixture is built to stress them. The real report carries no accuracy score at all — only OCR routing and speed are measured on it.

6 single-page PDFs, each built to break one thing, plus one real report. Every parser runs three times on the synthetic fixtures and we report the median; a failure stays visible rather than being retried away. Source files and their SHA-256 hashes are published with the results, so you can check the file you download is the file we measured.

How each axis is scored

Column-major (correct)
LLLLRRRR
Interleaved (bug)
LRLRLRLR
Scoring only neighbouring lines would count just 1 broken boundary in the interleaved strip above, scoring it 97.4%. Checking every pair of lines instead — the method this site uses — counts every left/right line that landed on the wrong side of a line it should follow, scoring the same output 75.6%, which matches what the raw Markdown shows: the two columns zipped together.
Reading-order scoring: adjacent-pair vs all-pairs
Scoring methodScore on interleaved output
Adjacent pairs only97.4%
All pairs (used here)75.6%

The two fixtures that score nothing

is the tables fixture flattened into an image with no text underneath, like a photocopy. Reading it needs optical character recognition — software that reads letters out of pixels. None of the six free parsers recover the table, and most return nothing.

nse-market-pulse.pdf is a real document: the first 100 of 330 pages of Market Pulse, September 2026 (Volume 8, Issue 9), from NSE India’s Economic Policy and Research department, used here under their copyright. Hand-writing a reference for 100 pages would mean guessing, so it records only elapsed time, output length and OCR routing — each parser running once, the slowest taking about 54 seconds. Original at nseindia.com.

Both leave those axes empty, not zero. A parser never tested on an axis has not failed it.

What this does not measure

No handwriting, encrypted PDFs, photographed pages or non-English text. The scanned fixture is a clean synthetic image — the easiest scan there is — so it proves the OCR axis exists without measuring OCR quality. Hosted Hyperbots OCR is excluded from this free benchmark.

The live Q&A uses one chunker, one embedding model and the same prompt across parsers, so only the parsed text differs. The answer model can still vary at temperature zero, so a disagreement is a reason to read the evidence, not proof either answer is wrong. Costs use configured rates; storage, egress and failed requests can add charges beyond what is shown.

Run it yourself

npm run benchmark refreshes every result, file hash and downloadable fixture — no credentials needed. The generator and reference answers are versioned with the project.

Inspect the published results