PDFluent SDK 1.3.0 reads your PDFs properly by default. quality="auto" is the new default tier: balanced reading with the table-structure model, OCR on pages with no text layer, and running heads and feet dropped unless you keep them.
Upgrade if you build search, RAG, ingestion or compliance pipelines. 1.3.0 fixes a bug that could wipe a page's own text when you wrote an OCR layer or inserted an image, and extends redaction to text outside page content. Rust, Python, Node.js, WebAssembly, Java, .NET and C all ship in this release.
Better extraction by default
Your existing extraction calls now take the smart path, so their output changes. quality="auto" is the default in every binding with a quality option.
Auto reads a page with a text layer exactly as quality="balanced" with the table model reads it. It sends a page to OCR when the page draws a scan (no readable text layer, images over half the page) or an image region has no text over it.
Install the models once: pdfluent models install layout tables. Without them, auto reads the fast tier and tells you, naming that install command. It never fails for lack of a model.
Tables and headings
Tables arrive as structure and headings carry their real level, so downstream parsing gets what it expects. Table structure recognition is part of the auto tier.
Headings now carry the level the document has, from # to ######, instead of ## for every heading. The level comes from the document's own ranking of font sizes above body text.
OCR keeps your page content
A searchable copy no longer costs you the page it came from. In SDK 1.0.0 to 1.2.0, a page's /Contents can be an indirect reference to an array of streams. Writing an OCR layer or inserting an image onto that page produced an array holding a reference to an array. Readers drop the whole page content, so the page kept the OCR words or the image and lost its own text.
Fixed in 1.3.0: the SDK appends the new stream to the array's own elements. If you produced searchable copies or inserted images with earlier versions, regenerate them from the originals with 1.3.0.
Redaction reaches further
A redacted name that survives in a bookmark or a note is still a leak. search_and_redact removes the redacted text wherever the saved file quotes it outside page content. The term is masked (*) in every text string: notes, pop-ups, rich text, form values, bookmarks, attachment names, page labels, scripts, XMP packets. Attachment contents are not searched.
The masking is on by default, whatever pages restricts the page search to. If you used search_and_redact before, redact the originals again with 1.3.0.
Forms keep their totals
Form scripts that read event.target now run: AcroForm calculate and format actions see the field that owns the action, and field objects have valueAsString. XFA forms opened for filling now save the totals their calculations produced. Before, the SDK wrote a calculated order total back empty.
Previews in 1.3.0
PDF/A conversion and the compatibility layer that follows part of the PyMuPDF API both ship as previews in 1.3.0. PDF/A validation for A-1, A-2 and A-3, including ZUGFeRD and Factur-X invoices, ships as a supported feature.
Table finding in the compatibility layer now runs on PDFluent's own table detection, including ruled and borderless tables.
Quality you can check
Highest overall score on opendataloader-bench* [A64, A65, 29 Oct 2026]
In its default auto tier, PDFluent 1.3.0 scores 0.9168 overall, higher than all 12 engines on the benchmark's public leaderboard (+0.010 on the next). It is highest on 2 of the 3 measures (reading order and heading hierarchy) and second on table structure.
*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. Every engine and measure: benchmarks page.
Highest average score across 19 extraction measures*, against Docling 2.126.0 and pymupdf4llm 1.28.2. [A62, 2026-10-31]
*Balanced tier with the table model (Preview), on our own held-out half of four public datasets, 17 October 2026, measured on SDK 1.2.0. 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: SDK 1.2.0 post and benchmarks page.
Install and upgrade
pip install pdfluent==1.3.01.3.0 is live for Python. Rust, Node.js, WebAssembly, .NET and Java follow as each channel publishes it; this list updates when they do.
Models for auto: pdfluent models install layout tables
- Default output changes. Pass
quality="fast"to keep the 1.2 behaviour. - Calls that return blocks (
extract_blocks,extract_docling, the JSON formats) read the fast tier under auto. The balanced tier assembles Markdown from model regions and has no block form yet. A block form follows in 1.3.1. keep_furniture=Truekeeps running heads and feet on every tier.
PDFluent SDK 1.3.0 is AGPL-3.0-only or the PDFluent Commercial Licence, at your option. See SDK pricing and the documentation.
Report problems or ask questions in GitHub Discussions.
Frequently asked questions
- What changed in the default extraction in PDFluent SDK 1.3.0?
- PDFluent SDK 1.3.0 makes quality="auto" the default extraction tier: balanced reading, table structure, OCR on pages with no text layer, and heading levels. It drops running heads and feet unless keep_furniture is set.
- How do I get the old 1.2 extraction behaviour in PDFluent SDK 1.3.0?
- Pass quality="fast" to keep the 1.2 behaviour in PDFluent SDK 1.3.0. Under auto, block and JSON calls read the fast tier because the balanced tier has no block form yet.
- What do I install for auto extraction models in PDFluent SDK 1.3.0?
- Install the models once with pdfluent models install layout tables. Without them, PDFluent SDK 1.3.0 reads the fast tier and says so, naming that command.
- Did OCR in earlier PDFluent SDK versions lose page content, and what should I do?
- Yes: SDK 1.0.0 to 1.2.0 could drop a page's own text when writing an OCR layer or inserting an image onto a page whose content is split over several streams. PDFluent SDK 1.3.0 fixes this; regenerate affected files from the originals.
- What is a preview in PDFluent SDK 1.3.0?
- In PDFluent SDK 1.3.0, PDF/A conversion and a compatibility layer that follows part of the PyMuPDF API are previews. PDF/A validation is not a preview.
- Which bindings ship in PDFluent SDK 1.3.0?
- PDFluent SDK 1.3.0 ships bindings for Rust, Python, Node.js, WebAssembly, Java, .NET and C. Java, C and .NET extraction calls have no quality parameter and follow the engine default.