PDF to Markdown benchmark: PDFluent on opendataloader-bench

In its default auto tier, PDFluent 1.3.0 scores 0.9168 overall on opendataloader-bench, above the 0.907 of opendataloader [hybrid], the highest of the 12 engines on the benchmark's public leaderboard.* The score was measured with the benchmark's own harness and evaluator on its 200 documents; PDFluent is not on that leaderboard yet.

pip install pdfluent==1.3.0
Last updated · PDFluent measured 29 Oct 2026 · leaderboard read 2 Nov 2026
opendataloader-bench · 200 documents · two PDFluent tiers

PDFluent 1.3.0 scores

Two rows, one per extraction tier, each scored on all 200 documents of the benchmark.

PDFluent 1.3.0 autoauto · default in 1.3.0
0.9168*

Overall score, default tier: layout and table models, OCR for pages without a text layer.

Reading order
0.9357
Table structure
0.8922
Heading hierarchy
0.8678
PDFluent 1.3.0 fastfast · no models
0.8577*

Overall score, fast tier: the engine alone, no models installed.

Reading order
0.9000
Table structure
0.6347
Heading hierarchy
0.8147
Harness
opendataloader-bench at commit 7af1d8f4d0c09f51ea1a5c6ba5f66e993286d109, its own evaluator
Documents
all 200
Machine
Google Cloud n2-standard-8, CPU only, Linux (scores do not depend on the machine)
Measured
PDFluent 29 Oct 2026; leaderboard README read 2 Nov 2026
Who measured
PDFluent rows: measured by us. The 12 other engines: the published figures from the benchmark's README, not re-run by us.

*Measured with the benchmark's own harness and evaluator. PDFluent is not on its public leaderboard yet. opendataloader-bench at commit 7af1d8f.

  • This benchmark was one of the targets our development optimised for.
  • The scores are measured on the benchmark's own 200 documents.
  • Our 19-measure result on our own held-out half and the separate checks are on the benchmarks page and in the 1.3.0 release post.
  • The PDFluent scores come from a release candidate wheel that reported version 1.2.0.
  • Speed is not compared here; it is measured separately on an Apple M4 after the release.
  • Competitor scores are the published figures from the benchmark's README, not re-run by us.
  • Both PDFluent rows keep page headers and footers (keep_furniture=True), because the benchmark's ground truth counts them as content.
Leaderboard · 12 engines from the README plus PDFluent

Full leaderboard: every engine, every score

The auto tier has the highest overall score in the table, +0.010 on opendataloader [hybrid]. The fast tier is in fifth place on overall against the same 12 engines.

Sorted by overall. Sorted by one measure: reading order · table structure · heading hierarchy

A64, A65 · opendataloader-bench @ 7af1d8f · 200 documents · PDFluent measured 29 Oct 2026 · leaderboard README read 2 Nov 2026 · PDFluent four decimals as submitted, others three as published. Licence as the README states it (A67); PDFluent: the SDK licence.
#EngineOverallReading orderTable structureHeading hierarchyLicence
1PDFluent 1.3.0 auto0.91680.93570.89220.8678AGPL-3.0-only or the PDFluent Commercial Licence, at your option
2opendataloader [hybrid]0.9070.9340.9280.821Apache-2.0
3nutrient0.8850.9250.7080.819Commercial
4docling0.8820.8980.8870.824MIT
5marker0.8610.8900.8080.796GPL-3.0
6PDFluent 1.3.0 fast0.85770.90000.63470.8147AGPL-3.0-only or the PDFluent Commercial Licence, at your option
7unstructured [hi_res]0.8410.9040.5880.749Apache-2.0
8edgeparse0.8370.8940.7170.706Apache-2.0
9opendataloader0.8310.9020.4890.739Apache-2.0
9mineru0.8310.8570.8730.743AGPL-3.0
11pymupdf4llm0.7320.8850.4010.412AGPL-3.0
12unstructured0.6860.8820.0000.388Apache-2.0
13markitdown0.5890.8440.2730.000MIT
14liteparse0.5760.8660.0000.000Apache-2.0
Per measure · 0 to 1 · higher is better

Where PDFluent stands on each measure

On opendataloader-bench, PDFluent in the auto tier is highest on 2 of the 3 measures (reading order and heading hierarchy) and second on table structure, against the 12 leaderboard engines.

Overall0 to 1 · higher is better
PDFluent 1.3.0 auto0.9168
opendataloader [hybrid]0.907
nutrient0.885
docling0.882
marker0.861
PDFluent 1.3.0 fast0.8577
unstructured [hi_res]0.841
edgeparse0.837
opendataloader0.831
mineru0.831
pymupdf4llm0.732
unstructured0.686
markitdown0.589
liteparse0.576

In the auto tier, PDFluent scores 0.9168 on overall, higher than all 12 leaderboard engines; the closest is opendataloader [hybrid] at 0.907.

In the fast tier, with no models, it scores 0.8577, in fifth place against the same engines.

Reading order (NID)0 to 1 · higher is better
PDFluent 1.3.0 auto0.9357
opendataloader [hybrid]0.934
nutrient0.925
unstructured [hi_res]0.904
opendataloader0.902
PDFluent 1.3.0 fast0.9000
docling0.898
edgeparse0.894
marker0.890
pymupdf4llm0.885
unstructured0.882
liteparse0.866
mineru0.857
markitdown0.844

In the auto tier, PDFluent scores 0.9357 on reading order, higher than all 12 leaderboard engines; the closest is opendataloader [hybrid] at 0.934.

In the fast tier, with no models, it scores 0.9000, in fifth place against the same engines.

Table structure (TEDS)0 to 1 · higher is better
opendataloader [hybrid]0.928
PDFluent 1.3.0 auto0.8922
docling0.887
mineru0.873
marker0.808
edgeparse0.717
nutrient0.708
PDFluent 1.3.0 fast0.6347
unstructured [hi_res]0.588
opendataloader0.489
pymupdf4llm0.401
markitdown0.273
unstructured0.000
liteparse0.000

In the auto tier, PDFluent scores 0.8922 on table structure, in second place against the 12 leaderboard engines, behind opendataloader [hybrid] (0.928).

In the fast tier, with no models, it scores 0.6347, in seventh place against the same engines.

Heading hierarchy (MHS)0 to 1 · higher is better
PDFluent 1.3.0 auto0.8678
docling0.824
opendataloader [hybrid]0.821
nutrient0.819
PDFluent 1.3.0 fast0.8147
marker0.796
unstructured [hi_res]0.749
mineru0.743
opendataloader0.739
edgeparse0.706
pymupdf4llm0.412
unstructured0.388
markitdown0.000
liteparse0.000

In the auto tier, PDFluent scores 0.8678 on heading hierarchy, higher than all 12 leaderboard engines; the closest is docling at 0.824.

In the fast tier, with no models, it scores 0.8147, in fourth place against the same engines.

A64, A65 · opendataloader-bench @ 7af1d8f · 200 documents · PDFluent measured 29 Oct 2026 · leaderboard README read 2 Nov 2026 · PDFluent four decimals as submitted, others three as published. Caveats.
opendataloader-bench

What do NID, TEDS and MHS measure?

NID scores reading order, TEDS scores table structure and MHS scores heading hierarchy, each from 0 to 1 against the benchmark's ground truth.

Overall

The benchmark's own overall score: the mean over the documents of each document's combined score, as its evaluator computes it.

One number for a first comparison. The three measures below tell you where it comes from.

Reading order (NID)

Normalized indel distance between the extracted text and the ground truth: how much of the text comes out, in the right order.

Reading order matters for RAG chunking: a chunk whose sentences come out of order retrieves and reads badly.

NID = 1 − distance / (len(gt) + len(pred))

Table structure (TEDS)

Tree edit distance similarity between each extracted table and the true one, counting rows, columns, spans and cell text.

Tables matter for invoices, financial statements and reports, where a row has to stay a row and a cell has to stay in its column.

TEDS = 1 − EditDist(T_gt, T_pred) / max(|T_gt|, |T_pred|, 1)

Heading hierarchy (MHS)

How closely the Markdown headings and their levels match the document's own outline.

Heading levels decide where a section-aware splitter can cut a document and which section title a chunk carries.

MHS = 1 − EditDist(H_gt, H_pred) / max(|H_gt|, |H_pred|, 1)

Formulas as the benchmark's README gives them (section 3, Metrics). Documents without a table or headings in the ground truth are left out of that measure's mean.

Choosing a PDF parser

Which PDF parser fits which job?

Pick the measure that matches your documents, then read that column of the leaderboard, not only the overall score.

JobWhat mattersPDFluent tierPDFluent on this benchmark
RAG pipelineReading order (NID) and heading hierarchy (MHS): chunks in order, cut at sectionsautoReading order: highest against the 12 leaderboard engines, at 0.9357. Headings: highest against the 12 leaderboard engines, at 0.8678.
Invoices, statements, reportsTable structure (TEDS)auto, with the table modelTable structure: second against the 12 leaderboard engines, at 0.8922.
Speed-sensitive batchTime per page on your hardwarefast, no modelsNot compared here. Speed is measured separately on an Apple M4 and will appear on the benchmarks page with its machine and date.
No model downloadsThe text layer only, nothing to install beyond the packagefastOverall: fifth against the 12 leaderboard engines, at 0.8577.
Commercial licence neededThe licence column of the leaderboardeither tierAGPL-3.0-only or the PDFluent Commercial Licence, at your option.

Places are computed from the rows in the leaderboard above. Licences of other engines as their README states them; check each project's own terms before you ship.

opendataloader-bench

How to reproduce the PDFluent score

Run the benchmark's own harness at the same commit, convert each PDF with the call below and score the output with its evaluator.

  1. Check out the harness at commit 7af1d8f4d0c09f51ea1a5c6ba5f66e993286d109 and install it as its README describes:
    shell
    git clone https://github.com/opendataloader-project/opendataloader-bench
    cd opendataloader-bench
    git checkout 7af1d8f4d0c09f51ea1a5c6ba5f66e993286d109
    git lfs install && git lfs pull
    uv sync
  2. Install PDFluent and its models once:
    shell
    pip install pdfluent==1.3.0
    pdfluent models install layout tables
  3. Convert every PDF. Auto row, recipe auto+kf: extract_markdown(path, quality="auto", keep_furniture=True). Fast row, recipe fast+kf: extract_markdown(path, quality="fast", keep_furniture=True).
  4. Write the Markdown where the harness keeps predictions (prediction/<engine>/markdown) and run its evaluator, for example uv run src/evaluator.py --engine <engine>.

Expected scores

RowOverallReading orderTable structureHeading hierarchy
auto+kf0.91680.93570.89220.8678
fast+kf0.85770.90000.63470.8147

Measured 29 Oct 2026 on Google Cloud n2-standard-8, CPU only, Linux, release candidate wheel, one run. Scores on other platforms can differ slightly, most on table structure.

The harness at this commit has no PDFluent engine of its own. The recipe files auto+kf and fast+kf in pdfluent-bench hold the exact configuration of both rows. More on the calls in the extraction guide.

opendataloader-bench

What this result does not say

It is one benchmark of 200 documents and one run, with these limits.

  • This benchmark was one of the targets our development optimised for.
  • The scores are measured on the benchmark's own 200 documents.
  • Our 19-measure result on our own held-out half and the separate checks are on the benchmarks page and in the 1.3.0 release post.
  • The PDFluent scores come from a release candidate wheel that reported version 1.2.0.
  • Speed is not compared here; it is measured separately on an Apple M4 after the release.
  • Competitor scores are the published figures from the benchmark's README, not re-run by us.
  • Both PDFluent rows keep page headers and footers (keep_furniture=True), because the benchmark's ground truth counts them as content.
  • There is no confidence interval: each score is one run.
  • PDFluent is not on the benchmark's public leaderboard yet.
More results

Other PDFluent benchmarks

19 measures · held-out half

Highest average score across 19 extraction measures*, against Docling 2.126.0 and pymupdf4llm 1.28.2.

Balanced tier + table model · opt-in · Preview

*Balanced tier with the table model (Preview), on our own held-out half of four public datasets, 17 Oct 2026. Average 0.721 for PDFluent, 0.693 for pymupdf4llm and 0.672 for Docling, over FinTabNet, PubTables-1M, DocLayNet and ParseBench. The table model was trained on the source datasets of PubTables-1M and FinTabNet, and most of those held-out pages are in their training split. On the 13 measures without that overlap the ranking is the same (0.650, 0.642, 0.610). Details: blog post SDK 1.2.0 and the benchmarks page.

All 19 measures
Release post

What changed in SDK 1.3.0

The auto tier, OCR for pages without a text layer, heading levels, and the upgrade notes.

Read the 1.3.0 post
opendataloader-bench

Questions about this benchmark

What is opendataloader-bench?

opendataloader-bench is a public benchmark on GitHub for PDF to Markdown and document-structure engines. It converts 200 PDFs with each engine and scores the output with its own evaluator on reading order (NID), table structure (TEDS) and heading hierarchy (MHS), plus an overall score. Its README publishes a leaderboard of 12 engines.

Which PDF parser scores highest on opendataloader-bench?

On the benchmark's public leaderboard, read 2 Nov 2026, opendataloader [hybrid] has the highest overall score of the 12 engines, 0.907. PDFluent 1.3.0 in its auto tier scores 0.9168 overall, measured with the benchmark's own harness and evaluator; PDFluent is not on that leaderboard yet, and this benchmark was one of the targets our development optimised for.

How do I reproduce the PDFluent score?

Check out opendataloader-bench at commit 7af1d8f4d0c09f51ea1a5c6ba5f66e993286d109 and follow its README to install the harness. Install PDFluent with pip install pdfluent==1.3.0 and the models with pdfluent models install layout tables. Convert each PDF with extract_markdown(path, quality="auto", keep_furniture=True) for the auto row, write the Markdown where the harness expects predictions, and score it with the benchmark's evaluator. The recipe files auto+kf and fast+kf in pdfluent-bench hold the exact configuration of both rows.

What do NID, TEDS and MHS measure?

NID (normalized indel distance) measures reading order: how much of the text comes out, in the right order. TEDS (tree edit distance similarity) measures table structure: rows, columns, spans and cell text against the true table. MHS measures heading hierarchy: how closely the Markdown headings and their levels match the document's outline. All three run from 0 to 1, and higher is better.

Is PDFluent on the public leaderboard?

Not yet. The PDFluent scores on this page were measured with the benchmark's own harness and evaluator on its 200 documents, at commit 7af1d8f. The other engines are the figures the benchmark publishes in its README; we did not re-run them.

Does PDFluent need models?

The fast tier needs none: it reads the PDF's text layer with the engine alone. The auto tier, the default from SDK 1.3.0, uses a layout model, a table model and a heading-level model, and runs OCR on pages without a text layer. You install the models once with pdfluent models install layout tables; without them, auto falls back to the fast tier and says so.

How does auto differ from fast?

Auto reads each document with the layout and table models, gives headings their level and sends pages without a text layer to OCR; on opendataloader-bench it scores 0.9168 overall. Fast runs no model and was the default up to SDK 1.2; on the same benchmark it scores 0.8577 overall. To keep the 1.2 behaviour after upgrading, pass quality="fast".

Is PDFluent free for commercial use?

The PDFluent desktop editor is free for everyone, including commercial use. The SDK, which is what this benchmark measures, is licensed AGPL-3.0-only or the PDFluent Commercial Licence, at your option.

Which PDF to Markdown tool is best for RAG?

It depends on your documents, so test on a sample of your own. For RAG, reading order and heading hierarchy matter most, because they decide whether a chunk keeps its sentences in order and where a section-aware splitter can cut; on documents with many tables, table structure matters too. On opendataloader-bench, PDFluent in the auto tier is highest on 2 of the 3 measures (reading order and heading hierarchy) and second on table structure, against the 12 leaderboard engines. Licence and whether you can install models are the other two factors.

Why do both PDFluent rows use keep_furniture=True?

The benchmark's ground truth counts page headers and footers as content. PDFluent drops them by default, which this benchmark would score as missing text, so both rows keep them. Outside this benchmark the default is unchanged.

SDK 1.3.0

Get started with PDFluent

Install the Python package, install the models once, and call extract_markdown.

pip install pdfluent==1.3.0

PyMuPDF and MuPDF are trademarks of Artifex Software, Inc. PDFluent is an independent product of Innovation Trigger B.V. and is not affiliated with or endorsed by Artifex.