A Dark Vector Cognition product
Benchmark

PDF to Markdown benchmark: pdfmd vs Marker vs Docling vs PyMuPDF

What 1,000 pages cost across the market, and what the money buys. Prices are each vendor's published rate, checked October 2, 2026. Quality and speed come from six public domain PDFs run through each engine on one machine and scored by a script, shown as percentages. The reference tables were checked cell by cell by an AI model, not yet by a person.

Value for money

The hosted services whose engines this benchmark measured, against pdfmd. Value for money is quality per dollar as a share of pdfmd's, where quality is the mean of table cells found and headings kept.

ServicePer 1,000 pagesTable cells foundHeadings keptSpeed vs pdfmdValue for money vs pdfmd
pdfmd.dev$0.8995%98%100%100%
Datalab (hosted Marker), fast or balanced$4.0057%94%6%17%
IBM (hosted Docling), pay as you go$4.0086%99%3%21%

Quality and speed are measured on each engine's open-source release at its default settings; a hosted service may run a newer model or different settings. Speed is pages per second as a share of pdfmd's on the same machine. The other services in the market table were not run, so they have a price and no score.

The market, per 1,000 pages

ServiceModeOutputPriceAt volumepdfmd costs
pdfmd.devStarter planMarkdown$0.89$0.75 Pro plann/a
MathpixFiles API (batch)Markdown$1.50$1.00 over 30M pages a month41% less
MistralOCR 4.1, Batch APIMarkdown$2.00none published55% less
LlamaParseCost-effectiveMarkdown$3.75none published76% less
AWS TextractLayoutJSON$4.00$3.00 over 1M pages a month78% less
Datalab (hosted Marker)Fast or balancedMarkdown$4.00$3.00 if you let them retain data78% less
IBM (hosted Docling)Pay as you goMarkdown$4.00none published78% less
MistralOCR 4.1Markdown$4.00none published78% less
Mathpixv3/pdfMarkdown$5.00$3.50 over 1M pages a month82% less
Azure Document IntelligenceLayoutMarkdown$10.00$8.00 500K pages a month commitment91% less
Datalab (hosted Marker)AccurateMarkdown$10.00$7.50 if you let them retain data91% less
Google Document AILayout ParserLayout blocks$10.00$8.00 3-year savings plan91% less
Reductor-1 ParseMarkdown$10.00$8.00 batch queue, 12-hour completion91% less
UpstageDocument Parse, StandardMarkdown or HTML$10.00none published91% less
LlamaParseAgenticMarkdown$12.50none published93% less
AWS TextractTables and LayoutJSON$15.00$10.00 over 1M pages a month94% less
UnstructuredAll strategiesJSON elements$15.00none published94% less

Published pay-as-you-go prices in US dollars per 1,000 pages, read from each vendor's own pricing page or docs. US regions. A volume price needs the stated monthly volume, commitment or option. pdfmd is priced by monthly plan, so its rate per 1,000 pages assumes the plan's pages are used; the Starter rate is a launch price for a limited time. Left out: Text-only OCR (Azure Read, Google Enterprise Document OCR, AWS Textract DetectDocumentText, Upstage Document OCR) and LlamaParse Fast: they return text without tables or headings, so they are not comparable. LandingAI ADE: the price depends on how many characters come out, so there is no per-page price to compare. Adobe PDF Extract: no paid price is published.

Where pdfmd loses

Quality, every engine

EngineOrdered table-cell recallWhole-text ordered recallHeadings keptSpeed vs pdfmd
pdfmd.dev (pymupdf4llm)95.2% (138/145)97.9%98.1% (101/103)100%
Marker57.2% (83/145)84.8%94.2% (97/103)6%
Docling86.2% (125/145)99.3%99.0% (102/103)3%
Plain PyMuPDF text0.0% (0/145)100.0%0.0% (0/103)3,076%

Plain PyMuPDF writes text, not Markdown, so it has no tables or headings by construction: it is here as the floor, and its whole-text recall shows the text itself survives. Neither recall measure checks that a value sits in the right column; see Method.

Tables

TableCellspdfmd.dev (pymupdf4llm)MarkerDoclingPlain PyMuPDF text
Salient Statistics, United States (lithium)
page 1. Five year columns, withheld values written as W, a two line row label, and a > prefix on percentages.
4895.8% (46)100.0% (48)91.7% (44)0.0% (0)
Table 5: Page-level latencies for document indexing
page 19. A spanning header over three columns and a bold, rule-separated header block in a LaTeX paper.
2592.0% (23)68.0% (17)80.0% (20)0.0% (0)
Table A-15. Alternative measures of labor underutilization
page 27. Two level column header, nine data columns, and row labels wrapped over up to six lines with dot leaders.
7295.8% (69)25.0% (18)84.7% (61)0.0% (0)

Headings

Scored on the three documents whose PDF outline lists real section headings: SEC Form 10-K, general instructions and form; ColPali: Efficient Document Retrieval with Vision Language Models (arXiv 2407.01449v6); NIST AI 100-1, Artificial Intelligence Risk Management Framework (AI RMF 1.0).

Enginesec-form-10kcolpalinist-ai-rmfWords run togetherMissed, first few
pdfmd.dev (pymupdf4llm)39/4132/3230/300Item 1B. Unresolved Staff Comments.; Item 7. Management’s Discussion and Analysis of Financial Condition and Results of Operations.
Marker36/4132/3229/300C. Preparation of Report; D. Signature and Filing of Report; E. Disclosure With Respect to Foreign Subsidiaries
Docling40/4132/3230/3014Part I
Plain PyMuPDF text0/410/320/300Form 10-K, ANNUAL Report Pursuant to Section 13 or 15(d) of the Securities Exchange Act of 1934; General Instructions; A. Rule as to Use of Form 10-K

Method

Ground truth

Each table was transcribed from a 130 dpi render of its page (PyMuPDF get_pixmap) by reading the image, then cross-checked cell by cell against the PDF's own text layer (page.get_text()). Every value agreed on both reads. Claude (AI assistant) in the SEO sprint 1 session, 2026-09-24. This is a machine visual check, not a human one. Human sign-off: pending.

Documents

Engines and settings

Machine

Apple M5 Pro, 18 cores, 48 GB memory, macOS 27.2 (26B5086k). Python 3.12.13. PyTorch engines had Apple Metal (MPS) available: true. The machine was not idle: other work was running during the timed runs, recorded below, so absolute times are slower than on a quiet machine. Every engine ran under the same conditions, one after another.

start 2026-09-24T22:48:01Z
17:48  up 2 days, 31 mins, 3 users, load averages: 3.65 4.44 5.45
 %CPU COMM
 81.8 opencode
 24.8 Claude Helper (Renderer)
 11.9 Claude Helper (Renderer)
 11.8 Claude Helper
  9.1 node
end 2026-09-24T23:20:39Z
18:20  up 2 days,  1:03, 3 users, load averages: 5.34 5.76 5.75
 %CPU COMM
 37.0 opencode
  8.8 node
  5.9 ghostty
  5.1 Claude Helper (Renderer)
  3.3 Claude Helper

Reproduce

git checkout 6124feb33906
  scripts/benchmark/setup.sh     # one venv per engine, pinned versions
  scripts/benchmark/run_all.sh   # fetch and verify PDFs, run engines one by one, score

Scored from commit 6124feb33906. Raw Markdown from every engine is committed under scripts/benchmark/outputs. See also the tables guide and the API docs.