An IronPDF alternative for .NET.
SelectPdf converts HTML to PDF with Chromium 154, released in September 2026; IronPDF ships Chromium 109, from January 2023. SelectPdf costs half as much for a single developer, and in the same open benchmark it passed more output checks, produced every PDF/A and PDF/UA level valid, kept its memory flat over 1,000 conversions, and ran in Docker without a single apt-get line.
using SelectPdf.Universal;
HtmlToPdf converter = new HtmlToPdf();
converter.Options.MarginTop = 57; // 57 pt = 20 mm
converter.Options.DisplayFooter = true;
converter.Footer.Add(new PdfTextSection(0, 10,
"Page {page_number} of {total_pages}")
{ HorizontalAlign = PdfTextHorizontalAlign.Center });
PdfDocument doc = converter.ConvertHtmlString(html);
doc.Save("report.pdf");
doc.Close();
HTML to PDF with a "Page N of M" footer in SelectPdf.
IronPDF and SelectPdf at a glance.
IronPDF is a commercial .NET PDF library from Iron Software. SelectPdf.Universal is the cross-platform .NET PDF library from SelectPdf. Both convert URLs and HTML strings to PDF with a Chromium-based engine, so modern CSS, web fonts and JavaScript render in both, and both create, edit and read PDF documents: merge and split, watermarks and stamps, form filling, text extraction, PDF to image, digital signatures and PDF/A.
| SelectPdf | IronPDF | |
|---|---|---|
| HTML engine | Chromium 154.0.8037.58 (stable since September 22, 2026), in a NuGet engine package | Chromium 109.0.5414.120 (stable since January 10, 2023), in NuGet packages |
| NuGet packages | SelectPdf.Universal + one engine package per platform | IronPdf (Windows), IronPdf.Linux |
| .NET | .NET 8 and 10, and .NET Framework 4.6.1+ / .NET Core through .NET Standard 2.0 | .NET 5 to 10, .NET Core, .NET Framework 4.6.2+ |
| Platforms | Windows (x64, x86), Linux (x64, ARM64), macOS on Apple Silicon | Windows, Linux, macOS |
| Linux packages in Docker | none | an apt-get list from IronPDF's Docker guide |
| Trying it | 30-day trial without a key (a "Demo Version" banner on each page); free Community Edition for HTML to PDF up to 5 pages | 30-day trial key |
| License | perpetual, from USD 499 | perpetual, from USD 999 |
Moving from one to the other is mostly renaming types and converting units: SelectPdf margins are in points where IronPDF's are in millimetres, and the page-number placeholders change. The sections below show where SelectPdf comes out ahead, how to migrate IronPDF code to SelectPdf, and what each license costs.
Where SelectPdf is ahead.
Prices from each vendor's pricing page. Measurements from the 2026-10-15 run of the open pdf-benchmarks harness: IronPDF 2026.10.3 and SelectPdf.Universal 26.5.0 on the same machine.
| SelectPdf | IronPDF | |
|---|---|---|
| Chromium version | 154, from September 2026 | 109, from January 2023 |
| Entry license (1 developer) | USD 499 | USD 999 |
| 1 developer, SaaS or redistributed software | USD 799 (Single Developer OEM) | USD 2,998 (Lite + OEM Redistribution add-on) |
| Content checks passed | 46 of 48 | 41 of 48 |
| Fidelity to Chrome, mean SSIM | 0.984 | 0.928 |
| PDF/A, PDF/UA and PDF/X levels valid | all 17 | 5 of the 14 it produces |
| Tagged structure checks (accessible PDFs) | 112 of 112 | 42 of 112 |
| Memory after 1,000 conversions, Windows | 140 → 156 MB | 226 → 630 MB |
| Memory after 1,000 conversions, Linux | 369 → 389 MB | 451 → 1,076 MB |
| Docker on the official .NET image | root and non-root, no extra packages | root only; non-root needs IronPDF's apt-get list |
| Text search in a PDF | PdfToText.Search | no API |
Every number above, with the rest of the measurements, is in the full table below.
Migrate IronPDF code to SelectPdf.
The same document in both libraries: an HTML page with a centred header and a "Page N of M" footer. Install the library and the engine package for your platform:
dotnet add package SelectPdf.Universal dotnet add package SelectPdf.Universal.Native.win-x64
IronPDF:
using IronPdf;
License.LicenseKey = "...";
ChromePdfRenderer renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter
{
CenterText = "Quarterly report",
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page} of {total-pages}",
};
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");
SelectPdf:
using SelectPdf.Universal;
HtmlToPdf converter = new HtmlToPdf();
converter.Options.DisplayHeader = true;
converter.Header.Height = 40;
PdfTextSection header = new PdfTextSection(0, 15, "Quarterly report",
PdfFont.CreateStandardFont(PdfStandardFont.Helvetica, 10));
header.HorizontalAlign = PdfTextHorizontalAlign.Center;
converter.Header.Add(header);
converter.Options.DisplayFooter = true;
converter.Footer.Height = 40;
PdfTextSection footer = new PdfTextSection(0, 10, "Page {page_number} of {total_pages}",
PdfFont.CreateStandardFont(PdfStandardFont.Helvetica, 10));
footer.HorizontalAlign = PdfTextHorizontalAlign.Center;
converter.Footer.Add(footer);
PdfDocument doc = converter.ConvertHtmlString(html);
doc.Save("report.pdf");
doc.Close();
Thirteen tasks side by side, from hello world to merge, watermarks, forms, text extraction, images, signatures, PDF/A and an ASP.NET Core endpoint, each built and checked, are in the migration guide on GitHub.
Map IronPDF APIs to SelectPdf.
SelectPdf margins are in points (1 mm is about 2.83 pt) and delays in seconds.
| IronPDF | SelectPdf |
|---|---|
ChromePdfRenderer | HtmlToPdf |
RenderHtmlAsPdf(html) / RenderUrlAsPdf(url) | ConvertHtmlString(html) / ConvertUrl(url) |
RenderingOptions | Options |
MarginTop = 20 (mm) | MarginTop = 57 (pt) |
WaitFor.RenderDelay(2000) | ConversionDelay = 2 |
TextHeader, HtmlHeader (and footers) | Header / Footer with PdfTextSection or PdfHtmlSection |
{page}, {total-pages} | {page_number}, {total_pages} |
PdfDocument.FromFile / SaveAs | new PdfDocument(path) / Save |
PdfDocument.Merge | Append |
ApplyWatermark | a page template with a PdfTextElement |
Form.FindFormField | PdfFormManager |
ExtractAllText | PdfToText |
RasterizeToImageFiles | PdfRasterizer |
PdfSignature + Sign | PdfDigitalSignatureElement |
SaveAsPdfA | ConvertToPdfA |
The complete mapping, with every option, is in the migration guide; every class is in the documentation.
IronPDF and SelectPdf pricing.
Both sell perpetual licenses with one year of updates. Each situation is priced with the cheapest published license that covers it; prices read on 2026-10-16.
| Situation | SelectPdf | IronPDF |
|---|---|---|
| 1 developer, internal application | Single Developer, USD 499 | Lite, USD 999 |
| 1 developer, SaaS or software sold to customers | Single Developer OEM, USD 799 | Lite + OEM Redistribution add-on, USD 2,998 |
| 5 developers, internal | 5-Developers, USD 799 | Professional (up to 10), USD 2,399 (USD 2,999 from November 1, 2026) |
| Unlimited developers, SaaS or redistributed | Enterprise OEM, USD 1,599 | Unlimited + OEM Redistribution add-on, USD 6,798 (USD 7,998 from November 1, 2026) |
From ironpdf.com/licensing and SelectPdf pricing. After the first year, renewing updates and support is optional with both: IronPDF's renewal is USD 599 a year for Lite. Iron Software has announced higher Professional and Unlimited prices from November 1, 2026; check both pages for current terms before buying. One SelectPdf license covers SelectPdf.Universal and the classic Windows library.
The full measurement.
IronPDF 2026.10.3 and SelectPdf.Universal 26.5.0 on every axis of the 2026-10-15 run, on one machine under Windows and Linux, generated from the raw data. The method, per-page numbers and eight other .NET PDF libraries are on the results page; the harness is open source, so every number can be re-run.
| IronPDF | SelectPdf | |
|---|---|---|
| HTML to PDF, geometric mean of 18 page medians, ms (Windows) | 186 | 212 |
| Pages converted faster than the other library (Windows) | 14 of 18 | 4 of 18 |
| Cold start, ms (Windows) | 657 | 714 |
| Throughput, conversions/min, 1 / 4 / 8 at once, sync (Windows) | 480 / 1,485 / 1,735 | 353 / 948 / 1,078 |
| Throughput, conversions/min, 1 / 4 / 8 at once, async (Windows) | 447 / 1,456 / 1,705 | 323 / 926 / 1,158 |
| Memory, one page / 8 at once, MB (Windows) | 244 / 788 | 205 / 467 |
| Memory over 1,000 conversions, MB (Windows) | 226 → 630, 0 failures | 140 → 156, 0 failures |
| Page that never loads: gives up after, s (Windows) | 66 | 60 |
| Parallel output equals sequential (Windows) | 32 / 32 | 32 / 32 |
| HTML to PDF, geometric mean of 18 page medians, ms (Linux) | 169 | 134 |
| Pages converted faster than the other library (Linux) | 4 of 18 | 14 of 18 |
| Cold start, ms (Linux) | 1,090 | 745 |
| Throughput, conversions/min, 1 / 4 / 8 at once, sync (Linux) | 453 / 1,332 / 1,520 | 619 / 1,929 / 2,597 |
| Throughput, conversions/min, 1 / 4 / 8 at once, async (Linux) | 468 / 1,231 / 1,704 | 603 / 1,872 / 2,639 |
| Memory, one page / 8 at once, MB (Linux) | 730 / 1,322 | 462 / 727 |
| Memory over 1,000 conversions, MB (Linux) | 451 → 1,076, 0 failures | 369 → 389, 0 failures |
| Page that never loads: gives up after, s (Linux) | 66 | 60 |
| Parallel output equals sequential (Linux) | 31 / 32 | 32 / 32 |
| Content checks passed (Windows) | 41 / 48 | 46 / 48 |
| Content checks passed (Linux) | 41 / 48 | 46 / 48 |
| Fidelity vs Chrome, mean SSIM (Windows) | 0.928 | 0.984 |
| PDF/A, PDF/UA, PDF/X: levels produced / valid (of 17) | 14 / 5 | 17 / 17 |
| Tagged structure checks | 42 / 112 | 112 / 112 |
| Text extraction, lowest F1 | 0.96 | 0.97 |
| Search | not supported | supported |
| PDF to image | supported | supported |
| Word to PDF | supported | supported |
| Redaction | supported | supported |
| Merge | supported | supported |
| Split | supported | supported |
| Watermark | supported | supported |
| Digital signature | supported | supported |
| Form filling | supported | supported |
| ZUGFeRD / Factur-X | supported | supported |
| Docker, minimal image (Linux) | runs as root only, 206 MB | runs, 270 MB |
| Docker, vendor-documented image (Linux) | runs, 239 MB | not needed (the minimal image runs) |
| Publish size win-x64 / linux-x64, MB | 321.3 / 314.6 | 477.0 / 449.6 |
Linux, Docker and ARM64.
The engine package bundles the Chromium libraries, so a Docker image built from the official .NET images needs no apt-get lines and no installation settings, and it runs as root or as a non-root user. Linux x64 and ARM64 each have their own package; Linux needs glibc 2.30 or later (Debian 11+, Ubuntu 20.04+, RHEL 9+). On Alpine, the conversions run in the SelectPdf engine container instead.
Step by step: HTML to PDF in Docker on Linux. Both libraries' Dockerfiles are side by side in the C# PDF libraries comparison.
Questions, answered.
Something else? Write to support@selectpdf.com with your settings and, if you can, the HTML.