EggPdf 1.1.4
See the version list below for details.
dotnet add package EggPdf --version 1.1.4
NuGet\Install-Package EggPdf -Version 1.1.4
<PackageReference Include="EggPdf" Version="1.1.4" />
<PackageVersion Include="EggPdf" Version="1.1.4" />
<PackageReference Include="EggPdf" />
paket add EggPdf --version 1.1.4
#r "nuget: EggPdf, 1.1.4"
#:package EggPdf@1.1.4
#addin nuget:?package=EggPdf&version=1.1.4
#tool nuget:?package=EggPdf&version=1.1.4
EggPdf
Pure C# HTML/CSS to PDF rendering engine. Zero dependencies. Chrome-quality output.
Write normal HTML and CSS. Get a perfect PDF. No WebKit, no Chromium, no native binaries.
Why EggPdf?
| Feature | EggPdf | SelectPdf | wkhtmltopdf | Puppeteer |
|---|---|---|---|---|
| Pure C# | Yes | No | No | No |
| Dependencies | Zero | ~50MB WebKit | ~40MB Qt | ~300MB Chrome |
| .NET Framework | 4.6.2+ | Limited | N/A | N/A |
| .NET Core/5+ | All | Some | N/A | Yes |
| CSS Flexbox | Yes | Yes | No | Yes |
| CSS Grid | Yes | Yes | No | Yes |
| SVG Support | Yes (vector) | Yes | Partial | Yes |
| PDF/A | Yes | No | No | No |
| PDF/UA | Yes | No | No | No |
| Tagged PDF | Yes | No | No | No |
| Digital Signatures | Yes | No | No | No |
| License | MIT | Commercial | LGPL | Apache 2 |
Quick Start
dotnet add package EggPdf
// One-liner
byte[] pdf = await EggPdf.HtmlToPdf.RenderAsync("<h1>Hello World</h1>");
File.WriteAllBytes("output.pdf", pdf);
Standard Usage
var converter = new HtmlToPdfConverter(new PdfOptions
{
PageSize = PageSize.A4,
Orientation = PageOrientation.Portrait,
Margins = new PageMargins(top: 20, right: 15, bottom: 20, left: 15, unit: Unit.Mm),
DefaultFont = "Arial",
Title = "My Document"
});
// To byte[]
byte[] pdf = await converter.RenderAsync(htmlString);
// To file
await converter.RenderToFileAsync(htmlString, "report.pdf");
// To HTTP response (streaming, no buffering)
await converter.RenderAsync(htmlString, Response.Body, HttpContext.RequestAborted);
ASP.NET Core Integration
dotnet add package EggPdf.AspNetCore
// DI Registration
services.AddEggPdf(options =>
{
options.PageSize = PageSize.A4;
options.DefaultFont = "Arial";
});
// Controller
[HttpGet("invoice/{id}/pdf")]
public async Task<IActionResult> GetInvoice(int id)
{
var model = await _invoiceService.GetAsync(id);
string html = await _viewRenderer.RenderAsync("Invoice", model);
return new PdfResult(html) { FileName = $"invoice-{id}.pdf" };
}
Razor Templates
dotnet add package EggPdf.Razor
services.AddEggPdfRazor();
// Render .cshtml template directly to PDF
public class InvoiceService(IRazorToPdfConverter pdf)
{
public async Task<byte[]> Generate(InvoiceModel model)
=> await pdf.RenderViewAsync("Invoice", model);
}
Features
HTML & CSS
- Full HTML5 parsing (WHATWG spec-compliant)
- CSS 2.1 complete + CSS3 (Flexbox, Grid, Multi-column)
- CSS Custom Properties (
var()) @media printsupport@font-facewith WOFF/WOFF2- SVG rendering (vector output, not rasterized)
- All image formats (JPEG, PNG, GIF, WebP, SVG, Base64)
- PDF 1.4 / 1.5 / 1.7 / 2.0
- Clickable hyperlinks and internal links
- Auto-generated bookmarks from headings
- Table of contents with page numbers
- Running headers/footers
- Page numbers (Page X of Y)
- Repeating table headers across pages
- Mixed page orientations (portrait + landscape)
- Watermarks
Typography
- TrueType/OpenType font embedding with subsetting
- Font fallback chain
- CJK support (Chinese, Japanese, Korean)
- Vietnamese, Thai, Arabic, Hebrew
- Emoji rendering (color emoji)
- Automatic hyphenation
- Variable font support
Business
- PDF/A (archival: 1b, 2b, 3b)
- PDF/UA (accessibility)
- Digital signatures (PAdES)
- AcroForm fields
- QR codes and barcodes
- File attachments (ZUGFeRD/Factur-X e-invoicing)
- PDF merging
- AES-256 encryption
Performance
- Streaming output (constant memory for large documents)
- Font caching across renders
- Thread-safe converter (one instance per app)
- Streaming table layout for 10,000+ row tables
| Scenario | Mean | Memory |
|---|---|---|
| Simple page (h1 + p) | 13 µs | 20 KB |
| Invoice (table + styles) | 86 µs | 85 KB |
| Large table (100 rows) | 1.2 ms | 939 KB |
Benchmarks run on every PR (results posted as comment) and on every merge to main (artifacts uploaded). Targets: simple < 50ms, invoice < 100ms, large table < 5s.
Target Frameworks
| Target | Coverage |
|---|---|
netstandard2.0 |
.NET Framework 4.6.2+, .NET Core 2.0+, Mono, Xamarin, Unity |
netstandard2.1 |
.NET Core 3.0+ |
net6.0 |
.NET 6+ |
net8.0 |
.NET 8+ |
net9.0 |
.NET 9+ |
net10.0 |
.NET 10+ |
Use EggPdf Your Way
NuGet (for .NET developers)
| Package | Description | Dependencies |
|---|---|---|
| EggPdf | Core library | None |
| EggPdf.Razor | Razor template integration | ASP.NET Core |
| EggPdf.AspNetCore | ASP.NET Core middleware | ASP.NET Core |
Docker (for any language / DevOps)
# REST API service (with Web UI)
docker run -p 8080:8080 eggspot/eggpdf:latest
# Open http://localhost:8080 for Web UI, or call REST API from any language
# CLI (convert files)
docker run -v $(pwd):/work eggspot/eggpdf:latest eggpdf /work/input.html -o /work/output.pdf
CLI Binary (standalone, no .NET needed)
Download a single executable for your platform -- no installation required:
| Platform | Download |
|---|---|
| Windows x64 | eggpdf-win-x64.exe |
| Windows ARM64 | eggpdf-win-arm64.exe |
| Linux x64 | eggpdf-linux-x64 |
| Linux ARM64 | eggpdf-linux-arm64 |
| macOS x64 (Intel) | eggpdf-osx-x64 |
| macOS ARM64 (Apple Silicon) | eggpdf-osx-arm64 |
./eggpdf input.html -o output.pdf
./eggpdf input.html -o output.png --format png
./eggpdf input.html --watch # live reload
./eggpdf --serve # start REST API server
Web UI (for anyone)
Open http://localhost:8080 after starting the Docker service. Paste HTML, get PDF. No coding required.
Documentation
See the Wiki for full documentation:
- Getting Started
- Configuration
- Page Layout & CSS
- Headers, Footers & Page Numbers
- Images & SVG
- Tables
- Fonts & Typography
- PDF Features
- Performance
- API Reference
Contributing
Contributions are welcome! We follow strict TDD — write the test before the code:
- Fork the repository
- Create a feature branch:
git checkout -b feat/my-feature - Write the failing test first — run it, confirm it fails
- Write minimal code to make the test pass
- Run the test — if it fails, fix code and run again; repeat until it passes
- Run ALL tests — fix any regressions and repeat until the full suite passes
- Check performance if touching hot paths
- Commit with conventional prefixes:
feat:,fix:,perf:,test: - Push and create a PR
See CLAUDE.md for detailed development guidelines.
Sponsoring
EggPdf is free and open source. If you find it useful, please consider sponsoring:
Your sponsorship helps us:
- Maintain and improve the library
- Add new CSS features and PDF capabilities
- Keep the documentation up to date
- Respond to issues and PRs
License
MIT License. See LICENSE for details.
Copyright (c) 2025 Eggspot
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
| .NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen40 was computed. tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
-
net10.0
- No dependencies.
-
net6.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.2.0 | 3 | 4/16/2026 |
| 1.1.4 | 36 | 4/15/2026 |
| 1.1.3 | 88 | 4/7/2026 |
| 1.1.2 | 84 | 4/7/2026 |
| 1.1.1 | 83 | 4/7/2026 |
| 1.1.0 | 78 | 4/7/2026 |
| 1.0.2 | 79 | 4/7/2026 |
| 1.0.1 | 80 | 4/7/2026 |
| 1.0.0 | 82 | 4/7/2026 |
| 0.5.0 | 92 | 4/5/2026 |
| 0.4.0 | 80 | 4/5/2026 |
| 0.3.1 | 86 | 4/5/2026 |
| 0.3.0 | 96 | 4/5/2026 |
| 0.2.0 | 81 | 4/5/2026 |
| 0.1.6 | 91 | 4/5/2026 |
| 0.1.5 | 79 | 4/5/2026 |
| 0.1.4 | 84 | 4/5/2026 |
| 0.1.3 | 83 | 4/5/2026 |
| 0.1.2 | 84 | 4/3/2026 |
| 0.1.1 | 83 | 4/3/2026 |