With the table model, PDFluent scores higher than Docling and pymupdf4llm on table structure (TEDS) on FinTabNet and PubTables-1M.
In its default fast mode it extracts a page in milliseconds and peaks at 17 MB of memory.
pdfluent models install. It runs in Rust, Python, Node and the CLI. The table-structure results are this mode.Structured extraction (Markdown, blocks, Docling JSON) is a Preview in 1.1.0: output quality is still improving and the API may change in a minor release. Plain text extraction is not a Preview.
Higher than pymupdf4llm 1.28.2 on all 4 table measures, and higher than Docling 2.126.0 on 2 of 5, with 2 level. Each value is our score minus the other tool's, followed by a 95% interval from a paired bootstrap over documents.
Balanced tier (quality=balanced) with the table model: opt-in, Preview in SDK 1.1, for Python, Node, Rust and the CLI. Measured 14-10-2026; the fully-correct-tables row 08-10-2026 on an earlier build. Pages come from the tuning (development) split of each dataset, so our side is an upper bound, not a held-out result. Paired bootstrap per document, 95% intervals; level means the interval includes zero. The table model (Microsoft TATR v1.1) was trained on PubTables-1M and FinTabNet.c; overlap with these pages has not been checked. Docling 2.126.0, pymupdf4llm 1.28.2. Reproducible with pdfluent-bench (coming).
Lower than each of the six. The range runs from the lightest to the heaviest of them.
Lower than each of the six. Models for the balanced tier are a separate, opt-in download.
LiteParse 2.14.7 started in 115 ms, Docling 2.126.0 in 58 s; the other four fall in between.
About 200× faster than Docling 2.126.0, single-thread. pymupdf4llm 1.28.2 took 222 ms per page.
Speed is milliseconds per page for one batch: total process time divided by the number of pages, the same way the other tools are timed. Our numbers were measured on 2026-09-27. The other tools were measured on 2026-09-25 and 2026-09-26 on the same machine class.
On PubTables-1M our figures were 23.9 (one thread) and 4.3 (eight threads) ms per page. The batch produced the same Markdown as running one process per page, on every page.
Unstructured (hi_res) and MinerU run OCR inside their pipelines, and that time is part of their figures. Docling ran with OCR off. PDFluent fast and pymupdf4llm read the text layer only.
The install size is for fast mode. Balanced mode needs the separate models package: the layout model is 306,654,422 bytes and the table model 118,206,817 bytes, plus ONNX Runtime for your platform. A default install has no models; pdfluent models install fetches them and checks every file against pinned hashes.
On every axis in the third column, the lower end of the interval is zero or higher: the data rules out Docling being ahead. The last column lists the axes these runs do not support a claim on.
| Format | Sample | At least as good as Docling on | No claim on |
|---|---|---|---|
| DOCX | 93 files, 23 websites | text, words, headings, heading levels, list levels, tables, table structure (TEDS), coverage | none |
| PPTX | 68 files, 20 websites | text, words, headings, heading levels, lists, reading order | tables, table structure (TEDS) |
| XLSX | 93 files, 25 websites | sheet headings, tables, table structure (TEDS) | words |
| HTML | 50 pages, 26 websites | lists, tables | text, coverage |
Median, with the 95th percentile in brackets.
| Operation | 40 government documents | 480 test-suite files |
|---|---|---|
| Open | 1.7 ms (p95 30.8 ms) | 0.26 ms (p95 1.95 ms) |
| Extract text | 70.8 ms (p95 635.2 ms) | 0.232 ms (p95 16.331 ms) |
| Save | 0.4 ms (p95 7.2 ms) | 0.048 ms (p95 0.537 ms) |
197 documents, five words per document spread through the file (977 words). After replacing, we read the file back with pdftotext, which is not our code. Measured on 2026-08-24.
After the 1.1.0 release we will publish the benchmark harness as a public repository, pdfluent-bench. It will hold the scripts, the page lists and the scoring code behind the results on this page, so you can run them on your own machine and check our numbers.
This page grows as runs finish. A new result lands here with its mode, dataset, split, machine and date.