How to Migrate from ExpertPdf to IronPDF in C#
ExpertPdf is a commercial HTML-to-PDF converter for .NET that has served developers for many years. However, ExpertPdf faces significant challenges in today's rapidly evolving development landscape: documentation frozen since 2018, reliance on a legacy Chrome version that misses modern CSS3 features, premium pricing ranging from $550-$1,200 for outdated technology, and a fragmented product suite requiring separate licenses for merging, security, and splitting. This comprehensive guide provides a step-by-step migration path from ExpertPdf to IronPDF—a modern .NET PDF library with the latest Chromium rendering, monthly updates, and an all-in-one package architecture.
Why Migrate from ExpertPdf to IronPDF?
ExpertPdf presents several challenges that drive development teams to evaluate modern alternatives. Understanding these issues is essential for planning your migration strategy.
The ExpertPdf Problems
Documentation Frozen Since 2018: ExpertPdf's documentation hasn't been updated in over 6 years. Finding current information, examples, and best practices is increasingly difficult as the .NET ecosystem evolves.
Outdated Chrome Version: ExpertPdf relies on a legacy version of Chrome for rendering. Modern CSS3 features (Flexbox, Grid, CSS Variables) may not render correctly, and security patches are not applied.
Premium Pricing for Legacy Tech: At $550-$1,200 per license, ExpertPdf charges premium prices while delivering outdated rendering technology.
Fragmented Product Suite: ExpertPdf sells separate packages for different functions—HtmlToPdf Converter, PDF Merger, PDF Security, PDF Splitter, and PDF to Image—each requiring separate licensing.
- Limited Modern .NET Support: While ExpertPdf has .NET Core packages, they lag behind modern .NET versions and practices.
Architecture Comparison
| Aspect | ExpertPdf | IronPDF |
|---|---|---|
| Documentation | Frozen since 2018 | Continuously updated |
| Rendering Engine | Legacy Chrome | Latest Chromium |
| CSS Support | Limited CSS3 | Full CSS3 (Flexbox, Grid) |
| Price | $550-$1,200 | Competitive pricing |
| Update Frequency | Infrequent | Monthly releases |
| Product Model | Fragmented (5+ DLLs) | All-in-one library |
| Modern .NET | Limited | .NET 6/7/8/9+ native |
| Async Support | Limited | Full async/await |
Key Migration Benefits
- Modern Rendering: Latest Chromium engine for pixel-perfect output
- All-in-One Package: PDF generation, merging, security, extraction in one NuGet
- Active Development: Monthly updates with new features and security patches
- Better Documentation: Comprehensive tutorials and examples
- True Cross-Platform: Windows, Linux, macOS, Docker support
Pre-Migration Preparation
Prerequisites
Ensure your environment meets these requirements:
- .NET Framework 4.6.2+ or .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ or VS Code with C# extension
- NuGet Package Manager access
- IronPDF license key (free trial available at ironpdf.com)
Audit ExpertPdf Usage
Run these commands in your solution directory to identify all ExpertPdf references:
# Find all ExpertPdf references
grep -r "ExpertPdf\|PdfConverter\|PDFMerge\|PdfSecurityManager" --include="*.cs" .
# Check NuGet packages
dotnet list package | grep -i "ExpertPdf"# Find all ExpertPdf references
grep -r "ExpertPdf\|PdfConverter\|PDFMerge\|PdfSecurityManager" --include="*.cs" .
# Check NuGet packages
dotnet list package | grep -i "ExpertPdf"Common ExpertPdf packages to look for:
ExpertPdf.HtmlToPdf- HTML to PDF conversionExpertPdf.PDFMerge- PDF mergingExpertPdf.PDFSecurity- Encryption and passwordsExpertPdf.PDFSplit- PDF splittingExpertPdf.PdfToImage- PDF to image conversion
Understanding the Core Pattern Change
ExpertPdf uses PdfConverter with direct byte-array return methods. IronPDF uses ChromePdfRenderer returning PdfDocument objects that provide additional manipulation capabilities before saving.
Step-by-Step Migration Process
Step 1: Update NuGet Packages
Remove all ExpertPdf packages and install IronPDF:
# Remove all ExpertPdf packages
dotnet remove package ExpertPdf.HtmlToPdf
dotnet remove package ExpertPdf.PDFMerge
dotnet remove package ExpertPdf.PDFSecurity
dotnet remove package ExpertPdf.PDFSplit
dotnet remove package ExpertPdf.PdfToImage
# Install IronPDF (includes all features)
dotnet add package IronPdf# Remove all ExpertPdf packages
dotnet remove package ExpertPdf.HtmlToPdf
dotnet remove package ExpertPdf.PDFMerge
dotnet remove package ExpertPdf.PDFSecurity
dotnet remove package ExpertPdf.PDFSplit
dotnet remove package ExpertPdf.PdfToImage
# Install IronPDF (includes all features)
dotnet add package IronPdfStep 2: Update Namespace References
Replace ExpertPdf namespaces with IronPDF:
// Remove these
using ExpertPdf.HtmlToPdf;
// Add this
using IronPdf;// Remove these
using ExpertPdf.HtmlToPdf;
// Add this
using IronPdf;Step 3: Configure License
ExpertPdf uses per-converter licensing. IronPDF uses a single global license:
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";Complete API Migration Reference
Core Class Mapping
| ExpertPdf Class | IronPDF Equivalent | Notes |
|---|---|---|
PdfConverter | ChromePdfRenderer | Main conversion class |
PdfDocumentOptions | ChromePdfRenderOptions | Via RenderingOptions |
PdfHeaderOptions | TextHeaderFooter or HtmlHeaderFooter | Configurable |
PdfFooterOptions | TextHeaderFooter or HtmlHeaderFooter | Configurable |
PDFMerge | PdfDocument.Merge() | Static method |
Method Mapping
| ExpertPdf Method | IronPDF Method | Notes |
|---|---|---|
pdfConverter.GetPdfBytesFromHtmlString(html) | renderer.RenderHtmlAsPdf(html).BinaryData | |
pdfConverter.GetPdfBytesFromUrl(url) | renderer.RenderUrlAsPdf(url).BinaryData | |
pdfConverter.GetPdfBytesFromHtmlFile(path) | renderer.RenderHtmlFileAsPdf(path).BinaryData | |
pdfConverter.SavePdfFromUrlToFile(url, path) | renderer.RenderUrlAsPdf(url).SaveAs(path) | Two-step |
Options Mapping
| ExpertPdf Option | IronPDF RenderingOptions | Notes |
|---|---|---|
PdfDocumentOptions.PdfPageSize = PdfPageSize.A4 | PaperSize = PdfPaperSize.A4 | |
PdfDocumentOptions.PdfPageOrientation = Portrait | PaperOrientation = PdfPaperOrientation.Portrait | |
PdfDocumentOptions.MarginTop | MarginTop | Same property name |
PdfHeaderOptions.HeaderText | TextHeader.CenterText | |
PdfFooterOptions.FooterText | TextFooter.RightText |
Page Numbering Token Conversion
ExpertPdf and IronPDF use different placeholder syntax for page numbers:
| ExpertPdf | IronPDF |
|---|---|
&p; | {page} |
&P; | {total-pages} |
Code Migration Examples
HTML to PDF Conversion
The fundamental HTML to PDF conversion demonstrates the shift from ExpertPdf's byte-array pattern to IronPDF's document-object approach.
ExpertPdf Implementation:
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;
class Program
{
static void Main()
{
// Create the PDF converter
PdfConverter pdfConverter = new PdfConverter();
// Convert HTML string to PDF
byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");
// Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
Console.WriteLine("PDF created successfully!");
}
}// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;
class Program
{
static void Main()
{
// Create the PDF converter
PdfConverter pdfConverter = new PdfConverter();
// Convert HTML string to PDF
byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");
// Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
Console.WriteLine("PDF created successfully!");
}
}IronPDF Implementation:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
// Save to file
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
// Save to file
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}IronPDF's approach returns a PdfDocument object, enabling additional manipulation (merging, watermarking, security) before saving. For more options, see the HTML to PDF documentation.
URL to PDF with Page Settings
ExpertPdf Implementation:
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;
class Program
{
static void Main()
{
// Create the PDF converter
PdfConverter pdfConverter = new PdfConverter();
// Set page size and orientation
pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;
// Convert URL to PDF
byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");
// Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL created successfully!");
}
}// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;
class Program
{
static void Main()
{
// Create the PDF converter
PdfConverter pdfConverter = new PdfConverter();
// Set page size and orientation
pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;
// Convert URL to PDF
byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");
// Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL created successfully!");
}
}IronPDF Implementation:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Set page size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
// Convert URL to PDF
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
// Save to file
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Set page size and orientation
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;
// Convert URL to PDF
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
// Save to file
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully!");
}
}IronPDF's RenderingOptions provides direct property access for page configuration. For more options, see the URL to PDF documentation.
Headers and Footers with Page Numbers
This example demonstrates the critical difference in header/footer configuration—ExpertPdf uses separate PdfHeaderOptions and PdfFooterOptions classes with &p;/&P; tokens, while IronPDF uses TextHeaderFooter with {page}/{total-pages} placeholders.
ExpertPdf Implementation:
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;
class Program
{
static void Main()
{
// Create the PDF converter
PdfConverter pdfConverter = new PdfConverter();
// Enable header
pdfConverter.PdfHeaderOptions.ShowHeader = true;
pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;
// Enable footer with page numbers
pdfConverter.PdfFooterOptions.ShowFooter = true;
pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;
// Convert HTML file to PDF
byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");
// Save to file
System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);
Console.WriteLine("PDF with headers and footers created successfully!");
}
}// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;
class Program
{
static void Main()
{
// Create the PDF converter
PdfConverter pdfConverter = new PdfConverter();
// Enable header
pdfConverter.PdfHeaderOptions.ShowHeader = true;
pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;
// Enable footer with page numbers
pdfConverter.PdfFooterOptions.ShowFooter = true;
pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;
// Convert HTML file to PDF
byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");
// Save to file
System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);
Console.WriteLine("PDF with headers and footers created successfully!");
}
}IronPDF Implementation:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Configure header
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Document Header",
DrawDividerLine = true
};
// Configure footer with page numbers
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true
};
// Convert HTML file to PDF
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
// Save to file
pdf.SaveAs("output-with-header-footer.pdf");
Console.WriteLine("PDF with headers and footers created successfully!");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Configure header
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Document Header",
DrawDividerLine = true
};
// Configure footer with page numbers
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
RightText = "Page {page} of {total-pages}",
DrawDividerLine = true
};
// Convert HTML file to PDF
var pdf = renderer.RenderHtmlFileAsPdf("input.html");
// Save to file
pdf.SaveAs("output-with-header-footer.pdf");
Console.WriteLine("PDF with headers and footers created successfully!");
}
}IronPDF's TextHeaderFooter provides LeftText, CenterText, and RightText properties with optional divider lines. For HTML-based headers, use HtmlHeaderFooter. For more options, see the headers and footers documentation.
Critical Migration Notes
License Key Location
ExpertPdf uses per-converter licensing. IronPDF uses a single global license set once at startup:
// ExpertPdf - per converter
pdfConverter.LicenseKey = "EXPERTPDF-LICENSE";
// IronPDF - global, set once
IronPdf.License.LicenseKey = "IRONPDF-LICENSE";// ExpertPdf - per converter
pdfConverter.LicenseKey = "EXPERTPDF-LICENSE";
// IronPDF - global, set once
IronPdf.License.LicenseKey = "IRONPDF-LICENSE";Page Numbering Token Conversion
Replace ExpertPdf tokens with IronPDF placeholders:
// ExpertPdf
"Page &p; of &P;"
// IronPDF
"Page {page} of {total-pages}"// ExpertPdf
"Page &p; of &P;"
// IronPDF
"Page {page} of {total-pages}"Fragmented Packages Consolidated
ExpertPdf's separate packages (PDFMerge, PDFSecurity, PDFSplit, PdfToImage) are all included in IronPDF's single package:
// ExpertPdf - requires separate PDFMerge package
var merger = new PdfMerge();
merger.AppendPDFFile("file1.pdf");
merger.AppendPDFFile("file2.pdf");
merger.SaveMergedPDFToFile("merged.pdf");
// IronPDF - included in main package
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");// ExpertPdf - requires separate PDFMerge package
var merger = new PdfMerge();
merger.AppendPDFFile("file1.pdf");
merger.AppendPDFFile("file2.pdf");
merger.SaveMergedPDFToFile("merged.pdf");
// IronPDF - included in main package
var pdf1 = PdfDocument.FromFile("file1.pdf");
var pdf2 = PdfDocument.FromFile("file2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");For more merging options, see the PDF merging documentation.
Custom Page Sizes
ExpertPdf uses points. IronPDF uses millimeters. Convert: points / 72 * 25.4 = mm
Post-Migration Checklist
After completing the code migration, verify the following:
- Visual comparison of generated PDFs
- Verify headers/footers and page numbers
- Test security/encryption settings
- Validate merging operations
- Check custom page sizes
- Performance benchmarking
- Cross-platform testing
- Remove ExpertPdf license files
- Update documentation
Future-Proofing Your PDF Infrastructure
With .NET 10 on the horizon and C# 14 introducing new language features, choosing a PDF library with active development and modern rendering ensures long-term compatibility. IronPDF's monthly updates and latest Chromium engine provide the foundation for PDF generation that will continue to work correctly with modern CSS3 layouts (Flexbox, Grid) as projects extend into 2025 and 2026—unlike ExpertPdf's legacy Chrome version frozen in time.
Additional Resources
Migrating from ExpertPdf to IronPDF eliminates the challenges of frozen documentation, legacy Chrome rendering, fragmented product licensing, and limited modern .NET support. The transition to an actively maintained library with the latest Chromium engine ensures your PDF generation keeps pace with evolving web standards and .NET frameworks.






