The only pure-Rust XFA engine. Handles dynamic reflow, FormCalc scripting, and SOM path resolution — the parts every other SDK skips.
PDF processing in the browser with no server. Drop in the Core bundle and your users' files never leave their device.
Pure Rust means no JVM warmup, no GC pauses. Starts in under 10ms. Processes thousands of PDFs in parallel without breaking a sweat.
PDF/A-1/2/3 archiving, PDF/UA accessibility, ZUGFeRD and Factur-X e-invoicing. Validate and remediate — not just check.
Every operation returns a structured result. Sub-millisecond for most tasks. Here's what you actually get.
{
"status": "success",
"text": "Invoice #12345 extracted in 2.4ms",
"pages": 3
}{
"status": "flattened",
"note": "Dynamic form converted to static PDF in 8.1ms"
}{
"compliant": true,
"level": "PDF/A-3b",
"validated_in": "1.2ms"
}{
"text": "Full document text extracted",
"words": 1247,
"time": "3.7ms"
}{
"signed": true,
"algorithm": "RSA-SHA256",
"timestamp": "2026-03-26T10:30:00Z"
}{
"recognized": true,
"confidence": 0.97,
"text": "Scanned document text recognized"
}{
"merged": true,
"input_files": 3,
"output_pages": 12,
"time": "5.8ms"
}{
"converted": "PDF to DOCX",
"fidelity": "high",
"time": "18.4ms"
}{
"redacted": true,
"patterns": ["SSN", "email"],
"matches": 7
}Everything you need to build PDF-powered applications
Parse any PDF — malformed, compressed, encrypted — without crashing. Extract text with accurate reading order, render pages, merge, split, and save with incremental writes. Built on a streaming parser that handles multi-GB files without loading them into memory.
use pdfluent::Sdk;
let sdk = Sdk::init_with_license("license.json")?;
let doc = sdk.open("report.pdf")?;
// Extract text with bounding boxes
for page in doc.pages() {
for block in page.extract_text_blocks()? {
println!("[{:.0},{:.0}] {}", block.x, block.y, block.text);
}
}
// Merge multiple PDFs
let merged = sdk.merge(vec![
sdk.open("part1.pdf")?,
sdk.open("part2.pdf")?,
])?;
merged.save("combined.pdf")?;Six million XFA forms exist in government, tax, and banking systems worldwide. Most SDKs either refuse to open them or break complex layouts on flatten. PDFluent implements XFA 3.3 parsing, FormCalc scripting, XML data binding, and SOM path resolution — all in pure Rust. Visual accuracy is actively improving.
use pdfluent::{Sdk, XfaFlattenOptions};
let sdk = Sdk::init_with_license("license.json")?;
let doc = sdk.open("tax_return.xdp")?;
// Import XML data, then flatten to static PDF
let xml = std::fs::read("filled_data.xml")?;
doc.import_xfa_data(&xml)?;
let flat = doc.flatten_xfa_with_options(XfaFlattenOptions {
preserve_acroform: true,
embed_fonts: true,
..Default::default()
})?;
flat.save("filed_return.pdf")?;
// Or just extract field data as XML
let data = doc.export_xfa_data()?;
std::fs::write("extracted.xml", data)?;PDF/A archiving for 7-year EU retention rules, PDF/UA accessibility for WCAG 2.2, ZUGFeRD and Factur-X e-invoicing for EN-16931. PDFluent validates, reports clause-level violations, and converts — without requiring you to become a PDF spec expert.
use pdfluent::{Sdk, PdfaLevel};
let sdk = Sdk::init_with_license("license.json")?;
let doc = sdk.open("legacy.pdf")?;
// Validate with detailed report
let report = doc.validate_pdfa(PdfaLevel::A2b)?;
if !report.is_compliant() {
for v in report.violations() {
eprintln!("[§{}] {}", v.clause, v.message);
}
}
// Convert to PDF/A-2b
let archived = doc.convert_to_pdfa(PdfaLevel::A2b)?;
archived.save("archived.pdf")?;
// Full compliance dashboard in one call
let dash = doc.run_compliance_checks()?;
println!("PDF/A: {} | PDF/UA: {} | ZUGFeRD: {}",
dash.pdfa.is_compliant(),
dash.pdfua.is_compliant(),
dash.zugferd.is_valid());PAdES-B-B, B-T, B-LT, and B-LTA signatures with RFC 3161 timestamping. Load PKCS#12 certificates, add visible or invisible signatures, verify chains and revocation status, and sign multi-party documents. Everything runs offline — no API calls, no external services.
use pdfluent::{Sdk, Signer, SignatureOptions};
let sdk = Sdk::init_with_license("license.json")?;
let doc = sdk.open("contract.pdf")?;
let signer = Signer::from_pkcs12("cert.p12", "password")?;
let signed = doc.sign(signer, SignatureOptions {
page: 0,
reason: "Approved by legal".to_string(),
location: "Amsterdam, NL".to_string(),
timestamp_url: Some("http://timestamp.sectigo.com".into()),
..Default::default()
})?;
signed.save("signed_contract.pdf")?;
// Verify existing signatures
for sig in doc.signatures() {
let result = sig.verify()?;
println!("{}: valid={}, modified={}",
sig.signer_name(),
result.is_valid(),
result.document_modified());
}All processing happens locally via WebAssembly. No server uploads, complete privacy.
Extract text with layout preservation
Full WASM rendering in the browser, XFA forms included
Check archival compliance against PDF/A-1 through PDF/A-3
Combine multiple PDFs into a single document
Convert a PDF to archival PDF/A format
View page count, file size, metadata, and fonts
Deep dive into document properties and XMP metadata
Detect and verify digital signatures
Generate instant page previews
List comments, highlights, and stamps
vs Java-based alternatives — full methodology
Built in 100% pure Rust — no C, no C++, no JVM. PDFluent starts in under 30 ms, uses minimal memory, and ships as a single binary or a ~2 MB Brotli-compressed WASM bundle (~6 MB uncompressed) that runs anywhere: server, browser, edge, embedded.
See how our pure Rust approach compares to legacy Java-based solutions
1 developer · unlimited projects
For solo developers building a single product.
Up to 5 developers · unlimited projects
For small teams that need compliance and signatures.
Up to 15 developers · unlimited projects
For mid-size teams with legacy forms and complex workflows.
Unlimited developers · unlimited projects
For large organisations, OEM vendors, and SaaS platforms.
All prices in EUR, excl. VAT. Billed annually. Every paid plan includes a perpetual fallback licence — pay for one year, keep that version forever.