EO.Pdf vs IronPDF: Technical Comparison Guide
When .NET developers look at PDF generation libraries, EO.Pdf stands out as a commercial option with Chromium-based rendering capabilities. However, its large 126MB package size, legacy Internet Explorer migration issues, and static global configuration approach lead many teams to consider alternatives. IronPDF offers a refined Chromium implementation with instance-based, thread-safe configuration and true cross-platform support.
This comparison reviews both libraries across technically relevant aspects to assist professional developers and architects in making informed decisions for their .NET PDF needs.
Understanding EO.Pdf
EO.Pdf is a commercial PDF library priced at $799 per developer license, featuring Chromium-based rendering for high-quality PDF generation. The library is built on a custom engine, having transitioned from its original Internet Explorer rendering foundation to a Chromium-based system.
Despite this update, EO.Pdf's shift to Chromium has introduced compatibility issues due to its legacy baggage from the Internet Explorer era. The library includes its own Chromium engine, resulting in a significant 126MB deployment footprint that increases Docker image sizes, slows CI/CD pipelines, and raises infrastructure costs.
Additionally, while EO.Pdf markets itself as a cross-platform tool, its performance and ease-of-use are primarily Windows-focused, with Linux support often described as secondary. The library uses static HtmlToPdf.Options for configuration, which creates thread-safety concerns in multi-tenant web applications.
Understanding IronPDF
IronPDF is a .NET PDF library designed for modern .NET environments with an optimized Chromium packaging approach resulting in a smaller footprint (approximately 50MB). The library provides equal support for all platforms rather than favoring Windows, making it suitable for applications deployed in diverse environments.
IronPDF uses instance-based configuration through ChromePdfRenderer objects, ensuring thread-safe operation in concurrent scenarios. Each renderer instance maintains its own RenderingOptions, isolating configuration from other operations.
Architecture and Configuration Comparison
The fundamental architectural difference between these .NET PDF libraries lies in their configuration approach and deployment characteristics.
| Aspect | EO.Pdf | IronPDF |
|---|---|---|
| Package Size | 126MB | ~50MB (optimized) |
| Legacy Issues | IE migration baggage | Clean, modern codebase |
| Platform Support | Windows-focused | True cross-platform |
| Configuration | Static/global | Instance-based, thread-safe |
| Price | $799/developer | Competitive pricing |
| API Design | Mixed (HtmlToPdf + ACM) | Unified, consistent |
| Documentation | Limited | Thorough tutorials |
| Modern .NET | .NET Standard | .NET 6/7/8/9+ native |
| Async Support | Limited | Full async/await |
The configuration model represents a key distinction. EO.Pdf's static HtmlToPdf.Options affects all conversions globally, creating race conditions in multi-threaded applications. IronPDF's instance-based approach ensures isolated configuration per renderer.
Code Comparison: Common PDF Operations
HTML to PDF Conversion
Converting HTML content to PDF demonstrates the fundamental API differences.
EO.Pdf:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
HtmlToPdf.ConvertHtml(html, "output.pdf");
Console.WriteLine("PDF created successfully!");
}
}// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
HtmlToPdf.ConvertHtml(html, "output.pdf");
Console.WriteLine("PDF created successfully!");
}
}IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF generated from HTML.</p></body></html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}EO.Pdf uses a static HtmlToPdf.ConvertHtml() method that directly saves to a file path. IronPDF uses a two-step approach: RenderHtmlAsPdf() returns a PdfDocument object that can be further manipulated before calling SaveAs(). This two-step pattern provides more flexibility for post-processing operations like merging, adding watermarks, or applying security settings.
For advanced HTML rendering options, explore the HTML to PDF conversion guide.
URL to PDF Conversion
Capturing web pages as PDF documents shows similar API patterns.
EO.Pdf:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
HtmlToPdf.ConvertUrl(url, "webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
HtmlToPdf.ConvertUrl(url, "webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
string url = "https://www.example.com";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}Both libraries provide URL-to-PDF capability, with EO.Pdf using static ConvertUrl() and IronPDF using instance-based RenderUrlAsPdf(). The same thread-safety distinction applies.
Learn more about URL rendering in the URL to PDF documentation.
PDF Merging Operations
Combining multiple PDF documents demonstrates different object model approaches.
EO.Pdf:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument doc1 = new PdfDocument("file1.pdf");
PdfDocument doc2 = new PdfDocument("file2.pdf");
PdfDocument mergedDoc = new PdfDocument();
mergedDoc.Append(doc1);
mergedDoc.Append(doc2);
mergedDoc.Save("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
PdfDocument doc1 = new PdfDocument("file1.pdf");
PdfDocument doc2 = new PdfDocument("file2.pdf");
PdfDocument mergedDoc = new PdfDocument();
mergedDoc.Append(doc1);
mergedDoc.Append(doc2);
mergedDoc.Save("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 });
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}EO.Pdf loads documents via constructors (new PdfDocument(path)) and uses Append() to add documents to an empty container. IronPDF uses static factory methods (PdfDocument.FromFile()) and a static PdfDocument.Merge() method that accepts a collection and returns the merged result.
Explore additional merge operations in the PDF merging documentation.
Custom Page Settings
Configuring page size and margins demonstrates the configuration model differences.
EO.Pdf:
// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
HtmlToPdfOptions options = new HtmlToPdfOptions();
options.PageSize = PdfPageSizes.A4;
options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertUrl("file:///C:/input.html", "output.pdf", options);
Console.WriteLine("PDF with custom settings created.");
}
}// NuGet: Install-Package EO.Pdf
using EO.Pdf;
using System;
class Program
{
static void Main()
{
HtmlToPdfOptions options = new HtmlToPdfOptions();
options.PageSize = PdfPageSizes.A4;
options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertUrl("file:///C:/input.html", "output.pdf", options);
Console.WriteLine("PDF with custom settings created.");
}
}IronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlFileAsPdf("C:/input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF with custom settings created.");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlFileAsPdf("C:/input.html");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF with custom settings created.");
}
}EO.Pdf uses HtmlToPdfOptions with OutputArea specified as a RectangleF in inches. IronPDF uses individual margin properties (MarginTop, MarginBottom, MarginLeft, MarginRight) in millimeters on the RenderingOptions object. The unit difference requires conversion: inches × 25.4 = millimeters.
Method Mapping Reference
For developers evaluating EO.Pdf migration or comparing capabilities, this mapping shows equivalent operations:
Core Operations
| EO.Pdf | IronPDF |
|---|---|
HtmlToPdf.ConvertHtml(html, path) | renderer.RenderHtmlAsPdf(html) then SaveAs() |
HtmlToPdf.ConvertUrl(url, path) | renderer.RenderUrlAsPdf(url) then SaveAs() |
HtmlToPdf.Options.PageSize | renderer.RenderingOptions.PaperSize |
HtmlToPdf.Options.OutputArea | MarginTop/Bottom/Left/Right |
new PdfDocument(path) | PdfDocument.FromFile(path) |
doc.Append(other) | PdfDocument.Merge(doc1, doc2) |
doc.Save(path) | pdf.SaveAs(path) |
Configuration Mapping
| EO.Pdf Option | IronPDF RenderingOptions |
|---|---|
Options.PageSize = PdfPageSizes.A4 | PaperSize = PdfPaperSize.A4 |
Options.PageSize = PdfPageSizes.Letter | PaperSize = PdfPaperSize.Letter |
Options.OutputArea (RectangleF) | MarginTop, MarginBottom, etc. |
Options.BaseUrl | BaseUrl |
Class Mapping
| EO.Pdf Class | IronPDF Equivalent |
|---|---|
HtmlToPdf | ChromePdfRenderer |
PdfDocument | PdfDocument |
HtmlToPdfOptions | ChromePdfRenderOptions |
AcmRender | Not needed |
AcmText | HTML <span>, <p> |
AcmBlock | HTML <div> |
Feature Comparison Summary
| Feature | EO.Pdf | IronPDF |
|---|---|---|
| HTML to PDF | ✅ | ✅ |
| URL to PDF | ✅ | ✅ |
| PDF merging | ✅ | ✅ |
| Page manipulation | ✅ | ✅ |
| Headers/footers | ✅ | ✅ (HTML-based) |
| Security/encryption | ✅ | ✅ |
| Form fields | ✅ | ✅ |
| Watermarks | ✅ | ✅ |
| ACM rendering | ✅ | HTML/CSS (no ACM) |
| Thread-safe config | ❌ (static) | ✅ (instance) |
| Cross-platform | Limited | Supported |
The Thread-Safety Problem
EO.Pdf's static configuration creates a fundamental problem in multi-threaded applications:
// EO.Pdf - DANGER: Static options affect ALL threads!
HtmlToPdf.Options.PageSize = PdfPageSizes.A4;
HtmlToPdf.Options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertHtml(html, "output.pdf");// EO.Pdf - DANGER: Static options affect ALL threads!
HtmlToPdf.Options.PageSize = PdfPageSizes.A4;
HtmlToPdf.Options.OutputArea = new RectangleF(0.5f, 0.5f, 7.5f, 10.5f);
HtmlToPdf.ConvertHtml(html, "output.pdf");In a web application handling multiple concurrent requests, one request's configuration affects all other requests. This creates race conditions where PDFs may be generated with unexpected settings.
IronPDF's instance-based approach eliminates this problem:
// IronPDF - Thread-safe, isolated options per renderer instance
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 12.7;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");// IronPDF - Thread-safe, isolated options per renderer instance
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 12.7;
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");Each ChromePdfRenderer instance maintains its own configuration, ensuring isolation in concurrent scenarios.
When Teams Consider Moving from EO.Pdf to IronPDF
Development teams evaluate transitioning from EO.Pdf to IronPDF for several reasons:
Package Size Optimization: EO.Pdf's 126MB package size inflates Docker images, slows CI/CD pipelines, and increases infrastructure costs. IronPDF's optimized packaging (~50MB) provides significant deployment efficiency improvements.
Thread-Safety Requirements: Multi-tenant web applications require isolated configuration per request. EO.Pdf's static HtmlToPdf.Options creates race conditions that IronPDF's instance-based approach eliminates.
Cross-Platform Deployment: Applications targeting Linux or macOS environments encounter limitations with EO.Pdf's Windows-centric design. IronPDF provides true cross-platform support with consistent behavior.
Legacy Baggage Avoidance: EO.Pdf's migration from Internet Explorer to Chromium introduced compatibility issues. IronPDF's clean, modern codebase avoids this technical debt.
Modern .NET Support: Applications targeting .NET 6/7/8/9+ benefit from IronPDF's native support versus EO.Pdf's .NET Standard targeting.
ACM Migration: Teams using EO.Pdf's Advanced Content Model (AcmRender, AcmText, AcmBlock) find IronPDF's HTML/CSS approach simpler and more maintainable.
Strengths and Considerations
EO.Pdf Strengths
- Chromium Rendering: High-quality W3C-compliant output
- Established Library: Proven in production environments
- Single-Step Conversion: Direct file output via
ConvertHtml()
EO.Pdf Considerations
- Massive Package Size: 126MB deployment footprint
- Legacy IE Baggage: Compatibility issues from migration
- Static Configuration: Thread-safety problems in multi-tenant apps
- Windows-Centric: Limited Linux/macOS support
- Price Point: $799 per developer license
- Limited Documentation: Fewer tutorials and examples
IronPDF Strengths
- Optimized Footprint: ~50MB package size (50% smaller)
- True Cross-Platform: Windows, Linux, macOS, Docker
- Thread-Safe Configuration: Instance-based renderer options
- Modern API: Consistent, intuitive method names
- Active Development: Regular updates and security patches
- Comprehensive Resources: Extensive tutorials and documentation
IronPDF Considerations
- Two-Step Save: Render returns
PdfDocument, then callSaveAs() - Unit Differences: Uses millimeters for margins (vs EO.Pdf inches)
Conclusion
EO.Pdf and IronPDF both provide Chromium-based PDF generation for .NET developers, but they represent different architectural approaches. EO.Pdf offers established functionality but carries a 126MB package size, legacy Internet Explorer migration baggage, and thread-unsafe static configuration.
IronPDF provides a modern alternative with optimized packaging, true cross-platform support, and instance-based thread-safe configuration. For teams requiring deployment efficiency, concurrent operation safety, or cross-platform targeting, IronPDF addresses these specific requirements.
As organizations plan for .NET 10, C# 14, and application development through 2026, the choice depends on specific priorities. Teams with existing EO.Pdf implementations in single-threaded Windows environments may continue finding value there. For modern multi-tenant applications, containerized deployments, or cross-platform requirements, IronPDF provides a more suitable approach.
Start evaluating IronPDF with a free trial and explore the comprehensive documentation to assess fit for your specific requirements.