◆SelectPdf.Universal · v26.5 Windows · Linux · macOS · Docker

Cross-platform PDF library for .NET.
Our new flagship.

SelectPdf.Universal is our new flagship — the SelectPdf .NET library on Windows, Linux and macOS, with the classes and members you already know. Chromium-powered HTML to PDF plus the full PDF toolkit: create, merge, sign, fill forms, extract text. It targets .NET 8, .NET 10 and .NET Standard 2.0, and it runs in Docker containers and on ARM64 too — with the engine and fonts bundled, so there is nothing to apt-get. One perpetual license covers SelectPdf.Universal and the classic Windows library.

01 / CROSS-PLATFORM ●

SelectPdf.Universal

The full library, on every platform you ship to.

  • HTML & Word → PDF, PDF→text & image, merge, sign, redact
  • Windows, Linux (x64 & ARM64) and macOS on Apple Silicon
  • PDF/A-4, PDF/UA-2, AES-GCM — the newest standards
  • One perpetual license covers this and the classic library
# one package for the platform you deploy to:
$ dotnet add package SelectPdf.Universal.Linux
# or .Windows, .Linux.Arm64, .MacOS (Apple Silicon)
.NET 8 · .NET 10 .NET Standard 2.0 Docker ARM64
02 / FREE ●

Community Edition

Free, cross-platform. PDFs up to 5 pages.

SelectPdf.HtmlToPdf.Universal is the free Community Edition of the cross-platform converter — HTML to PDF only, free for commercial use, no watermark, capped at five pages per document. Same namespace and same classes as the full package, so moving up later is a package swap and a license key.

↔The new flagship

Our new flagship library. An API you already know.

SelectPdf.Universal is our new flagship: cross-platform, and the first to get new features and standards. It keeps the classes, members and overloads of the classic library wherever they could be kept, so moving a project over is mostly mechanical — new packages, the SelectPdf.Universal namespace, and the library's own drawing types in place of System.Drawing. The classic Windows library continues to be maintained and receives selected updates.

Program.cs
using SelectPdf.Universal;

// the same code on Windows, Linux and macOS
HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertUrl("https://selectpdf.com");
doc.Save("output.pdf");
doc.Close();
Program.vb
Imports SelectPdf.Universal

' the same code on Windows, Linux and macOS
Dim converter As New HtmlToPdf()
Dim doc As PdfDocument = converter.ConvertUrl("https://selectpdf.com")
doc.Save("output.pdf")
doc.Close()

Measured against the classic 26.4 SDK: 82% of its public types and members carry over unchanged apart from the namespace. Most of the rest are System.Drawing types, settings for the WebKit and Blink engines, and direct printing.

ConvertUrlAsync and ConvertHtmlStringAsync sit beside the synchronous calls — awaitable, with cancellation. PdfDocument and the managers are IDisposable, so a using statement can stand in for Close().

⌗PLATFORMS

Windows, Linux and macOS — x64 and ARM64.

Windows win-x64 · win-x86 Static-CRT engines — no Visual C++ redistributable to install.
Linux linux-x64 · linux-arm64 Verified on Debian 12, Ubuntu 22.04 and 24.04, and Amazon Linux 2023. glibc 2.30 or later; Alpine through the engine container.
macOS osx-arm64 · macOS 13+ Apple Silicon, with signed and notarised engines. Intel Macs are not covered — use the Online API there.
Frameworks .NET 8 · .NET 10 Native targets, plus .NET Standard 2.0 for .NET Framework 4.6.1 and later. Verified with .NET 11 RC 1.
Containers Docker · x64 and ARM64 Stock .NET runtime images on x64 and ARM64 — no extra system packages and no special run flags.
Cloud Azure App Service Verified on both Windows and Linux App Service, on Basic or above.
Engine One package per platform SelectPdf.Universal.Windows, .Linux, .Linux.Arm64 or .MacOS installs the library with its engine. Multi-platform builds add one Native package per runtime instead.
Not supported Windows on ARM There is no win-arm64 engine. The Online API covers that case, and any non-.NET stack.
Speed Fast by default After the first conversion, a simple page converts in a fraction of a second. In 26.5, conversions running in parallel more than doubled per minute on Linux and rose by about half on Windows in our tests.
§MEASURED · OPEN BENCHMARK

Measured against nine other .NET PDF libraries.

Throughput on Linux 2,597 conversions a minute With 8 conversions at once, the most of the ten libraries on Linux; 1,078 on Windows.
Fidelity 0.984 against Chrome Mean similarity of the PDFs to a Chrome screenshot of the same pages, the closest of the ten.
Standards 17 of 17 levels valid Every PDF/A, PDF/UA and PDF/X level requested passed validation; no other library passed more than 8.

From the 2026-10-15 run of the open benchmark, which SelectPdf maintains: ten libraries on one machine, under Windows and Ubuntu 24.04 in WSL2. Results vary with the workload and the environment. Full results and test conditions · All ten libraries compared · SelectPdf vs IronPDF · The 14 comparison tasks on GitHub

§LINUX & DOCKER

HTML to PDF in Docker — nothing to apt-get.

The Chromium engine, the fallback fonts and the native PDF tools all ship inside the per-platform NuGet package, so a stock .NET runtime image is enough.

The SelectPdf.Universal.Native package for each Linux runtime carries the complete Chromium shared-library closure — including the modules loaded at run time for HTTPS — so there is no apt-get install step in your Dockerfile. Rendering is headless: no X server, no Xvfb, no $DISPLAY.

A plain docker run works — no --no-sandbox, no added capabilities, no privileged mode, no GPU and no --shm-size tuning. No manual chmod either: publishing on Linux makes the engine readable and executable for every user, and the library restores the execute permission itself if it was lost, so the image can switch to the non-root app user with no extra line.

PDF to text and PDF to image need nothing at all on any platform — that engine is statically linked.

Step by step: HTML to PDF in a Docker container on Linux, a complete C# program with its Dockerfile.

Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -f net10.0 -o /out

FROM mcr.microsoft.com/dotnet/runtime:10.0-noble AS runtime
# no apt-get: the Chromium closure ships in the engine
# package (SelectPdf.Universal.Linux) and runs headless
WORKDIR /app
COPY --from=build /out ./
ENTRYPOINT ["dotnet", "MyApp.dll"]
§REMOTE ENGINE

Run the engine in a container — even on Alpine.

New in 26.5: the conversions can run on another machine.

Set RenderingEngine.ChromiumRemote and HTML to PDF, HTML to image, PDF to text and PDF to image run in the ghcr.io/selectpdf/engine container instead of on the application's machine. The application then references only SelectPdf.Universal, with no native engine package, so it runs on Alpine Linux and other musl-based images, where the native engines do not.

The engine image is published for linux/amd64 and linux/arm64, with a Helm chart, and the documentation has tested setups for Docker Compose, Kubernetes, Azure Container Apps, Amazon ECS and Google Cloud Run. The free Community Edition supports it too.

Step by step: HTML to PDF on Alpine Linux with the remote engine and the remote engine documentation.

Program.cs
using SelectPdf.Universal;

// convert in the SelectPdf engine container, at the address
// in the SELECTPDF_ENGINE_ENDPOINT environment variable
GlobalProperties.RenderingEngine = RenderingEngine.ChromiumRemote;

HtmlToPdf converter = new HtmlToPdf();
PdfDocument doc = converter.ConvertUrl("https://selectpdf.com");
doc.Save("output.pdf");
doc.Close();
⚖STANDARDS & ACCESSIBILITY

PDF/A-4, PDF/UA-2 — the PDF 2.0 generation.

Accessibility PDF/UA-1 & PDF/UA-2 Tagged PDF with a logical structure tree and reading order, for EN 301 549, Section 508 and European Accessibility Act obligations.
Archival PDF/A-1 → PDF/A-3 Levels 1A, 1B, 2A, 2B, 2U, 3A, 3B and 3U for long-term archiving. PDF/A-1a combines with PDF/UA-1.
PDF 2.0 archival PDF/A-4 · 4E · 4F ISO 19005-4, including the engineering variant and the variant that allows arbitrary embedded files. PDF/A-4 is the level that pairs with PDF/UA-2.
Print PDF/X-1a:2001 For print production and prepress workflows.
Encryption RC4 · AES · AES-GCM 40, 128 and 256-bit keys, plus AES-256 revision 6 — the PDF 2.0 encryption revision.
E-invoicing ZUGFeRD & Factur-X Hybrid invoices across the Minimum, Basic, EN 16931, Extended and XRechnung profiles.
Signatures PFX · store · token · HSM Sign from a PFX file, the certificate store, a USB token, smart card or HSM (PKCS#11), or a remote signing service. SHA-256 to SHA-512, timestamps and long-term validation (PAdES B-LT).
Access Passwords & permissions User and owner passwords with per-document permissions.
Edition Commercial only Tagged PDF, e-invoicing and signing are part of SelectPdf.Universal; the free Community Edition converts HTML to PDF.
↳CAPABILITIES

The full .NET PDF library — not just HTML to PDF.

Everything the classic SDK does, on every platform the Universal packages target.

01 · HTML→PDF+
HTML to PDF

Convert any web page or raw HTML string to PDF with a Chromium engine.

  • HTML5/CSS3, web fonts, JavaScript
  • HTTP headers, cookies, POST, auth, proxy
  • Headers, footers and tables of contents with page numbers
02 · HTML→Image+
HTML to image

Render a page or HTML string to an image with the same engine.

  • Full page or a fixed viewport
  • Same fidelity as the PDF output
  • Web page or raw HTML input
03 · CREATE+
PDF from scratch

Build documents in code, page by page.

  • Text, images, shapes, links and bookmarks
  • Reusable templates, watermarks and stamps
  • Fonts including CJK, with subset embedding
04 · EDIT+
Load & modify

Work on PDFs your application did not create.

  • Merge and append documents
  • Resize, reflow and compress
  • Smaller files: large photos resampled to a set resolution
05 · FORMS+
AcroForms

Create, fill and flatten interactive form fields.

  • HTML forms become fillable PDF fields
  • Fill fields on generated or loaded PDFs
  • Flatten to a non-editable document
06 · PDF→TEXT+
PDF to text & image

Read documents back out again.

  • Extract text per page or from a region
  • Search in any script, including Chinese, Japanese and Arabic
  • Rasterize pages to images
07 · WORD→PDF+
Word to PDF

Convert Word documents to PDF — no browser, no engine process, no network.

  • DOCX, DOC, RTF, Markdown and more
  • Page sizes kept, headings become bookmarks
  • Tagged PDF/UA and archival PDF/A output
08 · REDACT+
Redaction

Remove sensitive content from existing PDFs — deleted from the file, not covered over.

  • Find it by area, text or regular expression
  • Removes text, images, links and form fields
  • Optional overlay text on each redaction
09 · VALIDATE+
Signature validation

Check the digital signatures on a PDF you received.

  • Valid, trusted, and unchanged since signing
  • Revocation checks over OCSP and CRL
  • One status per signature
§REDACTION & SIGNATURES

Redact PDFs and validate signatures in C#.

The compliance half of a document workflow: take out what must not leave, and check what came in.

PdfRedactionManager finds content by area, by text or by regular expression and removes it from the file. The text, images, links and form fields underneath are deleted, not hidden behind a box — there is nothing left to copy or extract.

PdfSecurityManager.ValidateSignatures checks every signature on a document you received: whether it is valid and trusted, whether the document changed after it was signed and, with revocation checking on, whether the certificate was revoked. Check a signed invoice or contract before you act on it.

Both are part of the commercial SelectPdf.Universal package.

Redact.cs
using SelectPdf.Universal;
using System.Text.RegularExpressions;

var redactor = new PdfRedactionManager();
redactor.Load("statement.pdf");

// every card number, wherever it appears
redactor.AddRedaction(new Regex(@"\d{4}-\d{4}-\d{4}"));
redactor.OverlayText = "REDACTED";

redactor.Redact();
redactor.Save("statement-redacted.pdf");
redactor.Close();
↔EDITIONS

Pick your package — classic or cross-platform.

Classic — platforms Select.Pdf · Select.HtmlToPdf Windows, .NET Framework 2.0 through .NET 10, with four rendering engines to choose from.
Cross-platform SelectPdf.Universal Windows, Linux and macOS on .NET 8/10 and .NET Standard 2.0, with the Chromium engine.
Free editions Both, 5-page cap Select.HtmlToPdf on Windows and SelectPdf.HtmlToPdf.Universal cross-platform — free for commercial use, no watermark.
Classic keeps Framework 2.0 · 4 engines Direct printing and conversion events stay on the classic Windows packages.
Universal keeps The newest features Word to PDF, tables of contents, fillable forms from HTML, token and HSM signing, redaction, signature validation, PDF/A-4, PDF/UA-2 and AES-GCM are in SelectPdf.Universal.
Classic library Maintained The classic Windows library continues to be maintained and receives selected updates. One perpetual license covers both.
?FAQ

Cross-platform .NET PDF, answered.

More in the .NET library docs — the rest is one email away.

Yes. SelectPdf.Universal runs the SelectPdf library API on Linux x64 and ARM64, as well as on Windows and macOS. The Chromium rendering engine and Latin fonts are bundled with the NuGet packages, so it also runs on minimal container images with nothing extra to install. For text in other languages, such as Chinese, Japanese or Arabic, add the optional SelectPdf.Universal.Fonts package.
No. The classic packages, including the .NetCore ones, run on Windows only: “NetCore” means they target .NET Core and .NET 5 to 10, not other operating systems. For Linux, Docker and macOS, use SelectPdf.Universal, or the free SelectPdf.HtmlToPdf.Universal Community Edition. Moving over means new packages, the SelectPdf.Universal namespace and the library's own drawing types in place of System.Drawing.
Yes, on Apple Silicon. SelectPdf.Universal ships a signed, notarised native engine for macOS on ARM (osx-arm64), and requires macOS 13 or later. Intel Macs are not covered by a native engine — use the SelectPdf Online API there.
Largely. SelectPdf.Universal keeps the classes, members and overloads of the classic library wherever they could be kept: 82% of the classic public API carries over unchanged apart from the namespace. Moving a project over means new packages, the SelectPdf.Universal namespace and the library's own drawing types in place of System.Drawing. Universal renders with Chromium only, so settings for the WebKit and Blink engines are removed; direct printing, conversion events and the RtfToPdfElement class are not carried over, and RTF files convert through the new WordToPdf instead. Two timing properties are renamed, with the old names kept as obsolete aliases. The migration topic in the documentation lists every change.
Yes. The engine ships with everything it needs and runs headless — verified on Debian 12, Ubuntu 22.04 and 24.04, and Amazon Linux 2023 images with no extra system packages required, and no special docker run flags.
Any distribution with glibc 2.30 or newer, such as Debian 11+, Ubuntu 20.04+, RHEL 9+ and Amazon Linux 2023, works with the native engine packages. On Alpine and other musl-based distributions, run the conversion engines in the SelectPdf engine container (ghcr.io/selectpdf/engine, for linux/amd64 and linux/arm64) and set RenderingEngine.ChromiumRemote. The application then references only the SelectPdf.Universal package, and everything else, including PDF/A, digital signatures and Word to PDF, works as it does with a local engine.
Yes. Install SelectPdf.Universal.Linux.Arm64 for Linux on ARM64, or SelectPdf.Universal.MacOS for Macs with Apple Silicon. It is verified in AWS Lambda on arm64 (Graviton), where every test conversion succeeded and the pages matched a Windows conversion.
Yes. On Azure App Service on Windows or Linux, on the Basic plan or above. On Azure Functions (version 4, isolated worker) on a Dedicated plan of Basic or above, or an Elastic Premium plan, but not on the Consumption or Flex Consumption plans. On AWS Lambda as a container image, on x86_64 and arm64; a zip deployment is too large for the engine. Also on Azure Container Apps, AWS Elastic Beanstalk and Google Cloud Run. The documentation has a step-by-step guide for each.
Yes. SelectPdf.Universal writes tagged PDF to PDF/UA-1 and PDF/UA-2, and archival PDF at every PDF/A-1, PDF/A-2 and PDF/A-3 level (1A, 1B, 2A, 2B, 2U, 3A, 3B and 3U) as well as the PDF 2.0 family PDF/A-4, 4E and 4F. PDF/X-1a is supported for print production.
Yes. SelectPdf.Universal signs with keys it never sees: a USB token, smart card or HSM through PKCS#11, a certificate in the Windows, macOS or Linux certificate store, or a remote signing service in two steps. Signed with a qualified certificate on a USB token, the result is reported by Adobe Acrobat as a qualified electronic signature. Long-term validation (PAdES B-LT) embeds the revocation data, so the signature can still be validated after the certificates expire.
Yes. The perpetual .NET library license covers both the classic Windows packages and SelectPdf.Universal — one license, every platform.
Yes — SelectPdf.HtmlToPdf.Universal, the cross-platform Community Edition: HTML to PDF only, free for commercial use, no watermark, capped at 5 pages per document.
.NET 8 and .NET 10 natively, plus .NET Standard 2.0, which makes the library consumable from .NET Framework 4.6.1 and later. Version 26.5 is also verified with .NET 11 RC 1 on Windows, Linux and macOS on Apple Silicon.
One package for the platform you deploy to: SelectPdf.Universal.Windows, SelectPdf.Universal.Linux, SelectPdf.Universal.Linux.Arm64 or SelectPdf.Universal.MacOS installs the library together with its engine. A build that targets several platforms references SelectPdf.Universal and one SelectPdf.Universal.Native.<rid> package per runtime instead, not both. Word to PDF needs no engine package, and an application that uses the remote engine references only SelectPdf.Universal.
Yes. The commercial SelectPdf.Universal package converts DOCX, DOC, RTF, TXT, WordML, HTML and Markdown documents to PDF with the WordToPdf class, on every supported platform. The Word engine is part of the library, so it needs no browser and no native package. Page sizes follow the document, headings become bookmarks, and the output can be tagged PDF/UA or archival PDF/A. Word to PDF is not in the free Community Edition or in the classic Windows library.
Yes. HtmlToPdf.ConvertUrlAsync and ConvertHtmlStringAsync return a Task<PdfDocument> and accept a CancellationToken. Up to MaximumConcurrentConversions conversions run at once — eight by default — and the rest wait their turn in order.