markitdown vs pdf-inspector - PDF to Markdown Compared
markitdown and pdf-inspector are two of the most frequently compared open-source "PDF to Markdown" tools — one from Microsoft, one from Firecrawl. Both free, both promising clean text for LLMs. But run them on a batch of real PDFs and the gap is an order of magnitude.
This article is a factual breakdown based on the official opendataloader-bench (200 real PDFs, five engines, OCR off everywhere). Data first, conclusions second.
The key metrics at a glance
| Metric | pdf-inspector | markitdown | Notes |
|---|---|---|---|
| Maintainer | Firecrawl (open-source Rust) | Microsoft (open-source Python) | Different ecosystems |
| Core positioning | Classify-first parsing engine | Universal format converter | One specialized, one broad |
| Type detection | 10–50ms verdict + confidence + per-page signals | None | The key lever on OCR costs |
| Overall score (0–1) | 0.875 | 0.589 | #1 of five engines |
| Reading order | 0.915 | 0.844 | Multi-column quality |
| Tables (TEDS) | 0.814 | 0.273 | The largest single gap |
| Headings | 0.788 | 0.000 | markitdown barely recovers headings |
| Corpus time (200 docs) | 0.470s | 16.165s | 34×+ faster |
| Bindings | Rust / Node / Python / WASM / CLI | Python (CLI & .NET ports exist) | pdf-inspector ships five ways |
| Runs in the browser | WASM, no cross-origin isolation needed | Requires Python runtime | pdf-inspector works pure-frontend |
| OCR strategy | Selective — only pages that need it | Via plugins | Different philosophies |
Source: the pdf-inspector repo benchmark (opendataloader-bench corpus, 200 real PDFs, refreshed July 2026).
The short version
- PDF is your main input, output feeds LLMs, tables and multi-column matter → pick pdf-inspector. Most accurate overall, tables by a landslide, 30× faster — plus classify-first routing so you only pay OCR when a document actually needs it.
- You're in a Python project with wildly mixed inputs (URLs, PPTX, XLSX, audio) and want the plugin ecosystem → markitdown still works, but its PDF numbers (tables 0.273, headings 0.000) mean you'll probably need a dedicated PDF parser as backup anyway.
Two different tools
What markitdown is
Microsoft's open-source converter (github.com/microsoft/markitdown) — a Python library + CLI that turns many formats into Markdown for LLM consumption. Strengths:
- Mature ecosystem: high community energy since its 2024 launch, familiar to Python developers, rich third-party integrations
- Broad format reach: beyond Office files it covers images, audio transcription, EPUB, ZIP, and more
- Extensible: plugin system supports custom behaviors like LLM image descriptions
Its weaknesses on PDFs (per the benchmark):
- Overall score 0.589 — last among the five engines
- Headings 0.000: essentially no heading-level recovery, so the Markdown comes out structurally flat
- Tables TEDS 0.273: table structure is mostly guesswork
- 16.165s for the corpus — over 34× slower than pdf-inspector
- Hard dependency on Python; can't run in the browser
What pdf-inspector is
Firecrawl's engine (github.com/firecrawl/pdf-inspector) — a Rust parser with five bindings, and the underlying engine of Firecrawl's hybrid OCR pipeline. Strengths:
- Classify first, extract second: TextBased / Scanned / ImageBased / Mixed in 10–50ms with confidence and per-page OCR needs, keeping costs predictable
- Quality first: overall 0.875, reading order 0.915, table TEDS 0.814 — all #1
- Millisecond-fast: native-text PDFs finish end-to-end locally within 200ms; the whole corpus runs in 0.470s
- Layout-aware: multi-column reconstruction, CID/Type0 fonts decoded via ToUnicode CMaps (CJK-friendly)
- Flexible deployment: npm / PyPI / crates.io / browser WASM; the WASM build never uploads a byte
Its boundaries:
- PDF only — Word, Excel, and friends are out of scope
- No OCR in the default build; scanned documents need the native selective-OCR mode or an external service
Scenario-based recommendation
| Your scenario | Pick | Why |
|---|---|---|
| Bulk PDF ingestion for RAG / fine-tuning | pdf-inspector | Speed + tables + structure win directly improves corpus quality |
| Mixed inputs (Office/web/audio all present) | markitdown + fallback | Use markitdown as glue; route heavy PDF work to a dedicated engine |
| High-concurrency server-side parsing | pdf-inspector | Async APIs run on the libuv thread pool without blocking the loop |
| Pure frontend, files must stay local | pdf-inspector | WASM build needs no COOP/COEP headers |
| Controlling OCR spend | pdf-inspector | Per-page routing signals + selective OCR; ~54% of PDFs skip OCR entirely |
Transparent data
Every number above comes from the benchmark published in the pdf-inspector repo (OCR disabled, local engines compared), with public methodology and artifacts. A representative benchmark still isn't the whole universe — test on your own documents before committing.
Further reading
- Benchmark: full data and methodology
- Install: five installation channels
- Quick start: from first command to every binding