IronPDF alternative for .NET
IronPDF alternative for .NET. Compare PuppeteerSharp, Playwright .NET and QuestPDF on licensing, then call a Chrome PDF API from C# with HttpClient.
IronPDF is a commercial .NET library that renders HTML to PDF with an embedded Chrome engine. It also adds editing features like merging, stamping, and signing.
It's capable, but two things push teams to look elsewhere. One is per-developer licensing, and the other is shipping Chromium with your app. This page compares the main options and shows a plain HttpClient approach.
Quick answer. POST your HTML to the API with a Bearer key and save the bytes. No Chromium in your app and no license per developer.
var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new("Bearer", Environment.GetEnvironmentVariable("HTML_PDF_KEY"));
var res = await http.PostAsJsonAsync("https://html-pdf.com/v1/pdf", new { html = "<h1>Hello</h1>" });
await File.WriteAllBytesAsync("out.pdf", await res.Content.ReadAsByteArrayAsync());
IronPDF licensing
This section shows what IronPDF costs and how the price scales. It is sold as perpetual licenses tiered by developers, projects, and locations, as listed on the IronPDF licensing page in October 2026.
| Tier | Developers / projects / locations | Listed price |
|---|---|---|
| Lite | 1 / 1 / 1 | $999 |
| Plus | 3 / 3 / 3 | $1,499 |
| Professional | 10 / 10 / 10 | $2,399 (shown as discounted) |
| Unlimited | Unlimited | $4,799 (shown as discounted) |
Licenses include one year of support and updates. Enterprise terms like redistribution are quoted separately, and prices change, so check the page before you budget.
The key point is that cost scales with team size and deployment locations, not with how many PDFs you make.
Deployment: Chromium comes with you
This section explains the deployment work that comes with an embedded browser. IronPDF's Chrome renderer ships native Chromium binaries, which adds a lot to your publish output and container images.
On Linux and Docker, IronPDF recommends the IronPdf.Linux package and installing Chrome's system libraries in your Dockerfile. Their docs suggest setting LinuxAndDockerDependenciesAutoConfig to false when you install them yourself.
On Azure, the right package depends on the target. IronPDF documents different setups for App Service on Linux, containers, and Functions, and some lower or sandboxed plans don't allow running Chrome.
None of this is unique to IronPDF. Any library that embeds Chrome has the same trade-off.
.NET alternatives
Here are the main alternatives and what each one is good at.
PuppeteerSharp is a free (MIT) port of Puppeteer. It downloads or uses a Chrome binary and calls page.PdfAsync(). You get the same Chrome output and the same deployment work, with no license fee.
Playwright for .NET (Apache 2.0) is similar and also uses page.PdfAsync() in Chromium. Its Docker images include browser dependencies, which simplifies containers.
QuestPDF takes a different approach. You build documents in C# with a fluent API instead of HTML. There's no browser, so it's fast and small.
QuestPDF is free under its Community License for individuals and businesses under USD 1M annual gross revenue (public-sector entities and publicly traded companies aren't eligible). Larger companies need a Professional or Enterprise license. See QuestPDF licensing. It's not a fit if your templates are already HTML.
A hosted Chrome API moves rendering out of your app entirely.
Comparison
This table puts the options side by side.
| IronPDF | PuppeteerSharp | Playwright .NET | QuestPDF | html-pdf.com | |
|---|---|---|---|---|---|
| Input | HTML, URL | HTML, URL | HTML, URL | C# code | HTML, URL |
| Engine | Embedded Chrome | Chrome | Chromium | Own layout | Hosted Chromium |
| License | Commercial, per developer | MIT | Apache 2.0 | Community / commercial | Pay per page |
| Chromium in your deploy | Yes | Yes | Yes | No | No |
| PDF editing (merge, sign) | Yes | No | No | Limited | No |
| Works offline | Yes | Yes | Yes | Yes | No |
When IronPDF is the better choice
IronPDF is still the right pick in some situations.
- You need PDF editing too, such as merging, splitting, forms, digital signatures and text extraction, all in one supported library.
- Rendering must run on-premises or air-gapped.
- You want a vendor with commercial support and a single NuGet package.
Calling a Chrome API from C#
This is a complete example that renders an invoice with page numbers and saves it to disk.
using System.Net.Http.Headers;
using System.Net.Http.Json;
var http = new HttpClient { Timeout = TimeSpan.FromSeconds(40) };
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("HTML_PDF_KEY"));
var body = new
{
html = "<h1>Invoice #042</h1><p style=\"display:flex;justify-content:space-between\"><span>Total</span><span>$120.00</span></p>",
format = "A4",
margin = new { top = "15mm", right = "12mm", bottom = "20mm", left = "12mm" },
footer_html = "<div style=\"font-size:9px;width:100%;text-align:center\">Page <span class=\"pageNumber\"></span> of <span class=\"totalPages\"></span></div>",
max_pages = 20
};
using var response = await http.PostAsJsonAsync("https://html-pdf.com/v1/pdf", body);
if (!response.IsSuccessStatusCode)
throw new Exception($"PDF failed ({(int)response.StatusCode}): {await response.Content.ReadAsStringAsync()}");
await File.WriteAllBytesAsync("invoice.pdf", await response.Content.ReadAsByteArrayAsync());
The anonymous object's property names are serialized as written, so footer_html and max_pages match the API.
In ASP.NET Core, register the client with IHttpClientFactory and return the bytes with File(bytes, "application/pdf", "invoice.pdf"). Razor views rendered to a string work as the html input.
Mapping IronPDF options
Most IronPDF rendering options have a direct equivalent.
IronPDF (ChromePdfRenderer.RenderingOptions) |
html-pdf.com |
|---|---|
PaperSize = PdfPaperSize.A4 |
format = "A4" |
PaperOrientation = Landscape |
landscape = true |
MarginTop etc. (mm) |
margin = new { top = "15mm", ... } |
HtmlFooter with {page} / {total-pages} |
footer_html with pageNumber / totalPages classes |
EnableJavaScript + WaitFor.RenderDelay(ms) |
wait_delay (seconds) or wait_for_expression |
CssMediaType = Print |
media = "print" |
RenderUrlAsPdf(url) |
url = "https://..." (public pages) |
Or skip the server
If you only need HTML to PDF, a hosted API removes the deployment work. html-pdf.com is an HTML/URL to PDF API on headless Chromium. POST https://html-pdf.com/v1/pdf with a Bearer key returns a PDF with selectable text as binary, base64, or a 24-hour link.
There's no Chromium in your images and no per-developer seats.
1 credit = 1 PDF page. You get 100 free credits once, then packs from $10 for 1,000 pages to $250 for 50,000. Purchased credits never expire. There's also a remote MCP server for AI assistants.
Get a free API key · API docs · HTML to PDF in C# · Page breaks
FAQ
Is there a free IronPDF alternative?
Yes. PuppeteerSharp (MIT) and Playwright for .NET (Apache 2.0) are free, but you still ship and maintain Chromium. html-pdf.com gives you 100 free credits once with no card, and 1 credit = 1 PDF page.
How do I convert HTML to PDF in C# without IronPDF?
Send your HTML to https://html-pdf.com/v1/pdf with HttpClient.PostAsJsonAsync and a Bearer key, then write the response bytes to a file. The example above shows a full invoice with page numbers.
Does it support headers, footers and page numbers?
Yes. Use header_html and footer_html with Chrome's pageNumber and totalPages classes, and leave enough margin for them. Chromium also supports CSS @page margin boxes (Chrome 131+).
Do html-pdf.com credits expire?
No. Purchased credits never expire, packs range from $10 for 1,000 pages to $250 for 50,000, and failed renders cost nothing.
