Skip to footer content
MIGRATION GUIDES

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:

  1. Limited Feature Set: PeachPDF lacks advanced features like digital signatures, PDF/A compliance, and sophisticated text extraction.

  2. 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.

  3. Uncertain Future: New libraries without established track records carry adoption risk.

  4. Basic HTML Support: Limited CSS and JavaScript rendering capabilities.

  5. No Enterprise Support: No professional support or SLA options.

PeachPDF vs IronPDF Comparison

Feature/CharacteristicPeachPDFIronPDF
ImplementationPure .NETManaged with broad compatibility
LicenseOpen Source (BSD-3-Clause)Commercial
User BaseSmallLarge (40M+ downloads)
SupportCommunity-drivenProfessional with dedicated support
HTML RenderingBasicFull Chromium
CSS SupportLimitedFull CSS3
JavaScriptBasicFull ES2024
Digital SignaturesNoYes
PDF/A ComplianceNoYes
DocumentationLimitedExtensive
Development StatusIn developmentMature, 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

  1. .NET Environment: .NET Framework 4.6.2+ or .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGet Access: Ability to install NuGet packages
  3. 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 IronPdf
SHELL

License Configuration

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

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" .
SHELL

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;
$vbLabelText   $csharpLabel

Core API Mappings

PeachPDFIronPDFNotes
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.Headerrenderer.RenderingOptions.HtmlHeaderHeader content
converter.Footerrenderer.RenderingOptions.HtmlFooterFooter content
File.WriteAllBytes(path, pdf)pdf.SaveAs(path)Save file
pdf (byte[])pdf.BinaryDataGet 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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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();
$vbLabelText   $csharpLabel

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;
$vbLabelText   $csharpLabel
// 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>" 
};
$vbLabelText   $csharpLabel

Method Name Changes

PeachPDFIronPDF
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");
$vbLabelText   $csharpLabel

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");
$vbLabelText   $csharpLabel

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");
$vbLabelText   $csharpLabel

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");
$vbLabelText   $csharpLabel

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");
$vbLabelText   $csharpLabel

Feature Comparison Summary

FeaturePeachPDFIronPDF
HTML to PDFBasicFull Chromium
URL to PDFLimitedYes
CSS Grid/FlexboxNoYes
JavaScriptLimitedFull ES2024
Merge PDFsYesYes
Split PDFsLimitedYes
WatermarksLimitedFull HTML
Headers/FootersBasicFull HTML
Digital SignaturesNoYes
PDF/ANoYes
Form FillingLimitedYes
Text ExtractionBasicYes
Image ExtractionNoYes
Async SupportLimitedYes
Cross-PlatformUnknownYes

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);
$vbLabelText   $csharpLabel

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").

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 PeachPDF NuGet package
  • Install IronPdf NuGet package: dotnet add package IronPdf

Code Changes

  • Update namespace imports (using PeachPDF;using IronPdf;)
  • Add using IronPdf.Rendering; for header/footer functionality
  • Replace HtmlToPdfConverter with ChromePdfRenderer
  • Replace converter.Convert(html) with renderer.RenderHtmlAsPdf(html)
  • Replace converter.ConvertUrl(url) with renderer.RenderUrlAsPdf(url)
  • Replace File.WriteAllBytes(path, pdf) with pdf.SaveAs(path)
  • Replace converter.Header/Footer with RenderingOptions.HtmlHeader/HtmlFooter objects
  • 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

Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...

Read More