How to Migrate from TallComponents to IronPDF in C#
When Apryse acquired TallComponents, the .NET PDF landscape changed significantly. With TallComponents no longer available for new licenses and existing users being redirected to iText SDK, developers using TallPDF and PDFKit face an unavoidable decision: migrate now or risk running unsupported software with known rendering bugs into 2026 and beyond.
This guide provides a complete migration path from TallComponents to IronPDF, including step-by-step instructions, API mappings, and real code examples to help professional .NET developers transition efficiently.
Why TallComponents Migration Is Now Mandatory
TallComponents was once a respected name in C# PDF generation. The library offered XML-based document workflows and programmatic PDF manipulation. However, the acquisition by Apryse brought an end to new license sales, fundamentally changing the calculus for development teams.
Critical TallComponents Limitations
The decision to migrate isn't just about vendor support—TallComponents carries significant technical debt:
Product Discontinuation: No new licenses are available since the Apryse acquisition. The official TallComponents website explicitly states that new license sales have ended, directing potential users to adopt iText SDK instead.
No HTML-to-PDF Support: Unlike modern PDF libraries, TallComponents does not support direct HTML to PDF conversions. Developers on support platforms have confirmed this limitation, pointing to third-party solutions like Pechkin as alternatives.
Documented Rendering Bugs: Changelogs reveal extensive rendering issues including blank page rendering, missing graphics, unreliable JPEG image handling, and incorrect font display. These bugs were never resolved before discontinuation.
No Support or Updates: Without active maintenance, any security vulnerabilities or compatibility issues with .NET 10 and C# 14 will remain unaddressed.
IronPDF: A Modern TallComponents Alternative
IronPDF addresses the core limitations that made TallComponents problematic for modern development workflows:
| Feature | TallComponents | IronPDF |
|---|---|---|
| Current Sale Status | Discontinued for New Sales | Actively Developed and Sold |
| HTML-to-PDF Support | No | Yes (HTML5/CSS3 with Chromium) |
| Rendering Fidelity | Known Bugs and Issues | Proven Reliability |
| Installation | Complex, Manual | Simple with NuGet |
| Customer Support | Transition to iText SDK | Active Support and Community |
| Future Usability | End-of-life | Long-term Viability |
The contrast is stark: TallComponents offers an XML-based approach from a different era of .NET development, while IronPDF provides Chromium-powered HTML rendering that aligns with how developers build applications today.
Quick Start: TallComponents to IronPDF Migration
Step 1: Replace NuGet Packages
Remove all TallComponents packages from your project:
# Remove TallComponents packages
dotnet remove package TallComponents.PDF.Kit
dotnet remove package TallComponents.PDF.Layout
dotnet remove package TallComponents.PDF.Layout.Drawing
# Remove TallComponents packages
dotnet remove package TallComponents.PDF.Kit
dotnet remove package TallComponents.PDF.Layout
dotnet remove package TallComponents.PDF.Layout.Drawing
Install IronPDF:
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
For specialized frameworks, IronPDF offers dedicated extension packages:
Blazor Server:
PM > Install-Package IronPdf.Extensions.Blazor
PM > Install-Package IronPdf.Extensions.Blazor
MAUI:
PM > Install-Package IronPdf.Extensions.Maui
PM > Install-Package IronPdf.Extensions.Maui
MVC Framework:
PM > Install-Package IronPdf.Extensions.Mvc.Framework
PM > Install-Package IronPdf.Extensions.Mvc.Framework
Step 2: Update Namespaces
Replace TallComponents namespaces with the IronPDF namespace:
// Before (TallComponents)
using TallComponents.PDF.Kit;
using TallComponents.PDF.Layout;
using TallComponents.PDF.Layout.Drawing;
using TallComponents.PDF.Layout.Paragraphs;
// After (IronPDF)
using IronPdf;
// Before (TallComponents)
using TallComponents.PDF.Kit;
using TallComponents.PDF.Layout;
using TallComponents.PDF.Layout.Drawing;
using TallComponents.PDF.Layout.Paragraphs;
// After (IronPDF)
using IronPdf;
Imports IronPdf
Step 3: Initialize Your License
Add license initialization at application startup:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
TallComponents to IronPDF API Mapping Reference
Understanding how TallComponents concepts map to IronPDF accelerates the migration process:
| TallComponents | IronPDF | Notes |
|---|---|---|
Document |
ChromePdfRenderer |
Create renderer for PDF generation |
Section |
Automatic | Sections derived from HTML structure |
TextParagraph |
HTML text elements | Use <p>, <h1>, <div>, etc. |
ImageParagraph |
<img> tag |
Standard HTML images |
TableParagraph |
HTML <table> |
Standard HTML tables |
Font |
CSS font-family |
Web fonts fully supported |
document.Write() |
pdf.SaveAs() |
Save to file |
document.Write(stream) |
pdf.BinaryData or pdf.Stream |
Stream output |
Page.Canvas |
HTML/CSS rendering | No manual canvas manipulation needed |
XmlDocument.Generate() |
RenderHtmlAsPdf() |
HTML replaces XML |
PdfKit.Merger.Merge() |
PdfDocument.Merge() |
Merge multiple PDFs |
Document.Security |
pdf.SecuritySettings |
PDF security configuration |
PageLayout |
RenderingOptions |
Page settings and margins |
Code Migration Examples
Converting HTML to PDF
TallComponents lacks native HTML-to-PDF support. The workaround involves creating fragments from text, which doesn't actually render HTML:
TallComponents Approach:
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using System.IO;
class Program
{
static void Main()
{
// Create a new document
using (Document document = new Document())
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
// Create HTML fragment
Fragment fragment = Fragment.FromText(html);
// Add to document
Section section = document.Sections.Add();
section.Fragments.Add(fragment);
// Save to file
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
document.Write(fs);
}
}
}
}
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using System.IO;
class Program
{
static void Main()
{
// Create a new document
using (Document document = new Document())
{
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
// Create HTML fragment
Fragment fragment = Fragment.FromText(html);
// Add to document
Section section = document.Sections.Add();
section.Fragments.Add(fragment);
// Save to file
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
document.Write(fs);
}
}
}
}
Imports TallComponents.PDF.Kit
Imports System.IO
Class Program
Shared Sub Main()
' Create a new document
Using document As New Document()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
' Create HTML fragment
Dim fragment As Fragment = Fragment.FromText(html)
' Add to document
Dim section As Section = document.Sections.Add()
section.Fragments.Add(fragment)
' Save to file
Using fs As New FileStream("output.pdf", FileMode.Create)
document.Write(fs)
End Using
End Using
End Sub
End Class
IronPDF Approach:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Create a PDF from HTML string
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
' Create a PDF from HTML string
Dim renderer As New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF from HTML.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
IronPDF's ChromePdfRenderer uses a genuine Chromium engine, providing full HTML5 and CSS3 support. This means your PDFs render exactly as they would appear in a modern browser. Learn more in the HTML to PDF tutorial.
Merging Multiple PDFs
PDF merging demonstrates the verbosity difference between TallComponents and IronPDF.
TallComponents Approach:
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using System.IO;
class Program
{
static void Main()
{
// Create output document
using (Document outputDoc = new Document())
{
// Load first PDF
using (FileStream fs1 = new FileStream("document1.pdf", FileMode.Open))
using (Document doc1 = new Document(fs1))
{
foreach (Page page in doc1.Pages)
{
outputDoc.Pages.Add(page.Clone());
}
}
// Load second PDF
using (FileStream fs2 = new FileStream("document2.pdf", FileMode.Open))
using (Document doc2 = new Document(fs2))
{
foreach (Page page in doc2.Pages)
{
outputDoc.Pages.Add(page.Clone());
}
}
// Save merged document
using (FileStream output = new FileStream("merged.pdf", FileMode.Create))
{
outputDoc.Write(output);
}
}
}
}
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using System.IO;
class Program
{
static void Main()
{
// Create output document
using (Document outputDoc = new Document())
{
// Load first PDF
using (FileStream fs1 = new FileStream("document1.pdf", FileMode.Open))
using (Document doc1 = new Document(fs1))
{
foreach (Page page in doc1.Pages)
{
outputDoc.Pages.Add(page.Clone());
}
}
// Load second PDF
using (FileStream fs2 = new FileStream("document2.pdf", FileMode.Open))
using (Document doc2 = new Document(fs2))
{
foreach (Page page in doc2.Pages)
{
outputDoc.Pages.Add(page.Clone());
}
}
// Save merged document
using (FileStream output = new FileStream("merged.pdf", FileMode.Create))
{
outputDoc.Write(output);
}
}
}
}
Imports TallComponents.PDF.Kit
Imports System.IO
Class Program
Shared Sub Main()
' Create output document
Using outputDoc As New Document()
' Load first PDF
Using fs1 As New FileStream("document1.pdf", FileMode.Open)
Using doc1 As New Document(fs1)
For Each page As Page In doc1.Pages
outputDoc.Pages.Add(page.Clone())
Next
End Using
End Using
' Load second PDF
Using fs2 As New FileStream("document2.pdf", FileMode.Open)
Using doc2 As New Document(fs2)
For Each page As Page In doc2.Pages
outputDoc.Pages.Add(page.Clone())
Next
End Using
End Using
' Save merged document
Using output As New FileStream("merged.pdf", FileMode.Create)
outputDoc.Write(output)
End Using
End Using
End Sub
End Class
IronPDF Approach:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Load PDFs
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(pdf1, pdf2);
// Save merged document
merged.SaveAs("merged.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
// Load PDFs
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(pdf1, pdf2);
// Save merged document
merged.SaveAs("merged.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
' Load PDFs
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
' Merge PDFs
Dim merged = PdfDocument.Merge(pdf1, pdf2)
' Save merged document
merged.SaveAs("merged.pdf")
End Sub
End Class
The TallComponents version requires manual page iteration and cloning. IronPDF reduces this to a single PdfDocument.Merge() call. For advanced merging scenarios, see the PDF merging documentation.
Adding Watermarks
Watermarking PDFs reveals another significant difference in developer experience.
TallComponents Approach:
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using TallComponents.PDF.Layout;
using System.IO;
using System.Drawing;
class Program
{
static void Main()
{
// Load existing PDF
using (FileStream fs = new FileStream("input.pdf", FileMode.Open))
using (Document document = new Document(fs))
{
// Iterate through pages
foreach (Page page in document.Pages)
{
// Create watermark text
TextShape watermark = new TextShape();
watermark.Text = "CONFIDENTIAL";
watermark.Font = new Font("Arial", 60);
watermark.PenColor = Color.FromArgb(128, 255, 0, 0);
watermark.X = 200;
watermark.Y = 400;
watermark.Rotate = 45;
// Add to page
page.Overlay.Shapes.Add(watermark);
}
// Save document
using (FileStream output = new FileStream("watermarked.pdf", FileMode.Create))
{
document.Write(output);
}
}
}
}
// NuGet: Install-Package TallComponents.PDF.Kit
using TallComponents.PDF.Kit;
using TallComponents.PDF.Layout;
using System.IO;
using System.Drawing;
class Program
{
static void Main()
{
// Load existing PDF
using (FileStream fs = new FileStream("input.pdf", FileMode.Open))
using (Document document = new Document(fs))
{
// Iterate through pages
foreach (Page page in document.Pages)
{
// Create watermark text
TextShape watermark = new TextShape();
watermark.Text = "CONFIDENTIAL";
watermark.Font = new Font("Arial", 60);
watermark.PenColor = Color.FromArgb(128, 255, 0, 0);
watermark.X = 200;
watermark.Y = 400;
watermark.Rotate = 45;
// Add to page
page.Overlay.Shapes.Add(watermark);
}
// Save document
using (FileStream output = new FileStream("watermarked.pdf", FileMode.Create))
{
document.Write(output);
}
}
}
}
Imports TallComponents.PDF.Kit
Imports TallComponents.PDF.Layout
Imports System.IO
Imports System.Drawing
Class Program
Shared Sub Main()
' Load existing PDF
Using fs As New FileStream("input.pdf", FileMode.Open)
Using document As New Document(fs)
' Iterate through pages
For Each page As Page In document.Pages
' Create watermark text
Dim watermark As New TextShape()
watermark.Text = "CONFIDENTIAL"
watermark.Font = New Font("Arial", 60)
watermark.PenColor = Color.FromArgb(128, 255, 0, 0)
watermark.X = 200
watermark.Y = 400
watermark.Rotate = 45
' Add to page
page.Overlay.Shapes.Add(watermark)
Next
' Save document
Using output As New FileStream("watermarked.pdf", FileMode.Create)
document.Write(output)
End Using
End Using
End Using
End Sub
End Class
IronPDF Approach:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
// Load existing PDF
var pdf = PdfDocument.FromFile("input.pdf");
// Create watermark
var watermark = new TextStamper()
{
Text = "CONFIDENTIAL",
FontSize = 60,
Opacity = 50,
Rotation = 45,
VerticalAlignment = VerticalAlignment.Middle,
HorizontalAlignment = HorizontalAlignment.Center
};
// Apply watermark to all pages
pdf.ApplyStamp(watermark);
// Save watermarked PDF
pdf.SaveAs("watermarked.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;
class Program
{
static void Main()
{
// Load existing PDF
var pdf = PdfDocument.FromFile("input.pdf");
// Create watermark
var watermark = new TextStamper()
{
Text = "CONFIDENTIAL",
FontSize = 60,
Opacity = 50,
Rotation = 45,
VerticalAlignment = VerticalAlignment.Middle,
HorizontalAlignment = HorizontalAlignment.Center
};
// Apply watermark to all pages
pdf.ApplyStamp(watermark);
// Save watermarked PDF
pdf.SaveAs("watermarked.pdf");
}
}
Imports IronPdf
Imports IronPdf.Editing
Class Program
Shared Sub Main()
' Load existing PDF
Dim pdf = PdfDocument.FromFile("input.pdf")
' Create watermark
Dim watermark = New TextStamper() With {
.Text = "CONFIDENTIAL",
.FontSize = 60,
.Opacity = 50,
.Rotation = 45,
.VerticalAlignment = VerticalAlignment.Middle,
.HorizontalAlignment = HorizontalAlignment.Center
}
' Apply watermark to all pages
pdf.ApplyStamp(watermark)
' Save watermarked PDF
pdf.SaveAs("watermarked.pdf")
End Sub
End Class
IronPDF's TextStamper class provides intuitive alignment options and automatic page iteration. The stamping and watermarks guide covers additional customization options.
Digital Signatures
Document signing is critical for enterprise applications.
TallComponents Approach:
using TallComponents.PDF.Kit;
using TallComponents.PDF.Kit.Signing;
Document document = new Document("unsigned.pdf");
// Load certificate
X509Certificate2 cert = new X509Certificate2("certificate.pfx", "password");
// Create signature
SignatureHandler handler = new SignatureHandler(cert);
document.Sign(handler);
document.Write("signed.pdf");
using TallComponents.PDF.Kit;
using TallComponents.PDF.Kit.Signing;
Document document = new Document("unsigned.pdf");
// Load certificate
X509Certificate2 cert = new X509Certificate2("certificate.pfx", "password");
// Create signature
SignatureHandler handler = new SignatureHandler(cert);
document.Sign(handler);
document.Write("signed.pdf");
Imports TallComponents.PDF.Kit
Imports TallComponents.PDF.Kit.Signing
Imports System.Security.Cryptography.X509Certificates
Dim document As New Document("unsigned.pdf")
' Load certificate
Dim cert As New X509Certificate2("certificate.pfx", "password")
' Create signature
Dim handler As New SignatureHandler(cert)
document.Sign(handler)
document.Write("signed.pdf")
IronPDF Approach:
using IronPdf;
using IronPdf.Signing;
var pdf = PdfDocument.FromFile("unsigned.pdf");
// Sign with certificate
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningContact = "support@company.com",
SigningLocation = "New York",
SigningReason = "Document Approval"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");
using IronPdf;
using IronPdf.Signing;
var pdf = PdfDocument.FromFile("unsigned.pdf");
// Sign with certificate
var signature = new PdfSignature("certificate.pfx", "password")
{
SigningContact = "support@company.com",
SigningLocation = "New York",
SigningReason = "Document Approval"
};
pdf.Sign(signature);
pdf.SaveAs("signed.pdf");
Imports IronPdf
Imports IronPdf.Signing
Dim pdf = PdfDocument.FromFile("unsigned.pdf")
' Sign with certificate
Dim signature = New PdfSignature("certificate.pfx", "password") With {
.SigningContact = "support@company.com",
.SigningLocation = "New York",
.SigningReason = "Document Approval"
}
pdf.Sign(signature)
pdf.SaveAs("signed.pdf")
IronPDF's signature API includes additional metadata properties for contact information, location, and signing reason—important for audit trails. Explore the digital signature documentation for complete implementation details.
Feature Comparison: TallComponents vs IronPDF
| Feature | TallComponents | IronPDF | |||
|---|---|---|---|---|---|
| Status | ❌ DISCONTINUED | ✅ Active | |||
| Support | ❌ None | ✅ Full | |||
| Updates | ❌ None | ✅ Regular | |||
| :Content Creation: | HTML to PDF | No | Full Chromium | ||
| URL to PDF | No | Yes | |||
| CSS Support | No | Full CSS3 | |||
| JavaScript | No | Full ES2024 | |||
| XML Templates | Yes | Not needed | |||
| :PDF Operations: | Merge PDFs | Yes | Yes | ||
| Split PDFs | Yes | Yes | |||
| Watermarks | Manual | Built-in | |||
| Headers/Footers | XML-based | HTML/CSS | |||
| :Security: | Password Protection | Yes | Yes | ||
| Digital Signatures | Yes | Yes | |||
| Encryption | Yes | Yes | |||
| PDF/A | Limited | Yes | |||
| :Known Issues: | Blank Pages | ⚠ Documented bug | None | ||
| Missing Graphics | ⚠ Documented bug | None | |||
| Font Problems | ⚠ Documented bug | None | |||
| :Development: | Learning Curve | High (XML) | Low (HTML) | ||
| Documentation | Outdated | Extensive | |||
| Community | None | Active |
TallComponents Migration Checklist
Pre-Migration Tasks
Audit your codebase to identify all TallComponents usage:
grep -r "using TallComponents" --include="*.cs" .
grep -r "Document\|Section\|TextParagraph" --include="*.cs" .
grep -r "using TallComponents" --include="*.cs" .
grep -r "Document\|Section\|TextParagraph" --include="*.cs" .
Document existing XML templates and layouts—these will be converted to HTML. Identify security settings currently in use, noting password configurations and digital signature implementations.
Code Update Tasks
- Remove TallComponents packages via NuGet
- Install IronPDF package
- Convert XML layouts to HTML templates
- Replace Section/Paragraph model with HTML elements
- Update table code to use standard HTML tables
- Convert headers/footers to HTML with
HtmlHeaderFooter - Update security settings to use
pdf.SecuritySettings - Add license initialization at startup
Headers and Footers Migration
TallComponents uses XML-based headers. IronPDF provides HTML-based headers with dynamic placeholders:
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Header Text</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Footer Text</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Header Text</div>",
MaxHeight = 25
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center;'>Footer Text</div>",
MaxHeight = 25
};
Imports System
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Header Text</div>",
.MaxHeight = 25
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center;'>Footer Text</div>",
.MaxHeight = 25
}
Learn more about headers and footers in IronPDF.
Testing Phase
- Compare visual output between TallComponents and IronPDF versions
- Verify blank page issues are resolved
- Test all document templates
- Validate PDF merging functionality
- Test digital signatures
- Confirm security settings apply correctly
Recommended Migration Timeline
Given that TallComponents is discontinued with no support, the migration should proceed urgently:
Week 1: Audit codebase and identify all TallComponents usage
Week 2: Convert document templates from XML to HTML
Week 3: Update security, merging, and signing code
Week 4: Testing and production deployment
Delaying means running unsupported software with documented rendering bugs—a risk no professional development team should accept heading into 2026.
Key Migration Benefits
Moving from TallComponents to IronPDF provides immediate advantages:
Modern Chromium Rendering Engine: Full CSS and JavaScript support ensures PDFs render exactly as expected, eliminating the blank page and missing graphics bugs documented in TallComponents.
Active Maintenance and Security Updates: IronPDF receives regular updates, ensuring compatibility with current and future .NET versions including .NET 10.
Better .NET Integration: Native async/await support and modern API patterns align with contemporary C# development practices.
Comprehensive Documentation: Extensive tutorials and API references support rapid implementation.

