Redacted means removed
PDFluent redaction removes the redacted content from the file instead of covering it. PDFluent takes text, images and shadings under a redaction area out of the page content, and after a full save the redacted text is absent from the file bytes and from every decoded stream. Where the library cannot be sure it removed everything, it refuses and says so. [A59, 2026-10-21]
If you redact documents, save with a full rewrite, the default. PDFluent refuses an incremental save after a redaction (Error::Unsupported). Search redaction also removes text that quotes the term from notes and pop-ups, rich text (/RC), form values, bookmark titles, named destinations, attachment names and descriptions, alternate text (/Alt, /ActualText), page labels and XMP packets. Region redaction (redact_region, pdfluent redact --boxes) follows the transformation matrix (cm), glyph widths and Form XObjects.
PDFluent refuses a stream that does not decode to its end instead of half-redacting it. JBIG2 images return an unsupported error. PDFluent flattens an XFA form first, or refuses it with xfa-redaction-needs-flatten.
If you redacted documents with 1.1.0 or earlier, update to 1.2.0 and redact the originals again.
Faster text extraction
On one c3-standard-8 (8 vCPU, no GPU), PDFluent 1.2.0 quality=fast converts 50.2 pages per second against 42.9 for PDFluent 1.1.0, measured in the same run on the same 75 single-page PDFs (+17%). On one thread: 50.6 against 42.9 (+18%). p95 per page: 40 ms against 50 ms. [A52, 2026-10-21] Single pages, fast tier; memory and cold start are unchanged.
Text extraction in PDFluent 1.2.0 is about twice as fast as in 1.1.0 on multi-page documents: 165 against 85 pages per second on one CPU. Median document 0.106 s against 0.207 s; p95 0.42 s against 0.84 s. The run used one c3-standard-8 over 40 public arXiv papers (1,050 pages). [A54, 2026-10-21] At quality=fast, one CPU, over scientific papers; nothing here covers scans or forms.
quality=balanced is not measurably faster in 1.2.0 (680 vs 695 ms per page) [A53, 2026-10-21].
Forms
In SDK 1.2.0 the scripts inside XFA and AcroForm forms run in a WebAssembly sandbox. The sandbox module has no file, network or environment access. [A46, 2026-10-21]
The SDK fills XFA forms: it reads a form's fields, sets their values, saves, and the values are in the file when you open it again. The SDK also flattens a form to a regular PDF. [A60, 2026-10-21] Shown on a synthetic XFA form, not on real-world forms, and with no success rate. Scripts in XFA forms do not run on their own. AcroForm recalculate() (cargo feature calculate) runs calculation scripts in /CO order and writes the results to the field values and fresh appearances.
Bindings
SDK 1.2.0 has text_with_layout (every text block with its page and bounding box) and the image placement API (image_placements, set_image_rect, replace_image, remove_image) in the Rust, Python, Node, WebAssembly and .NET bindings. [B74, 2026-10-22]
Quality you can check
Highest average score across 19 measures, holdout half: PDFluent 1.2.0 quality=balanced with the table model 0.721, pymupdf4llm 1.28.2 0.693, Docling 2.126.0 0.672 (competitors measured on 17 October 2026). Higher than Docling on 16 of 19 measures, higher than pymupdf4llm on 13 of 19. [A56, 2026-10-21] Unchanged from 1.1.0. Structured extraction (Markdown, blocks) is Preview.
Table structure (TEDS), holdout, balanced with the table model, paired per-document difference with 95% bootstrap interval:
| Dataset | vs Docling 2.126.0 | vs pymupdf4llm 1.28.2 | Claim |
|---|---|---|---|
| FinTabNet | +0.118 [+0.070; +0.165] | +0.089 [+0.041; +0.134] | A57, 2026-10-21 |
| PubTables-1M | +0.077 [+0.046; +0.113] | +0.093 [+0.063; +0.125] | A57, 2026-10-21 |
The table model was trained on data that overlaps part of these datasets. The benchmarks page has the method.
Released alongside
pdfluent-mcp 0.2.0 is an MCP server that reads local PDFs as markdown, plain text, tables or positioned blocks, looks up their metadata, searches them, lists their form fields and fills them into a new file. Nine tools. It runs over stdio, and reads and writes only inside the directories you allow. [B69, 2026-10-22] Your documents stay on your machine; they are never uploaded. [B70, 2026-10-22]
langchain-pdfluent 0.2.0 and llama-index-readers-pdfluent 0.2.0 load PDFs as blocks, tables or markdown pages with page, box, kind and confidence. They run locally: your documents stay on your machine. [B71, 2026-10-22] quality="balanced" needs the model files that pdfluent models install layout tables downloads once.
The loaders and the MCP server need pdfluent>=1.2.0. The loaders also need langchain-core>=0.3 or llama-index-core>=0.12 and Python 3.9 or newer; the MCP server needs mcp>=2.2,<3 and Python 3.10 or newer. [B72, 2026-10-22]
pdfluent-bench is public: the harness, the scorers, the dataset manifests and the per-run result files behind our benchmark numbers. One command runs it; the datasets are downloaded from their sources, not redistributed. [B75, 2026-10-22]
Install and upgrade
PDFluent SDK 1.2.0 is AGPL-3.0-only or the PDFluent Commercial Licence, at your option.
cargo add pdfluent@1.2.0
pip install pdfluent==1.2.0
npm install @pdfluent/node
npm install @pdfluent/sdk-wasm
dotnet add package PDFluent --version 1.2.0SDK 1.2.0 is written in Rust. The default build of the pdfluent crate and of every binding has no system libraries to install and nothing to bundle. [A45, 2026-10-21] The SDK runs inside your own process on your own machine. It needs no cloud service, no licence server and no activation, and its default build has no HTTP client; optional features (cloud OCR, model download, timestamping) make requests. [B66, 2026-10-21]
Upgrading: QuickJsRuntime and rquickjs_backend are deprecated aliases of SandboxedRuntime, removal in 2.0. Java PdfluentDocument is deprecated in favour of PdfDocument. Java 1.2.0 follows on the PDFluent Maven repository at https://maven.pdfluent.com.
Report problems or ask questions in GitHub Discussions.