IRONSOFTWAREHOME
MIGRATION GUIDES

How to Migrate from Winnovative to IronPDF in C#

Curtis Chau
Curtis Chau
Updated: August 1, 2026

Winnovative has been a recognized name in the .NET PDF generation space, offering HTML-to-PDF conversion capabilities for C# applications. However, the long-running Classic library relies on an older proprietary rendering engine, and its support for modern CSS (Grid, recent Flexbox) and modern JavaScript (ES2017+) is inconsistent compared to a current Chromium browser. The vendor's response has been to ship a separate Chromium-class product, Winnovative.Pdf.Next, rather than upgrade Classic in place - which means existing Winnovative customers face a code migration either way.

This guide provides a migration path from Winnovative to IronPDF, with step-by-step instructions, code comparisons, and practical examples for .NET developers evaluating this transition.

Why Migrate from Winnovative

Winnovative's Classic library uses an older proprietary engine that has not been updated to modern web standards:

Inconsistent CSS Grid / modern Flexbox: Layouts that depend on CSS Grid or recent Flexbox features can render incorrectly compared to a current Chromium browser.

Modern JavaScript Compatibility Gaps: ES2017+ features (arrow functions, async/await, classes) are not reliably executed, which affects React, Vue, and other modern frameworks.

Slow Cadence: The Classic engine receives infrequent rendering-engine refreshes; the vendor's answer has been to ship the separate Winnovative.Pdf.Next Chromium-class product, leaving Classic feature-frozen.

Two-Product Migration Burden: Moving to Winnovative.Pdf.Next is itself a rewrite - the Next API lives under a different namespace (Winnovative.Pdf.Next) and is binary-incompatible with Classic.

Font Rendering Edge Cases: Web fonts and custom typography sometimes render differently from a modern browser.

Real-World Impact

Modern CSS and JavaScript that can render inconsistently in Winnovative Classic:

<!-- CSS Grid can render inconsistently in Winnovative Classic -->
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;">
  <div>Column 1</div>
  <div>Column 2</div>
  <div>Column 3</div>
</div>

<!-- Modern JavaScript may not execute reliably in Classic -->
<script>
const items = data.map(item => item.name);
const result = await fetchData();
class Report { }
</script>
HTML

IronPDF vs Winnovative: Feature Comparison

Understanding the architectural differences helps technical decision-makers evaluate the migration investment:

AspectWinnovative ClassicIronPDF
Rendering EngineOlder proprietary engineChromium (Current)
CSS GridInconsistentFull Support
FlexboxInconsistent on edge casesFull Support
JavaScriptLimited modern JSES2024
Bootstrap 5Layout issuesFull Support
Tailwind CSSLimitedFull Support
React/Vue SSRProblematicWorks
Web FontsUnreliable in some setupsFull Support
UpdatesInfrequentMonthly
Pricing (per developer)$450 Deployment / $1,200 RedistributableSee ironpdf.com/pricing

Quick Start: Winnovative to IronPDF Migration

The migration can begin immediately with these foundational steps.

Step 1: Replace NuGet Packages

Remove all Winnovative packages (verify which your project actually uses):

# Remove Winnovative (Classic + related utilities)
dotnet remove package Winnovative.HtmlToPdf
# Also remove any of these your project references:
# dotnet remove package Winnovative.PdfMerge
# dotnet remove package Winnovative.PdfSecurity
# dotnet remove package Winnovative.Pdf.Next.Core
# dotnet remove package Winnovative.Client
SHELL

Install IronPDF:

# Install IronPDF
dotnet add package IronPdf
SHELL

Step 2: Update Namespaces

Replace Winnovative namespaces with the IronPDF namespace:

// Before (Winnovative)
using Winnovative;
using Winnovative.WebKit;

// After (IronPDF)
using IronPdf;

Step 3: Initialize License

Add license initialization at application startup:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Code Migration Examples

Converting HTML to PDF

The most common use case demonstrates the API differences between these .NET PDF libraries.

Winnovative Approach:

// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;

class Program
{
    static void Main()
    {
        // Create the HTML to PDF converter
        HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
        
        // Set license key
        htmlToPdfConverter.LicenseKey = "your-license-key";
        
        // Convert HTML string to PDF
        string htmlString = "<html><body><h1>Hello World</h1></body></html>";
        byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
        
        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
        
        Console.WriteLine("PDF created successfully");
    }
}
C#

IronPDF Approach:

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

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();
        
        // Convert HTML string to PDF
        string htmlString = "<html><body><h1>Hello World</h1></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        
        // Save to file
        pdf.SaveAs("output.pdf");
        
        Console.WriteLine("PDF created successfully");
    }
}

Winnovative requires creating an HtmlToPdfConverter, setting a license key on the instance, calling ConvertHtml() with an empty base URL parameter, receiving raw bytes, and manually writing to a file. IronPDF simplifies this: create a ChromePdfRenderer, call RenderHtmlAsPdf(), and use the built-in SaveAs() method.

For advanced HTML-to-PDF scenarios, see the HTML to PDF conversion guide.

Converting URLs to PDF

URL-to-PDF conversion shows similar patterns.

Winnovative Approach:

// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;

class Program
{
    static void Main()
    {
        // Create the HTML to PDF converter
        HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
        
        // Set license key
        htmlToPdfConverter.LicenseKey = "your-license-key";
        
        // Convert URL to PDF
        string url = "https://www.example.com";
        byte[] pdfBytes = htmlToPdfConverter.ConvertUrl(url);
        
        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
        
        Console.WriteLine("PDF from URL created successfully");
    }
}
C#

IronPDF Approach:

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

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();
        
        // Convert URL to PDF
        string url = "https://www.example.com";
        var pdf = renderer.RenderUrlAsPdf(url);
        
        // Save to file
        pdf.SaveAs("webpage.pdf");
        
        Console.WriteLine("PDF from URL created successfully");
    }
}

Winnovative uses ConvertUrl() returning bytes that must be manually saved. IronPDF provides RenderUrlAsPdf() with a PdfDocument object that includes SaveAs() for convenience.

Explore the URL to PDF documentation for authentication and custom header options.

Adding Headers and Footers

Headers and footers reveal significant architectural differences. Winnovative uses a programmatic element-based approach with TextElement objects, while IronPDF uses HTML-based headers with placeholder tokens.

Winnovative Approach:

// NuGet: Install-Package Winnovative.HtmlToPdf
using Winnovative;
using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        // Create the HTML to PDF converter
        HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
        
        // Set license key
        htmlToPdfConverter.LicenseKey = "your-license-key";
        
        // Enable header
        htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;
        htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60;
        
        // Add header text
        TextElement headerText = new TextElement(0, 0, "Document Header", new Font("Arial", 12));
        htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText);
        
        // Enable footer
        htmlToPdfConverter.PdfDocumentOptions.ShowFooter = true;
        htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60;
        
        // Add footer with page number
        TextElement footerText = new TextElement(0, 0, "Page &p; of &P;", new Font("Arial", 10));
        htmlToPdfConverter.PdfFooterOptions.AddElement(footerText);
        
        // Convert HTML to PDF
        string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
        byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
        
        // Save to file
        System.IO.File.WriteAllBytes("document.pdf", pdfBytes);
        
        Console.WriteLine("PDF with header and footer created successfully");
    }
}
C#

IronPDF Approach:

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

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();
        
        // Configure header and footer
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            FontSize = 12
        };
        
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page} of {total-pages}",
            FontSize = 10
        };
        
        // Convert HTML to PDF
        string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
        var pdf = renderer.RenderHtmlAsPdf(htmlString);
        
        // Save to file
        pdf.SaveAs("document.pdf");
        
        Console.WriteLine("PDF with header and footer created successfully");
    }
}

Winnovative requires enabling headers/footers through PdfDocumentOptions.ShowHeader, setting heights, creating TextElement objects with coordinate positions and System.Drawing.Font objects, and using &p; and &P; placeholders. IronPDF uses TextHeaderFooter objects with simple properties like CenterText and FontSize, and intuitive placeholders like {page} and {total-pages}.

For HTML-based headers with full CSS styling, see the headers and footers documentation.

Winnovative API to IronPDF Mapping Reference

This mapping accelerates migration by showing direct API equivalents:

Winnovative ClassIronPDF Equivalent
HtmlToPdfConverterChromePdfRenderer
PdfDocumentPdfDocument
PdfDocumentOptionsRenderingOptions
PdfHeaderOptionsHtmlHeaderFooter
PdfFooterOptionsHtmlHeaderFooter
TextElementHTML in HtmlFragment
ImageElementHTML <img>

Method Mapping

Winnovative MethodIronPDF Method
ConvertUrl(url)RenderUrlAsPdf(url)
ConvertUrlToFile(url, path)RenderUrlAsPdf(url).SaveAs(path)
ConvertHtml(html, baseUrl)RenderHtmlAsPdf(html)
ConvertHtmlToFile(html, path)RenderHtmlAsPdf(html).SaveAs(path)
ConvertHtmlFile(path)RenderHtmlFileAsPdf(path)
MergePdf(streams)PdfDocument.Merge(pdfs)
AppendPdf(pdf)pdf1.AppendPdf(pdf2)

Options Mapping

Winnovative OptionIronPDF Option
PdfPageSize.A4PaperSize = PdfPaperSize.A4
PdfPageSize.LetterPaperSize = PdfPaperSize.Letter
PdfPageOrientation.PortraitPaperOrientation = PdfPaperOrientation.Portrait
PdfPageOrientation.LandscapePaperOrientation = PdfPaperOrientation.Landscape
TopMargin = 20MarginTop = 20
BottomMargin = 20MarginBottom = 20
LeftMargin = 15MarginLeft = 15
RightMargin = 15MarginRight = 15
ShowHeader = trueSet HtmlHeader property
ShowFooter = trueSet HtmlFooter property
JavaScriptEnabled = trueEnableJavaScript = true
Page number &p;Page number {page}
Total pages &P;Total pages {total-pages}

Common Migration Issues and Solutions

Issue 1: CSS Layouts Look Different

Symptom: Layouts that looked "okay" in Winnovative now look different in IronPDF.

Cause: Winnovative Classic's older proprietary engine has rendering quirks that developers worked around. IronPDF's current Chromium engine renders these correctly.

Solution: Remove Winnovative-specific CSS hacks and use standard CSS:

// Clean up legacy CSS
string cleanedHtml = html
    .Replace("-webkit-flex", "flex")
    .Replace("display: -webkit-box", "display: flex");

Issue 2: JavaScript Not Executing

Symptom: Dynamic content not appearing in PDF.

Cause: Need to configure JavaScript wait options explicitly.

Solution:

renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.JavaScript(5000);
// Or wait for specific element
renderer.RenderingOptions.WaitFor.HtmlElementById("content-ready", 10000);

Issue 3: Base URL Not Working

Symptom: Relative URLs for images and CSS not resolving.

Cause: IronPDF needs explicit base URL configuration.

Solution:

renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");

Issue 4: Different Page Breaks

Symptom: Content breaking at different points than Winnovative.

Cause: Different rendering engines handle page breaks differently.

Solution: Use explicit CSS page break controls:

/* Control page breaks explicitly */
.no-break {
    page-break-inside: avoid;
}
.page-break-before {
    page-break-before: always;
}
.page-break-after {
    page-break-after: always;
}
Text

Issue 5: Fonts Look Different

Symptom: Text appears in different fonts than expected.

Cause: IronPDF uses system fonts; web fonts need explicit loading.

Solution:

<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');

body {
    font-family: 'Roboto', Arial, sans-serif;
}
</style>
HTML

Winnovative Migration Checklist

Pre-Migration Tasks

Audit your codebase to identify all Winnovative usage:

# Find all Winnovative references
grep -r "Winnovative" --include="*.cs" .
grep -r "HtmlToPdfConverter" --include="*.cs" .
grep -r "PdfDocumentOptions" --include="*.cs" .
grep -r "ConvertUrl\|ConvertHtml" --include="*.cs" .
SHELL

Document current configurations including page sizes, margins, and header/footer settings. Identify CSS workarounds (webkit prefixes, float-based grids) that can be removed. Note JavaScript compatibility requirements.

Code Update Tasks

  1. Remove Winnovative NuGet packages
  2. Install IronPDF NuGet package
  3. Update all namespace imports from Winnovative to IronPdf
  4. Replace HtmlToPdfConverter with ChromePdfRenderer
  5. Convert ConvertHtml() calls to RenderHtmlAsPdf()
  6. Convert ConvertUrl() calls to RenderUrlAsPdf()
  7. Update page size/orientation settings to RenderingOptions
  8. Convert margin configurations
  9. Migrate TextElement-based headers/footers to HTML-based TextHeaderFooter
  10. Update page number placeholders from &p;/&P; to {page}/{total-pages}
  11. Add IronPDF license initialization at startup

Post-Migration Testing

After migration, verify these aspects:

  • Test basic HTML to PDF conversion
  • Test URL to PDF conversion
  • Verify CSS Grid layouts render correctly
  • Verify Flexbox layouts render correctly
  • Test JavaScript-heavy pages with modern ES6+ syntax
  • Verify Bootstrap 5 compatibility
  • Test header/footer rendering
  • Verify page breaks
  • Compare PDF output quality

Cleanup Tasks

  • Remove Winnovative CSS workarounds (webkit prefixes)
  • Update ES5 JavaScript to modern syntax
  • Remove float-based grid fallbacks
  • Update documentation

Key Benefits of Migrating to IronPDF

Moving from Winnovative to IronPDF provides several critical advantages:

Modern Rendering Engine: IronPDF uses the current Chromium engine, ensuring full CSS3, CSS Grid, Flexbox, and ES2024 JavaScript support. Modern frameworks like Bootstrap 5, Tailwind CSS, and React/Vue render correctly.

Simplified API: HTML-based headers and footers replace programmatic TextElement positioning. Intuitive placeholders like {page} replace obscure &p; syntax. Built-in SaveAs() methods eliminate manual byte handling.

Active Development: IronPDF's monthly updates ensure compatibility with current and upcoming .NET versions.

Modern CSS Without Workarounds: CSS Grid, Flexbox, and modern typography work without webkit prefixes or float-based fallbacks.

Modern JavaScript: ES6+ features including arrow functions, async/await, classes, and modules execute correctly.

Please note: Winnovative is a registered trademark of its respective owner. This site is not affiliated with, endorsed by, or sponsored by Winnovative Software. 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