- Left column line 1.
- Left column line 2.
- Left column line 3.
- Left column line 4.
- Left column line 5.
- Left column line 6.
SCORED6 parsers · 6 fixtures · 2026-09-16
2 of 6 parsers keep a table.
The other 4 hand you a row of loose numbers. Every parser’s README claims it handles tables — these are scored runs on controlled PDFs, with the raw output published beside every number.
- 4/6
- interleave two columns
- 0/6
- read a scanned page
- 18×
- longer for 5% more table structure
75.6% on multi-column.pdf
no text layer, no OCR
LiteParse 54.0s vs pdf-inspector 2.9s on 100 real pages
A zero is not always a failure. unpdf and pdf-parse emit plain text by design, so they score 0 on headings and tables while keeping every word. Read the profile, not one number. How each axis is scored
Twenty seconds, if you would rather watch it
The same numbers published on this site, in the order they were found: which parsers keep a table, what the fastest and slowest cost on a hundred pages, and where a score is deliberately left blank.
Two columns, read two different ways
multi-column.pdf holds twenty numbered lines in each column. A parser that reads down each column in turn recovers the document. A parser that reads across the page zips the two columns together — the words all survive, but the sentences no longer follow each other.
- Left column line 1.
- Right column line 1.
- Left column line 2.
- Right column line 2.
- Left column line 3.
- Right column line 3.
Scored over all 780 pairs of the forty expected lines, not just neighbouring ones — which is why interleaving costs 24.4 points, not 3.
A scan with no text layer defeats all six.
scanned.pdf carries the same table as the fixture above, but only as pixels: no font, no text-drawing operator. Without OCR there is nothing to extract, and this is the result published unchanged.
5 of 6 return an empty document. The one that tries returns characters that are not in the source.
Read the full result set# FIMAMCTIAL · REGION 2 03
- pdf-inspectornothing returned
- @opendocsg/pdf2mdEMPTY_OUTPUT
- OpenDataLoader PDFnothing returned
- unpdfnothing returned
- pdf-parsenothing returned
Run it on your own PDF
The fixtures above are deliberately small and controlled. Your documents are the ones that matter — the invoice with merged cells, the scan with no text layer, the 100-page report. Drop one in, pick 2–5 parsers, and read the Markdown side by side.
Before you upload
- The PDF you upload is scheduled for deletion after 24 hours.
- The converted Markdown is kept indefinitely so the run link keeps working — which means the document’s text is retained after the PDF itself is gone.
- Runs are private to your account: only you can open the run link, ask questions about it, or read its answers. Signing in is required, and the link does nothing for anyone else.
Drop a PDF here, or .
PDF · up to 100 pages · 25 MB
Every number above opens into its raw output
Nothing here is a claim you have to take on trust. The fixtures, the SHA-256 hashes, the package versions and the exact Markdown each parser returned are all published.
Captured 2026-09-16 · darwin/arm64 · Node v22.21.1 · median of up to three sequential local samples
What each parser can actually do
Read straight off each adapter’s declared capabilities, with the licence verified against the package it ships. A parser with no OCR engine cannot read a scan — parsebench says so before you wait for the run, not after.
| Parser | OCR | Page markers | Licence | Cost | Demo time |
|---|---|---|---|---|---|
| pdf-inspectorpdf-inspector | no OCR | yes | MIT | free | 13ms |
| LiteParseliteparse | built-in OCR | yes | Apache-2.0 | free | 304ms |
| OpenDataLoader PDFopendataloader | built-in OCR | yes | Apache-2.0 | free | 405ms |
| @opendocsg/pdf2mdpdf2md | no OCR | no | MIT | free | — |
| unpdfunpdf | no OCR | yes | MIT | free | — |
| pdf-parsepdf-parse | no OCR | yes | MIT | free | — |
| Hyperbotshyperbots | built-in OCR | yes | LicenseRef-Proprietary | $0.04/page | — |
Demo time is one run of one small table on one machine. It sets the order of magnitude, nothing more — the run you start above is measured on your own document.