How to Migrate from PDF Duo to IronPDF in C#
Migrating from PDF Duo .NET to IronPDF moves your .NET PDF workflow from a niche, sparsely documented library with no recent releases to a stable, well-documented, and actively maintained solution. This guide provides a step-by-step migration path that addresses the risks of relying on an inactive component while gaining access to features PDF Duo's documented API does not cover.
Why Migrate from PDF Duo to IronPDF
The PDF Duo Risk Problem
PDF Duo .NET (DuoDimension Software) is a niche HTML-to-PDF component for .NET. While it may have appealed to teams seeking a self-contained DLL, several traits make it a poor fit for current production applications:
-
Vendor and Provenance: Published by DuoDimension Software (duodimension.com), a small ISV with no public roadmap and no GitHub repository.
-
Sparse Documentation: One vendor product page, a handful of sample snippets, and a 2010 press release. No API reference site and no meaningful Stack Overflow presence.
-
Effectively Abandoned: Last public release is v2.4, dated December 10, 2010 — roughly 15 years without a new version.
-
Narrow Documented Surface: The public API is essentially
DuoDimension.HtmlToPdfwithOpenHTML(...)andSavePDF(...). There is no documented native API for watermarking, encryption, signing, form filling, text extraction, or PDF merging. -
Rendering Engine Not Disclosed: Vendor materials describe a self-contained component with no Office or Acrobat dependency, but do not publish what HTML/CSS engine is used. CSS3, modern JavaScript, web fonts, and flex/grid layout are not claimed.
- Pre-modern .NET Targeting: Documented support is .NET Framework 1.1 through 3.5 on Windows XP / Vista / 7 / 2000 / 2003. No documented support for .NET Framework 4.x, .NET Core, .NET 5+, Linux, or Docker.
PDF Duo vs IronPDF Comparison
| Aspect | PDF Duo .NET | IronPDF |
|---|---|---|
| Last release | v2.4 (December 2010) | Active, regular releases |
| Distribution | DLL download from duodimension.com (no NuGet) | NuGet IronPdf |
| Runtime support | .NET Framework 1.1 – 3.5, Windows only | .NET FX 4.6.2+, .NET 6/7/8/9/10, Linux, macOS, Docker |
| Documentation | One vendor product page | Comprehensive docs + API reference |
| Support | None visible | Professional support team |
| Community | Negligible | 41M+ NuGet downloads (Iron Software stack) |
| Rendering | Engine not disclosed | Modern Chromium |
| Features | HTML-to-PDF only | HTML-to-PDF, merge, security, signatures, OCR, forms, watermarks |
| Licensing | Per vendor pricing page | Commercial, perpetual or subscription |
For teams on modern .NET, IronPDF provides a stable foundation with active development and comprehensive documentation in place of a component whose last published release was v2.4 in December 2010.
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
Package / Reference Changes
PDF Duo .NET is not distributed via NuGet. Removing it is a manual step:
# In Visual Studio: References -> remove PDFDuo.dll (and any associated
# PDF Duo files) and delete the vendored binary from your /lib folder.
# Install IronPDF
dotnet add package IronPdf
# In Visual Studio: References -> remove PDFDuo.dll (and any associated
# PDF Duo files) and delete the vendored binary from your /lib folder.
# Install IronPDF
dotnet add package IronPdf
License Configuration
// 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";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Identify PDF Duo Usage
# Find all PDF Duo references
grep -r "DuoDimension\|HtmlToPdf\b\|OpenHTML\|SavePDF" --include="*.cs" .
# Find all PDF Duo references
grep -r "DuoDimension\|HtmlToPdf\b\|OpenHTML\|SavePDF" --include="*.cs" .
API Reference
The vendor's documented root namespace is DuoDimension. The public surface is essentially the HtmlToPdf class with OpenHTML(...) and SavePDF(...). Sub-namespaces shown below for IronPDF reflect IronPDF's structure; PDF Duo .NET does not document sub-namespaces.
Namespace Changes
| PDF Duo .NET | IronPDF |
|---|---|
using DuoDimension; |
using IronPdf; |
| (no documented sub-namespaces) | using IronPdf.Rendering; |
HTML to PDF Conversion Mappings
| PDF Duo .NET | IronPDF |
|---|---|
new DuoDimension.HtmlToPdf() |
new ChromePdfRenderer() |
conv.OpenHTML(htmlFile); conv.SavePDF(path); |
renderer.RenderHtmlFileAsPdf(htmlFile).SaveAs(path) |
conv.OpenHTML(url); conv.SavePDF(path); |
renderer.RenderUrlAsPdf(url).SaveAs(path) |
(write string to temp .html, then OpenHTML) |
renderer.RenderHtmlAsPdf(html).SaveAs(path) |
Page Configuration Mappings
DuoDimension.HtmlToPdf does not document a settings object for paper size, orientation, or margins. The IronPDF column below shows the explicit RenderingOptions equivalents.
| PDF Duo .NET | IronPDF |
|---|---|
| (no documented page-size option) | RenderingOptions.PaperSize = PdfPaperSize.A4 |
| (no documented page-size option) | RenderingOptions.PaperSize = PdfPaperSize.Letter |
| (no documented orientation option) | RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape |
| (no documented margins object) | Individual margin properties |
Margins Mappings
| PDF Duo .NET | IronPDF |
|---|---|
| (no documented margins object) | Individual properties |
| (no equivalent) | RenderingOptions.MarginTop |
| (no equivalent) | RenderingOptions.MarginRight |
| (no equivalent) | RenderingOptions.MarginBottom |
| (no equivalent) | RenderingOptions.MarginLeft |
Document Operations Mappings
PDF Duo .NET is an HTML-to-PDF converter only. The vendor product page does not document load, byte, or merge APIs on DuoDimension.HtmlToPdf. The rows below show what teams typically reached for in adjacent libraries when using PDF Duo, and the IronPDF call that consolidates that work.
| Need | PDF Duo .NET | IronPDF |
|---|---|---|
| Load existing PDF | not native — pair with iTextSharp 4.x or similar | PdfDocument.FromFile(path) |
| Save PDF | conv.SavePDF(path) |
pdf.SaveAs(path) |
| Get PDF bytes | not native | pdf.BinaryData |
| Merge PDFs | not native — pair with iTextSharp 4.x or similar | PdfDocument.Merge(pdf1, pdf2) |
New Features Not Available in PDF Duo's Documented API
| Feature | IronPDF |
|---|---|
| Headers/Footers | RenderingOptions.HtmlHeader, HtmlFooter |
| Page numbers | {page}, {total-pages} placeholders |
| Watermarks | pdf.ApplyWatermark(html) |
| Password protection | pdf.SecuritySettings |
| Form filling | pdf.Form.Fields |
| Digital signatures | pdf.SignWithFile() |
| Text extraction | pdf.ExtractAllText() |
| PDF to Image | pdf.RasterizeToImageFiles() |
Code Migration Examples
Example 1: HTML to PDF Conversion
Before (PDF Duo):
// PDF Duo .NET is not on NuGet — reference PDFDuo.dll from the vendor download.
using DuoDimension;
using System;
using System.IO;
class Program
{
static void Main()
{
// OpenHTML accepts a file path, URL, or stream; there is no documented
// "convert HTML string" call, so write the markup to a temp file first.
var tempHtml = Path.GetTempFileName() + ".html";
File.WriteAllText(tempHtml, "<h1>Hello World</h1><p>This is a PDF document.</p>");
var conv = new HtmlToPdf();
conv.OpenHTML(tempHtml);
conv.SavePDF("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
// PDF Duo .NET is not on NuGet — reference PDFDuo.dll from the vendor download.
using DuoDimension;
using System;
using System.IO;
class Program
{
static void Main()
{
// OpenHTML accepts a file path, URL, or stream; there is no documented
// "convert HTML string" call, so write the markup to a temp file first.
var tempHtml = Path.GetTempFileName() + ".html";
File.WriteAllText(tempHtml, "<h1>Hello World</h1><p>This is a PDF document.</p>");
var conv = new HtmlToPdf();
conv.OpenHTML(tempHtml);
conv.SavePDF("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
Imports DuoDimension
Imports System
Imports System.IO
Module Program
Sub Main()
' OpenHTML accepts a file path, URL, or stream; there is no documented
' "convert HTML string" call, so write the markup to a temp file first.
Dim tempHtml As String = Path.GetTempFileName() & ".html"
File.WriteAllText(tempHtml, "<h1>Hello World</h1><p>This is a PDF document.</p>")
Dim conv As New HtmlToPdf()
conv.OpenHTML(tempHtml)
conv.SavePDF("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Class
The fundamental difference here is the API pattern. PDF Duo's HtmlToPdf.OpenHTML(...) accepts a file path, URL, or stream — it does not document a "render this HTML string" call, so teams write the markup to a temp file first and then call SavePDF(path) to write to disk. IronPDF's ChromePdfRenderer.RenderHtmlAsPdf() renders the string directly and returns a PdfDocument object, which you then save with SaveAs().
This object-oriented approach provides additional flexibility: you can manipulate the PDF (add watermarks, merge documents, add security, extract text) before saving — none of which are part of PDF Duo .NET's documented API. See the HTML to PDF documentation for additional rendering options.
Example 2: URL to PDF Conversion
Before (PDF Duo):
// PDF Duo .NET is not on NuGet — reference PDFDuo.dll from the vendor download.
using DuoDimension;
using System;
class Program
{
static void Main()
{
var conv = new HtmlToPdf();
conv.OpenHTML("https://www.example.com");
conv.SavePDF("webpage.pdf");
Console.WriteLine("Webpage converted to PDF!");
}
}
// PDF Duo .NET is not on NuGet — reference PDFDuo.dll from the vendor download.
using DuoDimension;
using System;
class Program
{
static void Main()
{
var conv = new HtmlToPdf();
conv.OpenHTML("https://www.example.com");
conv.SavePDF("webpage.pdf");
Console.WriteLine("Webpage converted to PDF!");
}
}
Imports DuoDimension
Imports System
Class Program
Shared Sub Main()
Dim conv As New HtmlToPdf()
conv.OpenHTML("https://www.example.com")
conv.SavePDF("webpage.pdf")
Console.WriteLine("Webpage converted to PDF!")
End Sub
End Class
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("Webpage converted to PDF!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("Webpage converted to PDF!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("Webpage converted to PDF!")
End Sub
End Class
PDF Duo uses the same DuoDimension.HtmlToPdf class for URL conversion by passing the URL to OpenHTML(...) followed by SavePDF(path). IronPDF uses ChromePdfRenderer with the dedicated RenderUrlAsPdf(url) method, returning a PdfDocument object.
A key advantage is that IronPDF's Chromium-based rendering engine provides modern CSS3 and JavaScript support, whereas PDF Duo's vendor materials do not disclose which HTML/CSS engine is used. Learn more about URL to PDF conversion.
Example 3: PDF Merging
Before (PDF Duo):
PDF Duo .NET does not provide a native PDF-merge API. The documented surface is HTML-to-PDF only, so teams that needed to merge typically rendered each PDF with PDF Duo and then concatenated them with a separate library (commonly iTextSharp 4.x in 2010-era projects):
// PDF Duo .NET is not on NuGet — reference PDFDuo.dll from the vendor download.
using DuoDimension;
using System;
class Program
{
static void Main()
{
// Render each source HTML to its own PDF
var conv = new HtmlToPdf();
conv.OpenHTML("page1.html");
conv.SavePDF("document1.pdf");
conv = new HtmlToPdf();
conv.OpenHTML("page2.html");
conv.SavePDF("document2.pdf");
// Merging into a single PDF requires another library (e.g., iTextSharp).
Console.WriteLine("PDF Duo has no native merge — combine output with another library.");
}
}
// PDF Duo .NET is not on NuGet — reference PDFDuo.dll from the vendor download.
using DuoDimension;
using System;
class Program
{
static void Main()
{
// Render each source HTML to its own PDF
var conv = new HtmlToPdf();
conv.OpenHTML("page1.html");
conv.SavePDF("document1.pdf");
conv = new HtmlToPdf();
conv.OpenHTML("page2.html");
conv.SavePDF("document2.pdf");
// Merging into a single PDF requires another library (e.g., iTextSharp).
Console.WriteLine("PDF Duo has no native merge — combine output with another library.");
}
}
Imports DuoDimension
Imports System
Module Program
Sub Main()
' Render each source HTML to its own PDF
Dim conv As New HtmlToPdf()
conv.OpenHTML("page1.html")
conv.SavePDF("document1.pdf")
conv = New HtmlToPdf()
conv.OpenHTML("page2.html")
conv.SavePDF("document2.pdf")
' Merging into a single PDF requires another library (e.g., iTextSharp).
Console.WriteLine("PDF Duo has no native merge — combine output with another library.")
End Sub
End Module
After (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Console.WriteLine("PDFs merged successfully!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
Console.WriteLine("PDFs merged successfully!")
End Sub
End Class
This example shows a fundamental architectural difference. PDF Duo .NET has no merge API at all — merging in PDF Duo workflows historically meant pairing it with a second library such as iTextSharp 4.x.
IronPDF consolidates this into a single dependency: load each PDF as a PdfDocument using PdfDocument.FromFile(), then use the static PdfDocument.Merge() method to combine them. This returns a new PdfDocument object that you save separately with SaveAs().
The IronPDF approach also lets you manipulate any of the PDFs before merging, add watermarks to the merged result, apply security settings, and more. For merging many files, you can use LINQ:
var paths = new[] { "document1.pdf", "document2.pdf", "document3.pdf" };
var pdfs = paths.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
var paths = new[] { "document1.pdf", "document2.pdf", "document3.pdf" };
var pdfs = paths.Select(PdfDocument.FromFile).ToList();
var merged = PdfDocument.Merge(pdfs);
merged.SaveAs("merged.pdf");
Dim paths = {"document1.pdf", "document2.pdf", "document3.pdf"}
Dim pdfs = paths.Select(AddressOf PdfDocument.FromFile).ToList()
Dim merged = PdfDocument.Merge(pdfs)
merged.SaveAs("merged.pdf")
Learn more about merging and splitting PDFs.
New Capabilities After Migration
After migrating to IronPDF, you gain capabilities that PDF Duo simply cannot provide:
Headers and Footers with Page Numbers
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Company Report</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Company Report</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
MaxHeight = 25
};
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("report.pdf");
Imports IronPdf
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:center; font-size:10px;'>Company Report</div>",
.MaxHeight = 25
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>",
.MaxHeight = 25
}
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("report.pdf")
PDF Duo doesn't support headers or footers—there is no equivalent functionality. IronPDF provides full HTML/CSS support with built-in placeholders for dynamic content like page numbers. See the headers and footers guide.
Watermarks
using IronPdf;
using IronPdf.Editing;
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark(
"<h1 style='color:red; opacity:0.3;'>CONFIDENTIAL</h1>",
45,
VerticalAlignment.Middle,
HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
using IronPdf;
using IronPdf.Editing;
var pdf = PdfDocument.FromFile("document.pdf");
pdf.ApplyWatermark(
"<h1 style='color:red; opacity:0.3;'>CONFIDENTIAL</h1>",
45,
VerticalAlignment.Middle,
HorizontalAlignment.Center);
pdf.SaveAs("watermarked.pdf");
Imports IronPdf
Imports IronPdf.Editing
Dim pdf = PdfDocument.FromFile("document.pdf")
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>CONFIDENTIAL</h1>", 45, VerticalAlignment.Middle, HorizontalAlignment.Center)
pdf.SaveAs("watermarked.pdf")
PDF Duo doesn't support watermarks. IronPDF provides HTML-based watermarks with full CSS styling support.
Password Protection
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("secured.pdf");
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights;
pdf.SaveAs("secured.pdf");
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SecuritySettings.UserPassword = "userpassword"
pdf.SecuritySettings.OwnerPassword = "ownerpassword"
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.FullPrintRights
pdf.SaveAs("secured.pdf")
PDF Duo doesn't support password protection or security settings.
Text Extraction
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
var pdf = PdfDocument.FromFile("document.pdf");
string text = pdf.ExtractAllText();
Dim pdf = PdfDocument.FromFile("document.pdf")
Dim text As String = pdf.ExtractAllText()
PDF Duo doesn't support text extraction.
Critical Migration Notes
No Page-Layout Options on PDF Duo's HtmlToPdf
DuoDimension.HtmlToPdf does not document a settings object covering paper size, orientation, or margins. IronPDF exposes them explicitly on RenderingOptions:
// PDF Duo: no documented per-instance settings — OpenHTML / SavePDF only.
// IronPDF:
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginRight = 15;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 15;
// PDF Duo: no documented per-instance settings — OpenHTML / SavePDF only.
// IronPDF:
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginRight = 15;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 15;
' PDF Duo: no documented per-instance settings — OpenHTML / SavePDF only.
' IronPDF:
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 20
renderer.RenderingOptions.MarginRight = 15
renderer.RenderingOptions.MarginBottom = 20
renderer.RenderingOptions.MarginLeft = 15
Save Method Naming
Different method names for writing the file:
// PDF Duo:
conv.SavePDF("output.pdf");
// IronPDF:
pdf.SaveAs("output.pdf");
// PDF Duo:
conv.SavePDF("output.pdf");
// IronPDF:
pdf.SaveAs("output.pdf");
' PDF Duo:
conv.SavePDF("output.pdf")
' IronPDF:
pdf.SaveAs("output.pdf")
Loading Existing PDFs
PDF Duo .NET only writes PDFs — there is no documented "load existing PDF" call. To operate on an existing PDF you must move to IronPDF (or another library):
// PDF Duo: no equivalent.
// IronPDF:
var pdf = PdfDocument.FromFile("document.pdf");
// PDF Duo: no equivalent.
// IronPDF:
var pdf = PdfDocument.FromFile("document.pdf");
Imports IronPdf
Dim pdf = PdfDocument.FromFile("document.pdf")
HTML String Input
PDF Duo's OpenHTML does not document a "render this HTML string" call; teams write the markup to a temp file first. IronPDF renders strings directly:
// PDF Duo:
File.WriteAllText("temp.html", html);
var conv = new DuoDimension.HtmlToPdf();
conv.OpenHTML("temp.html");
conv.SavePDF("output.pdf");
// IronPDF:
var renderer = new ChromePdfRenderer();
renderer.RenderHtmlAsPdf(html).SaveAs("output.pdf");
// PDF Duo:
File.WriteAllText("temp.html", html);
var conv = new DuoDimension.HtmlToPdf();
conv.OpenHTML("temp.html");
conv.SavePDF("output.pdf");
// IronPDF:
var renderer = new ChromePdfRenderer();
renderer.RenderHtmlAsPdf(html).SaveAs("output.pdf");
' PDF Duo:
File.WriteAllText("temp.html", html)
Dim conv = New DuoDimension.HtmlToPdf()
conv.OpenHTML("temp.html")
conv.SavePDF("output.pdf")
' IronPDF:
Dim renderer = New ChromePdfRenderer()
renderer.RenderHtmlAsPdf(html).SaveAs("output.pdf")
Feature Comparison
| Feature | PDF Duo .NET | IronPDF |
|---|---|---|
| HTML to PDF | Yes (engine not disclosed) | Full CSS3, JavaScript |
| URL to PDF | Yes | Full with auth support |
| PDF Merging | Not in documented API | Yes |
| Headers/Footers | Not in documented API | Full HTML support |
| Page Numbers | Not in documented API | Built-in placeholders |
| Watermarks | Not in documented API | HTML-based |
| Password Protection | Not in documented API | Full security options |
| Form Filling | Not in documented API | Yes |
| Digital Signatures | Not in documented API | Yes |
| Text Extraction | Not in documented API | Yes |
| PDF to Images | Not in documented API | Yes |
| Async Support | Not in documented API | Full async/await |
| .NET Core/5+ | Not in documented runtime list | Supported |
Migration Checklist
Pre-Migration
- Find all PDF Duo references in codebase
- Document current settings (page size, margins, etc.)
- List all PDF operations used
- Identify opportunities for new features (headers, watermarks, security)
- Obtain IronPDF license key
Package Changes
- Remove the project reference to
PDFDuo.dll(PDF Duo .NET is not on NuGet) and delete the vendored binary - Install
IronPdfNuGet package:dotnet add package IronPdf - Update namespace imports from
using DuoDimension;tousing IronPdf;
Code Changes
- Add license key configuration at startup
- Replace
DuoDimension.HtmlToPdfwithChromePdfRenderer - Replace
OpenHTML(path) + SavePDF(path)withRenderHtmlFileAsPdf(path).SaveAs(path) - Replace the temp-file detour for HTML strings with
RenderHtmlAsPdf(html).SaveAs(path) - Replace
OpenHTML(url) + SavePDF(path)withRenderUrlAsPdf(url).SaveAs(path) - Replace any external merge step with
PdfDocument.Merge() - Set page size and margins explicitly via
RenderingOptions(no PDF Duo equivalent) - Replace
SavePDF()withSaveAs() - For any "load existing PDF" workflow, use
PdfDocument.FromFile()(no PDF Duo equivalent)
Post-Migration
- Run regression tests comparing PDF output
- Verify page sizes and margins match
- Test with complex HTML/CSS (IronPDF's modern engine should handle it better)
- Add new features (headers, footers, watermarks, security)
- Update documentation

