IRONSOFTWAREHOME
MIGRATION GUIDES

How to Migrate from Easy PDF SDK to IronPDF in C#

Curtis Chau
Curtis Chau
Updated: August 1, 2026

BCL Technologies, the original publisher of easyPDF SDK, was acquired by Apryse (formerly PDFTron) in March 2020, and the product is now positioned as a legacy SDK alongside the Apryse PDF SDK. The SDK itself relies on several legacy technologies that create deployment and maintenance challenges in modern development environments.

Common Easy PDF SDK Deployment Issues

Developers frequently encounter these issues when working with Easy PDF SDK:

  • bcl.easypdf.interop.easypdfprinter.dll error loading
  • COM object that has been separated from its underlying RCW cannot be used
  • Timeout expired waiting for print job to complete
  • The printer operation failed because the service is not running
  • Error: Access denied (interactive session required)
  • Cannot find printer: BCL easyPDF Printer

These errors typically stem from Easy PDF SDK's architecture, which relies on virtual printer drivers, COM interop, and interactive Windows sessions that are awkward to reproduce in modern server environments.

Easy PDF SDK vs. IronPDF: Key Differences

FeatureEasy PDF SDKIronPDF
PlatformWindows-onlyWindows, Linux, macOS, Docker
Office DependencyRequiredNone
DistributionMSI installer + manual DLL references (no NuGet package)NuGet package (IronPdf)
InstallationMSI + virtual printer driver + COM registrationNuGet package
Server SupportTypically requires an interactive Windows sessionRuns headless
HTML RenderingBasic (Office-based)Full Chromium (CSS3, JS)
.NET SupportLimited .NET Core.NET Framework 4.6.2+ and .NET 5/6/7/8/9
Async PatternCallback-basedNative async/await
Container SupportNot supported by the vendorFull Docker/Kubernetes

Platform Limitations

Easy PDF SDK targets Windows and relies on Microsoft Office installations for Office document conversions, which limits its use on Linux, macOS, and containerized environments like Docker. This dependency tends to make server setups more complex and ties deployment to Windows - a constraint for teams practicing multi-platform DevOps or relying on Linux containers.

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 Easy PDF SDK Usage

Run these commands in your solution directory to identify all Easy PDF SDK references:

# Find all BCL using statements
grep -r "using BCL" --include="*.cs" .

# Find Printer/PDFDocument usage
grep -r "Printer\|PDFDocument\|PDFConverter\|HTMLConverter" --include="*.cs" .

# Find COM interop references
grep -r "easyPDF\|BCL.easyPDF" --include="*.csproj" .

# Find configuration settings
grep -r "PageOrientation\|TimeOut\|PrintOffice" --include="*.cs" .
SHELL

Breaking Changes to Anticipate

Easy PDF SDK PatternChange Required
new Printer()Use ChromePdfRenderer
PrintOfficeDocToPDF()Office conversion handled differently
RenderHTMLToPDF()RenderHtmlAsPdf()
COM interop referencesRemove entirely
Printer driver configNot needed
BeginPrintToFile() callbacksNative async/await
Interactive session requirementsRuns headless
1-based page indexing0-based indexing
Timeout in secondsTimeout in milliseconds

Step-by-Step Migration Process

Step 1: Remove Easy PDF SDK

Easy PDF SDK is distributed as an MSI installer rather than a NuGet package, and projects typically reference its assemblies (such as BCL.easyPDF.PDFConverter.dll for .NET Framework or BCL.easyPDF.PDFConverter.NetCore.dll for .NET Core) directly. Remove all references:

  1. Uninstall BCL EasyPDF SDK from Programs and Features
  2. Remove DLL <Reference> entries from your .csproj
  3. Remove COM interop references
  4. Clean up GAC entries if present

Step 2: Install IronPDF

# Install IronPDF
dotnet add package IronPdf
SHELL

Or via Package Manager Console:

PM > Install-Package IronPdf

Step 3: Update Namespace References

Replace Easy PDF SDK namespaces with IronPDF:

// Remove these
using BCL.easyPDF;
using BCL.easyPDF.PDFConverter;
using BCL.easyPDF.PDFProcessor;
using BCL.easyPDF.Printer;

// Add these
using IronPdf;
using IronPdf.Rendering;

Complete API Migration Reference

Core Class Mapping

Easy PDF SDK ClassIronPDF Equivalent
PrinterChromePdfRenderer
PDFDocumentPdfDocument
HTMLConverterChromePdfRenderer
PrinterConfigurationChromePdfRenderOptions
PageOrientationPdfPaperOrientation
PageSizePdfPaperSize
SecurityHandlerPdfDocument.SecuritySettings

PDF Creation Methods

Easy PDF SDK MethodIronPDF Method
printer.RenderHTMLToPDF(html, path)renderer.RenderHtmlAsPdf(html).SaveAs(path)
printer.RenderUrlToPDF(url, path)renderer.RenderUrlAsPdf(url).SaveAs(path)
htmlConverter.ConvertHTML(html, doc)renderer.RenderHtmlAsPdf(html)
htmlConverter.ConvertURL(url, doc)renderer.RenderUrlAsPdf(url)

PDF Manipulation Methods

Easy PDF SDK MethodIronPDF Method
doc.Append(doc2)PdfDocument.Merge(pdf1, pdf2)
doc.ExtractPages(start, end)pdf.CopyPages(start, end)
doc.DeletePage(index)pdf.RemovePages(index)
doc.GetPageCount()pdf.PageCount
doc.Save(path)pdf.SaveAs(path)
doc.Close()pdf.Dispose() or using
doc.ExtractText()pdf.ExtractAllText()

Configuration Options

Easy PDF SDK OptionIronPDF Option
config.TimeOutRenderingOptions.Timeout
config.PageOrientation = LandscapeRenderingOptions.PaperOrientation = Landscape
config.PageSize = A4RenderingOptions.PaperSize = PdfPaperSize.A4
config.MarginTop/Bottom/Left/RightRenderingOptions.MarginTop, etc.

Code Migration Examples

HTML String to PDF

Easy PDF SDK Implementation:

// Reference BCL.easyPDF.PDFConverter.dll (or the .NetCore variant)
// installed by the easyPDF SDK MSI — there is no NuGet package.
using BCL.easyPDF;
using System;

class Program
{
    static void Main()
    {
        var pdf = new PDFDocument();
        var htmlConverter = new HTMLConverter();
        htmlConverter.ConvertHTML("<h1>Hello World</h1>", pdf);
        pdf.Save("output.pdf");
        pdf.Close();
    }
}

IronPDF Implementation:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
        pdf.SaveAs("output.pdf");
    }
}

IronPDF folds HTML rendering into a single renderer call and lets using/Dispose handle cleanup, removing the separate HTMLConverter step and the manual Close() pattern.

URL to PDF Conversion

Easy PDF SDK Implementation:

// Reference BCL.easyPDF.PDFConverter.dll (or the .NetCore variant)
// installed by the easyPDF SDK MSI — there is no NuGet package.
using BCL.easyPDF;
using System;

class Program
{
    static void Main()
    {
        var pdf = new PDFDocument();
        var htmlConverter = new HTMLConverter();
        htmlConverter.ConvertURL("https://example.com", pdf);
        pdf.Save("webpage.pdf");
        pdf.Close();
    }
}

IronPDF Implementation:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

Merging Multiple PDFs

Easy PDF SDK Implementation:

// Reference BCL.easyPDF.PDFConverter.dll (or the .NetCore variant)
// installed by the easyPDF SDK MSI — there is no NuGet package.
using BCL.easyPDF;
using System;

class Program
{
    static void Main()
    {
        var pdf1 = new PDFDocument("document1.pdf");
        var pdf2 = new PDFDocument("document2.pdf");
        pdf1.Append(pdf2);
        pdf1.Save("merged.pdf");
        pdf1.Close();
        pdf2.Close();
    }
}

IronPDF Implementation:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
        var pdfs = new List<PdfDocument>
        {
            PdfDocument.FromFile("document1.pdf"),
            PdfDocument.FromFile("document2.pdf")
        };
        var merged = PdfDocument.Merge(pdfs);
        merged.SaveAs("merged.pdf");
    }
}

IronPDF's static Merge method accepts a collection of documents directly, replacing the pairwise Append pattern.

Password Protection

IronPDF Implementation:

using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>");

// Set security
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint;
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit;

pdf.SaveAs("protected.pdf");

Headers and Footers

Easy PDF SDK does not expose dedicated header/footer APIs in its HTML conversion path; headers and footers are typically embedded directly in the source HTML. IronPDF provides dedicated header/footer objects:

using IronPdf;

var renderer = new ChromePdfRenderer();

renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:center; font-size:12px; font-family:Arial;'>
            Company Name - Confidential
        </div>",
    DrawDividerLine = true,
    MaxHeight = 30
};

renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = @"
        <div style='text-align:center; font-size:10px;'>
            Page {page} of {total-pages}
        </div>",
    DrawDividerLine = true,
    MaxHeight = 25
};

var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>");
pdf.SaveAs("with_headers.pdf");

For more options, see the headers and footers documentation.

Async PDF Generation

Easy PDF SDK uses callback-based async patterns. IronPDF supports native async/await:

Easy PDF SDK Implementation:

using BCL.easyPDF;

Printer printer = new Printer();

// BCL uses callback-based async
printer.BeginPrintToFile(
    "https://example.com",
    "output.pdf",
    OnPrintComplete,
    OnPrintError
);

Console.ReadLine();
printer.Dispose();

IronPDF Implementation:

using IronPdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var renderer = new ChromePdfRenderer();

        // Native async/await
        var pdf = await renderer.RenderUrlAsPdfAsync("https://example.com");
        await pdf.SaveAsAsync("output.pdf");

        Console.WriteLine("PDF created: output.pdf");
    }
}

Critical Migration Notes

Page Index Change

Easy PDF SDK uses 1-based indexing. IronPDF uses 0-based indexing:

// Easy PDF SDK: 1-based
doc.ExtractPages(1, 5);

// IronPDF: 0-based
pdf.CopyPages(0, 4);

Timeout in Milliseconds

Easy PDF SDK uses seconds for timeout values. IronPDF uses milliseconds:

// Easy PDF SDK: seconds
config.TimeOut = 120;

// IronPDF: milliseconds
renderer.RenderingOptions.Timeout = 120000;

ASP.NET Core Integration

Easy PDF SDK struggles in web contexts due to interactive session requirements.

IronPDF Pattern:

[ApiController]
[Route("[controller]")]
public class PdfController : ControllerBase
{
    [HttpGet("generate")]
    public IActionResult GeneratePdf()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>");

        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }

    [HttpGet("generate-async")]
    public async Task<IActionResult> GeneratePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>");

        return File(pdf.BinaryData, "application/pdf", "report.pdf");
    }
}

Docker Deployment

Easy PDF SDK is not designed for Linux containers - its supported configuration is Windows with Microsoft Office, a virtual printer driver, and (in most setups) an interactive desktop session, which makes typical Linux-based Docker workflows impractical.

IronPDF Docker Configuration:

FROM mcr.microsoft.com/dotnet/aspnet:8.0

# Install Chromium dependencies
RUN apt-get update && apt-get install -y \
    libc6 libgdiplus libx11-6 libxcomposite1 \
    libxdamage1 libxrandr2 libxss1 libxtst6 \
    libnss3 libatk-bridge2.0-0 libgtk-3-0 \
    libgbm1 libasound2 fonts-liberation \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY . .
ENTRYPOINT ["dotnet", "MyApp.dll"]
Text

Troubleshooting Common Migration Issues

Issue: Printer Not Found

Symptom: Cannot find printer: BCL easyPDF Printer

Solution: IronPDF doesn't need printer drivers:

// Just use the renderer directly
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);

Issue: COM Interop Errors

Symptom: DLL error loading or RCW errors

Solution: Remove all COM references and use IronPDF's managed API.

Issue: Timeout on Server

Symptom: PDF generation hangs on web server

Solution: IronPDF runs headless without interactive sessions:

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.Timeout = 60000; // Reliable timeout
var pdf = renderer.RenderHtmlAsPdf(html);

Issue: Background Not Printing

Symptom: CSS backgrounds missing

Solution: Enable background printing:

renderer.RenderingOptions.PrintHtmlBackgrounds = true;

Post-Migration Checklist

After completing the code migration, verify the following:

  • Verify PDF output quality with IronPDF's Chromium engine
  • Test all edge cases with complex HTML/CSS
  • Validate server deployment works without interactive sessions
  • Test Docker/container deployment
  • Remove BCL EasyPDF installer from deployment
  • Remove Office installation from servers (no longer needed)
  • Update CI/CD pipelines with new NuGet package

Additional Resources


Migrating from Easy PDF SDK to IronPDF removes the virtual printer driver, COM interop, and Windows-only constraints from the PDF generation path. Chromium-based rendering brings modern CSS3 and JavaScript support, and the same codebase runs on Docker, Kubernetes, and Linux-based cloud environments that are awkward to target with the easyPDF SDK's supported deployment model.

Please note: BCL easyPDF SDK, Easy PDF SDK, and Apryse are registered trademarks of their respective owners. This site is not affiliated with, endorsed by, or sponsored by BCL Technologies or Apryse. All product names, logos, and brands are property of their respective owners. Comparisons are for informational purposes only and reflect publicly available information at the time of writing.
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

Related Articles

Key in blue circle

Get your free 30-day Trial Key instantly.

Your trial license will be sent to your email address

No limitations. 100% unlocked. No credit card.

bullet_checkedNo credit card or account creation requiredNo limitations. 100% unlocked. No credit card.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Book your free Live Demo
Booking Badge

Trusted by Millions of Engineers Worldwide

Iron Software's customer logos
Get Your No-Obligation Consult
Complete the form below or email sales@ironsoftware.com
Your details will always be kept confidential.
Trusted by Millions of Engineers Worldwide
Iron Software's customer logos
Get your free 30-day Trial Key instantly.
No credit card or account creation required