How to Migrate from PeachPDF to IronPDF in C#
Migrating from PeachPDF to IronPDF provides access to enterprise-grade PDF generation with comprehensive features, active development, and professional support. This guide provides a complete, step-by-step migration path that transforms your basic HTML-to-PDF workflow into a full-featured PDF solution with modern Chromium rendering, advanced security options, and extensive manipulation capabilities.
Why Migrate from PeachPDF to IronPDF
Understanding PeachPDF
PeachPDF is a relatively new entrant in the .NET ecosystem designed for developers who need to convert HTML to PDF. As a library, PeachPDF promises a pure .NET implementation, setting itself apart by not relying on external processes, ensuring it can be seamlessly integrated across platforms where .NET is supported. This characteristic positions PeachPDF as an appealing choice for projects looking for a lightweight, managed library solution.
Despite its potential, PeachPDF is still in development, highlighting both exciting possibilities and notable limitations. PeachPDF remains enticing because of its pure .NET core, which promises straightforward deployment in diverse environments. However, it also translates into limited adoption, with a smaller user base and community-driven support.
The Limitations of PeachPDF
PeachPDF is a relatively new, lesser-known PDF library that lacks the maturity, features, and support of established solutions. Key reasons to migrate:
Limited Feature Set: PeachPDF lacks advanced features like digital signatures, PDF/A compliance, and sophisticated text extraction.
Small Community: Limited documentation, examples, and community support. With a smaller user base, community support may be sparse, making it challenging to get assistance or find extensive documentation.
Uncertain Future: New libraries without established track records carry adoption risk.
Basic HTML Support: Limited CSS and JavaScript rendering capabilities.
- No Enterprise Support: No professional support or SLA options.
PeachPDF vs IronPDF Comparison
| Feature/Characteristic | PeachPDF | IronPDF |
|---|---|---|
| Implementation | Pure .NET | Managed with broad compatibility |
| License | Open Source (BSD-3-Clause) | Commercial |
| User Base | Small | Large (40M+ downloads) |
| Support | Community-driven | Professional with dedicated support |
| HTML Rendering | Basic | Full Chromium |
| CSS Support | Limited | Full CSS3 |
| JavaScript | Basic | Full ES2024 |
| Digital Signatures | No | Yes |
| PDF/A Compliance | No | Yes |
| Documentation | Limited | Extensive |
| Development Status | In development | Mature, stable release |
IronPDF stands out with broader functionality, supporting not just HTML-to-PDF conversions but also OCR, watermarking, and other advanced features. Its professional support structure is a definite advantage, offering quick resolutions to issues faced by developers.
For teams planning .NET 10 and C# 14 adoption through 2025 and 2026, IronPDF provides comprehensive features and active maintenance that ensure long-term stability and compatibility with modern .NET frameworks.
Before You Start
Prerequisites
- .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet Access: Ability to install NuGet packages
- IronPDF License: Obtain your license key from ironpdf.com
NuGet Package Changes
# Remove PeachPDF
dotnet remove package PeachPDF
# Install IronPDF
dotnet add package IronPdf# Remove PeachPDF
dotnet remove package PeachPDF
# Install IronPDF
dotnet add package IronPdfLicense Configuration
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";Identify PeachPDF Usage
# Audit PeachPDF usage in codebase
grep -r "using PeachPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|Convert\|ConvertUrl" --include="*.cs" .# Audit PeachPDF usage in codebase
grep -r "using PeachPDF" --include="*.cs" .
grep -r "HtmlToPdfConverter\|Convert\|ConvertUrl" --include="*.cs" .Complete API Reference
Namespace Changes
// Before: PeachPDF
using PeachPDF;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;// Before: PeachPDF
using PeachPDF;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;Core API Mappings
| PeachPDF | IronPDF | Notes |
|---|---|---|
new HtmlToPdfConverter() | new ChromePdfRenderer() | Create renderer |
converter.Convert(html) | renderer.RenderHtmlAsPdf(html) | HTML to PDF |
converter.ConvertUrl(url) | renderer.RenderUrlAsPdf(url) | URL to PDF |
converter.Header | renderer.RenderingOptions.HtmlHeader | Header content |
converter.Footer | renderer.RenderingOptions.HtmlFooter | Footer content |
File.WriteAllBytes(path, pdf) | pdf.SaveAs(path) | Save file |
pdf (byte[]) | pdf.BinaryData | Get bytes |
PdfReader.LoadFromFile(path) | PdfDocument.FromFile(path) | Load PDF |
document.MergeWith(other) | PdfDocument.Merge(pdfs) | Merge PDFs |
Code Migration Examples
Example 1: HTML String to PDF Conversion
Before (PeachPDF):
using PeachPDF;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = converter.Convert(html);
File.WriteAllBytes("output.pdf", pdf);
}
}using PeachPDF;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = converter.Convert(html);
File.WriteAllBytes("output.pdf", pdf);
}
}After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var html = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}This example demonstrates the fundamental difference between the two libraries. PeachPDF uses HtmlToPdfConverter with a Convert() method that returns a byte[], requiring File.WriteAllBytes() for saving. IronPDF uses ChromePdfRenderer with RenderHtmlAsPdf() that returns a PdfDocument object with a built-in SaveAs() method.
The key advantages of IronPDF's approach: the PdfDocument object can be further manipulated (adding watermarks, merging, security settings) before saving, whereas PeachPDF's byte array is a final output. IronPDF's approach offers cleaner syntax and better integration with modern .NET applications. See the HTML to PDF documentation for comprehensive examples.
Example 2: URL to PDF Conversion
Before (PeachPDF):
using PeachPDF;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var url = "https://www.example.com";
var pdf = converter.ConvertUrl(url);
File.WriteAllBytes("webpage.pdf", pdf);
}
}using PeachPDF;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
var url = "https://www.example.com";
var pdf = converter.ConvertUrl(url);
File.WriteAllBytes("webpage.pdf", pdf);
}
}After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
pdf.SaveAs("webpage.pdf");
}
}PeachPDF uses ConvertUrl() while IronPDF uses RenderUrlAsPdf(). The method naming in IronPDF is more descriptive—it explicitly indicates that a URL is being rendered as a PDF. Both libraries handle URL-to-PDF conversion similarly, but IronPDF's full Chromium engine provides superior rendering of modern web pages with complex CSS and JavaScript. Learn more in our tutorials.
Example 3: Adding Headers and Footers
Before (PeachPDF):
using PeachPDF;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
converter.Header = "<div style='text-align:center'>My Header</div>";
converter.Footer = "<div style='text-align:center'>Page {page}</div>";
var html = "<html><body><h1>Document Content</h1></body></html>";
var pdf = converter.Convert(html);
File.WriteAllBytes("document.pdf", pdf);
}
}using PeachPDF;
using System.IO;
class Program
{
static void Main()
{
var converter = new HtmlToPdfConverter();
converter.Header = "<div style='text-align:center'>My Header</div>";
converter.Footer = "<div style='text-align:center'>Page {page}</div>";
var html = "<html><body><h1>Document Content</h1></body></html>";
var pdf = converter.Convert(html);
File.WriteAllBytes("document.pdf", pdf);
}
}After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>My Header</div>" };
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>Page {page}</div>" };
var html = "<html><body><h1>Document Content</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("document.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>My Header</div>" };
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter() { HtmlFragment = "<div style='text-align:center'>Page {page}</div>" };
var html = "<html><body><h1>Document Content</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("document.pdf");
}
}This example shows a key architectural difference. PeachPDF uses simple string properties (converter.Header and converter.Footer) for headers and footers. IronPDF uses HtmlHeaderFooter objects assigned to RenderingOptions.HtmlHeader and RenderingOptions.HtmlFooter.
The IronPDF approach offers more flexibility—HtmlHeaderFooter objects can include additional properties like MaxHeight for controlling header/footer size. Note that both libraries use {page} as the page number placeholder. IronPDF also supports {total-pages} for total page count.
Note the additional namespace required for IronPDF: using IronPdf.Rendering; is needed for the HtmlHeaderFooter class.
Critical Migration Notes
Converter Class Change
PeachPDF uses HtmlToPdfConverter; IronPDF uses ChromePdfRenderer:
// PeachPDF
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();// PeachPDF
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();Return Type Change
PeachPDF returns byte[]; IronPDF returns PdfDocument:
// PeachPDF: Returns byte array
byte[] pdf = converter.Convert(html);
File.WriteAllBytes("output.pdf", pdf);
// IronPDF: Returns PdfDocument object
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or get bytes: byte[] bytes = pdf.BinaryData;// PeachPDF: Returns byte array
byte[] pdf = converter.Convert(html);
File.WriteAllBytes("output.pdf", pdf);
// IronPDF: Returns PdfDocument object
PdfDocument pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or get bytes: byte[] bytes = pdf.BinaryData;Header/Footer Property Change
// PeachPDF: Simple string properties
converter.Header = "<div>Header</div>";
converter.Footer = "<div>Footer</div>";
// IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div>Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div>Footer</div>"
};// PeachPDF: Simple string properties
converter.Header = "<div>Header</div>";
converter.Footer = "<div>Footer</div>";
// IronPDF: HtmlHeaderFooter objects
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div>Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div>Footer</div>"
};Method Name Changes
| PeachPDF | IronPDF |
|---|---|
Convert(html) | RenderHtmlAsPdf(html) |
ConvertUrl(url) | RenderUrlAsPdf(url) |
File.WriteAllBytes() | SaveAs() |
New Capabilities After Migration
After migrating to IronPDF, you gain capabilities that PeachPDF cannot provide:
PDF Merging
var pdf1 = PdfDocument.FromFile("doc1.pdf");
var pdf2 = PdfDocument.FromFile("doc2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");var pdf1 = PdfDocument.FromFile("doc1.pdf");
var pdf2 = PdfDocument.FromFile("doc2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");Watermarks with HTML
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>");
pdf.SaveAs("watermarked.pdf");var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark("<div style='color: red; font-size: 48pt;'>DRAFT</div>");
pdf.SaveAs("watermarked.pdf");Password Protection
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SaveAs("protected.pdf");var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");
pdf.SecuritySettings.OwnerPassword = "owner123";
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SaveAs("protected.pdf");Digital Signatures
using IronPdf.Signing;
var pdf = PdfDocument.FromFile("document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Document Approval",
SigningLocation = "New York"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");using IronPdf.Signing;
var pdf = PdfDocument.FromFile("document.pdf");
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningReason = "Document Approval",
SigningLocation = "New York"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");Async Operations
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>");
pdf.SaveAs("async_output.pdf");var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Async PDF</h1>");
pdf.SaveAs("async_output.pdf");Feature Comparison Summary
| Feature | PeachPDF | IronPDF |
|---|---|---|
| HTML to PDF | Basic | Full Chromium |
| URL to PDF | Limited | Yes |
| CSS Grid/Flexbox | No | Yes |
| JavaScript | Limited | Full ES2024 |
| Merge PDFs | Yes | Yes |
| Split PDFs | Limited | Yes |
| Watermarks | Limited | Full HTML |
| Headers/Footers | Basic | Full HTML |
| Digital Signatures | No | Yes |
| PDF/A | No | Yes |
| Form Filling | Limited | Yes |
| Text Extraction | Basic | Yes |
| Image Extraction | No | Yes |
| Async Support | Limited | Yes |
| Cross-Platform | Unknown | Yes |
Common Migration Issues
Issue 1: Different API Pattern
Problem: PeachPDF uses a converter pattern with byte array output; IronPDF uses a renderer pattern with PdfDocument output.
Solution:
// PeachPDF pattern
var converter = new HtmlToPdfConverter();
var pdf = converter.Convert(html);
File.WriteAllBytes(path, pdf);
// IronPDF pattern
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path);// PeachPDF pattern
var converter = new HtmlToPdfConverter();
var pdf = converter.Convert(html);
File.WriteAllBytes(path, pdf);
// IronPDF pattern
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs(path);Issue 2: Save Method Difference
Problem: PeachPDF requires File.WriteAllBytes(); IronPDF has built-in SaveAs().
Solution: Replace File.WriteAllBytes("path", pdf) with pdf.SaveAs("path").
Issue 3: Header/Footer Objects
Problem: PeachPDF uses string properties; IronPDF uses object properties.
Solution: Wrap HTML strings in HtmlHeaderFooter objects with HtmlFragment property.
Migration Checklist
Pre-Migration
- Audit PeachPDF usage in codebase
- Document custom configurations
- Note all header/footer implementations
- Obtain IronPDF license key from ironpdf.com
- Test with IronPDF trial license first
Package Changes
- Remove
PeachPDFNuGet package - Install
IronPdfNuGet package:dotnet add package IronPdf
Code Changes
- Update namespace imports (
using PeachPDF;→using IronPdf;) - Add
using IronPdf.Rendering;for header/footer functionality - Replace
HtmlToPdfConverterwithChromePdfRenderer - Replace
converter.Convert(html)withrenderer.RenderHtmlAsPdf(html) - Replace
converter.ConvertUrl(url)withrenderer.RenderUrlAsPdf(url) - Replace
File.WriteAllBytes(path, pdf)withpdf.SaveAs(path) - Replace
converter.Header/FooterwithRenderingOptions.HtmlHeader/HtmlFooterobjects - Add license initialization at application startup
Post-Migration
- Test HTML rendering quality
- Verify PDF output matches expectations
- Test header/footer rendering with page numbers
- Add new capabilities (security, watermarks, merging) as needed






