PdfAConverter
The repair engine: one call that fixes fonts, colour, streams, and metadata, then rewrites. File, stream, byte-array, or attachment input; sync and async.
Two battle-tested engines in one library. PdfAConverter
repairs real-world PDFs in one call, fonts embedded and reconciled
glyph by glyph, colour calibrated, prohibited constructs removed,
XMP rebuilt, and rewrites them as PDF/A-1b, 2b, or 3b.
PdfAValidator is its adversary: a distinct engine that
re-parses any file from scratch and judges it against the ISO 19005
rule catalog. Both fully on-device.
PdfAConverterThe repair engine: one call that fixes fonts, colour, streams, and metadata, then rewrites. File, stream, byte-array, or attachment input; sync and async.
PdfAValidatorThe judging engine: re-parses any PDF from scratch and returns a verdict with one finding per failed rule. Same inputs, sync and async.
The validator shares no verdict path with the converter, so a pass means the document conforms, not that one tool agrees with itself.
A pipeline can fake it, flatten it, refuse it, or take it on faith. Two engines exist so none of those survive here.
Stamping
Writing PDF/A identification into a file that still violates the rules produces archives that fail their first independent validation, years after anyone can fix them.
Rasterizing
Flattening every page to images guarantees conformance and destroys everything else: searchable text, vector sharpness, file size.
Refusing
Strict converters reject encrypted, damaged, and font-broken documents, which is exactly what a real archive backlog is made of.
Trusting
Accepting archives on the producer's word defers every failure to the first independent audit, years after the producer is gone.
The converter repairs in place before rewriting, so text, vectors, and layout survive; benchmark outputs are render-compared to their source, page by page.
Fonts
Every font is embedded. Missing programs are replaced by metric-compatible equivalents, declared widths are reconciled glyph by glyph, and encodings are normalized so extracted text stays intact.
Colour
Device colour spaces are calibrated through embedded ICC profiles and an sRGB output intent. Transparency is handled per conformance level.
Prohibited
JavaScript, launch actions, embedded multimedia, and external references are stripped, as the standard requires for self-contained archives.
Encryption
Pass the password and the converter opens protected sources. The output is always unencrypted; PDF/A forbids encryption.
Streams
LZW streams and non-conforming JPEG 2000 images are re-encoded to compliant equivalents without touching conforming content.
Metadata
PDF/A identification metadata is written and the XMP packet is synchronized with the document information dictionary, a classic validation failure.
Levels
Target the level your archive requests via PdfAConversionOptions.Level. The default is PDF/A-2b, the level most archives ask for.
Report
Every conversion returns a report: features detected, fixes applied, raster triggers, unresolved violations, page count, and whether encryption was removed.
Fallback
Rasterize (default) guarantees a conforming output by rebuilding unrepairable documents from page renders with an invisible text layer. Fail throws instead, ReportOnly ships the best-effort rewrite plus the violation list.
One call converts a PDF to PDF/A-2b and returns a report of everything that was detected and repaired.
using LMKit.Document.Pdf; // One call: repair fonts and colour, strip prohibited constructs, // rebuild metadata, rewrite as PDF/A-2b. var report = PdfAConverter.ConvertToFile("invoice.pdf", "invoice_pdfa.pdf"); Console.WriteLine($"Conforms: {report.Conforms}"); Console.WriteLine($"Pages: {report.PageCount}"); Console.WriteLine($"Fixes applied: {report.FixesApplied}");
Target PDF/A-3b, open an encrypted source, and report residual violations instead of rasterizing.
using LMKit.Document.Pdf; // Target PDF/A-3b and report violations instead of rasterizing. var options = new PdfAConversionOptions { Level = PdfAConformanceLevel.PdfA3b, Fallback = PdfAConversionOptions.FallbackBehavior.ReportOnly, Password = "s3cret", // encrypted input; output is always unencrypted }; var report = await PdfAConverter.ConvertToFileAsync( "contract.pdf", "contract_pdfa.pdf", options); if (!report.Conforms) { Console.WriteLine($"Unresolved: {report.UnresolvedViolations}"); }
Bytes in, conforming bytes plus report out. Suited to web services and pipelines where documents never touch disk.
using LMKit.Document.Pdf; // Bytes in, conforming bytes plus report out. No temp files. byte[] source = await httpClient.GetByteArrayAsync(documentUrl); var result = await PdfAConverter.ConvertToBytesAsync(source); await blobStore.UploadAsync(result.Data); Console.WriteLine($"Raster fallback: {result.Report.UsedRasterFallback}");
PdfAValidator is a second, separate engine: it re-parses
any PDF from scratch and judges it against the ISO 19005 rule catalog,
entirely in process. No Java runtime, no external tool, no file
leaving the machine.
Independent
A distinct engine that evaluates the document's actual state: it tells a file that merely declares PDF/A from one that holds up to the rules.
In process
Validation ships inside the SDK and runs where the documents already are. Batch-check whole archives without standing up external tooling.
Verdicts
Compliant, NonCompliant with one finding per failed rule, or Undetermined when a file cannot be judged. Never a false verdict.
Findings
Each finding names its failed rule under a stable identifier, and RulesEvaluated states the pass's own coverage, so stored verdicts stay honest.
using LMKit.Document.Pdf; // Convert, then prove it: the validator re-parses the // output from scratch. It never trusts the converter. var converted = PdfAConverter.ConvertToBytes("legacy.pdf"); var report = PdfAValidator.Validate(converted.Data); Console.WriteLine($"{report.Verdict} ({report.Level})"); foreach (var finding in report.Findings) { Console.WriteLine($" {finding.Rule}: {finding.Description}"); }
The same converter ships in LM-Kit One as a REST endpoint: convert documents to archival PDF/A from any language over HTTP.
Merge, split, render, search-highlight, unlock, and inspect PDFs with the same library.
Coming from images instead of PDFs? ImageToSearchablePdf turns scans and multipage TIFFs into searchable PDF/A in one pass.
Markdown to PDF, HTML to Markdown, email to PDF, and the full conversion catalogue.
The invisible text layer used by the raster fallback is driven by the same on-device OCR engines.
PdfRedactor permanently removes text, images, vectors, and annotations under a mark before you archive. Content is deleted, not covered.
PdfSigner signs, certifies, timestamps, and LTV-extends PDFs on-device; PdfSignatureValidator verifies them against your trust anchors.
Working console demos on GitHub, step-by-step how-to guides on the docs site, and the API reference for the classes used on this page.
Convert any PDF to PDF/A-1b / 2b / 3b with a full conversion report via PdfAConverter.
Open on GitHub → SampleStep-by-step doc page: prerequisites, setup, code path, expected output.
Read on docs → How-to guideConformance levels, fallback policies, encrypted sources, reading the report.
Read the guide → API referenceAPI reference for the PDF/A conversion entry point.
Open the reference → API referenceAPI reference for the independent PDF/A validator.
Open the reference →