如何用 C# 从 TallComponents 迁移到 IronPDF
从TallComponents迁移到 IronPDF:完整的 C# 开发人员指南。
当 Apryse 收购TallComponents时,.NET PDF 的格局发生了重大变化。 随着TallComponents不再提供新的许可证,现有用户被重新定向到 iText SDK,使用 TallPDF 和 PDFKit 的开发人员面临着一个不可避免的决定:要么现在迁移,要么冒着运行不支持软件的风险,因为已知的渲染错误将持续到 2026 年甚至更久。
本指南提供了从TallComponents到IronPDF的完整迁移路径,包括分步说明、API 映射和实际代码示例,以帮助专业 .NET 开发人员高效过渡。
为什么现在必须迁移 TallComponents?
TallComponents 曾经是 C# PDF 生成领域一个受人尊敬的名字。 该库提供基于 XML 的文档工作流程和程序化 PDF 操作。 然而,Apryse 的收购终止了新 License 的销售,从根本上改变了开发团队的计算方式。
TallComponents的关键限制
决定迁移的原因不仅仅是供应商的支持--TallComponents 背负着巨大的技术债务:
产品停产:Apryse 被收购后,不再提供新的许可证。TallComponents官方网站明确指出,新的许可证销售已经结束,引导潜在用户采用 iText SDK。
不支持 HTML 到 PDF:与现代的 PDF 库不同,TallComponents 不支持 HTML 到 PDF 的直接转换。 支持平台的开发人员已经证实了这一局限性,并指出可以将 Pechkin 等第三方解决方案作为替代方案。
有据可查的呈现错误:更新日志显示了大量呈现问题,包括空白页呈现、图形丢失、不可靠的 JPEG 图像处理以及不正确的字体显示。 这些错误在停产前从未解决。
无支持或更新:如果不进行积极维护,.NET 10 和 C# 14 的任何安全漏洞或兼容性问题都将得不到解决。
IronPDF:现代TallComponents的替代品。
IronPDF解决了使TallComponents在现代开发工作流程中存在问题的核心限制:
| 特征 | TallComponents | IronPDF |
|---|---|---|
| 销售现状 | 停止新销售 | 积极开发和销售 |
| 支持 HTML 转 PDF | 否 | 是(使用 Chromium 的 HTML5/CSS3) |
| 渲染保真度 | 已知错误和问题 | 久经考验的可靠性 |
| 安装 | 复杂,手动 | 简单使用 NuGet |
| 客户支持 | 过渡到 iText SDK | 积极的支持和社区 |
| 未来可用性 | 报废 | 长期可行性 |
两者形成了鲜明的对比:TallComponents 提供了不同时代的基于 XML 的 .NET 开发方法,而IronPDF则提供了 Chromium 驱动的 HTML 渲染功能,符合当今开发人员构建应用程序的方式。
快速入门:TallComponents 到IronPDF的迁移。
步骤 1:替换 NuGet 软件包
从您的项目中删除所有TallComponents软件包:
# RemoveTallComponentspackages
dotnet remove package TallComponents.PDF.Kit
dotnet remove package TallComponents.PDF.Layout
dotnet remove package TallComponents.PDF.Layout.Drawing# RemoveTallComponentspackages
dotnet remove package TallComponents.PDF.Kit
dotnet remove package TallComponents.PDF.Layout
dotnet remove package TallComponents.PDF.Layout.Drawing安装 IronPDF:
# Install IronPDF
dotnet add package IronPdf# Install IronPDF
dotnet add package IronPdf对于专业框架,IronPdf 提供专用扩展包:
Blazor 服务器:
PM > Install-Package IronPdf.Extensions.BlazorPM > Install-Package IronPdf.Extensions.BlazorMAUI:
PM > Install-Package IronPdf.Extensions.MauiPM > Install-Package IronPdf.Extensions.MauiMVC框架:
PM > Install-Package IronPdf.Extensions.Mvc.FrameworkPM > Install-Package IronPdf.Extensions.Mvc.Framework步骤 2:更新命名空间
用 IronPdf 命名空间替换TallComponents命名空间:
// 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;IRON VB CONVERTER ERROR developers@ironsoftware.com步骤 3:初始化许可证
在应用程序启动时添加许可证初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"TallComponents到IronPDFAPI 映射参考
了解TallComponents概念如何映射到IronPDF可以加速迁移过程:
| TallComponents | IronPDF | 备注 |
|---|---|---|
| <代码>文档</代码 | <代码>ChromePdfRenderer</代码 | 创建用于生成 PDF 的呈现器 |
| <代码>部分</代码 | 自动翻译 | 源自 HTML 结构的章节 |
| <代码>文本段落</代码 | HTML 文本元素 | 使用 <p>, <h1>, <div> 等。 |
| <代码>图像段落</代码 | <img> 标记 | 标准 HTML 图像 |
| <代码>表段</代码 | HTML <table> | 标准 HTML 表格 |
| <代码>字体</代码 | CSS font-family | 完全支持网络字体 |
| <代码>document.Write()</代码 | <代码>pdf.SaveAs()</代码 | 保存到文件 |
| <代码>document.Write(stream)</代码 | <代码>pdf.BinaryData</代码>或<代码>pdf.Stream</代码 | 流式输出 |
| <代码>Page.Canvas</代码 | HTML/CSS 渲染 | 无需手动操作画布 |
| <代码>XmlDocument.Generate()</代码 | <代码>RenderHtmlAsPdf()</代码 | HTML 取代 XML |
| <代码>PdfKit.Merger.Merge()</代码 | <代码>PdfDocument.Merge()</代码 | 合并多个 PDF |
| <代码>文档安全性</代码 | <代码>pdf.SecuritySettings</代码 | PDF 安全配置 |
| <代码>页面布局</代码 | <代码>渲染选项</代码 | 页面设置和页边距 |
代码迁移示例
将HTML转换为PDF
TallComponents 缺乏本地 HTML 转 PDF 支持。 变通方法包括从文本中创建片段,但实际上并不渲染 HTML:
TallComponents 方法:
// 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);
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF 的<代码>ChromePdfRenderer</代码使用真正的 Chromium 引擎,提供全面的 HTML5 和 CSS3 支持。 这意味着您的 PDF 文件将完全呈现在现代浏览器中。 了解更多信息,请参阅 HTML 转 PDF 教程。
合并多个 PDF 文件
PDF 合并演示了TallComponents和IronPDF之间的语言差异。
TallComponents 方法:
// 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);
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comTallComponents 版本需要手动进行页面迭代和克隆。IronPDF将此简化为一个<代码>PdfDocument.Merge()</代码调用。 有关高级合并方案,请参阅 IronPDF合并文档。
添加水印
PDF 水印揭示了开发人员体验的另一个显著差异。
TallComponents 方法:
// 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);
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 的 TextStamper 类提供了直观的对齐选项和自动页面迭代功能。 印章和水印指南涵盖了其他自定义选项。
数字签名
文档签名对企业应用至关重要。
TallComponents 方法:
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");IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
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");IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 的签名 API 包括联系信息、位置和签名原因的附加元数据属性--这对于审计跟踪非常重要。 探索数字签名文档,了解完整的实施细节。
功能比较:TallComponents 与IronPDF的比较。
| 特征 | TallComponents | IronPDF |
|---|---|---|
| 状态 | ❌ 停产 | ✅ 活跃 |
| 支持 | ❌ 无 | ✅ 全文 |
| 更新 | ❌ 无 | ✅ 常规 |
| 内容创建 | ||
| HTML 至 PDF | 否 | 完整的 Chromium |
| URL 至 PDF | 否 | 是 |
| CSS 支持 | 否 | 完整的 CSS3 |
| JavaScript | 否 | 完整的 ES2024 |
| XML 模板 | 是 | 不需要 |
| PDF操作 | ||
| 合并 PDF | 是 | 是 |
| 拆分 PDF | 是 | 是 |
| 水印 | 手册 | 内置 |
| 页眉/页脚 | 基于 XML | HTML/CSS |
| 安全性 | ||
| 密码保护 | 是 | 是 |
| 数字签名 | 是 | 是 |
| 加密 | 是 | 是 |
| PDF/A | 有限的 | 是 |
| 已知问题 | ||
| 空白页 | ⚠️ 文档错误 | 无 |
| 缺少图形 | ⚠️ 文档错误 | 无 |
| 字体问题 | ⚠️ 文档错误 | 无 |
| 开发 | ||
| 学习曲线 | 高(XML) | 低 (HTML) |
| 文档 | 过时 | 广泛 |
| 社区 | 无 | 活跃 |
TallComponents迁移清单
迁移前任务
审核您的代码库,确定所有TallComponents的使用情况:
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" .记录现有的 XML 模板和布局,并将其转换为 HTML。 确定当前使用的安全设置,注意密码配置和数字签名实施。
代码更新任务
1.通过 NuGet 删除TallComponents软件包 2.安装 IronPdf 软件包 3.将 XML 布局转换为 HTML 模板 4.用 HTML 元素替换章节/段落模型 5.更新表格代码以使用标准 HTML 表格 6.使用 HtmlHeaderFooter 将页眉/页脚转换为 HTML 7.更新安全设置以使用 pdf.SecuritySettings 8.在启动时添加许可证初始化
页眉和页脚迁移
TallComponents 使用基于 XML 的标头。 IronPdf 提供基于 HTML 的标题和动态占位符:
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
};IRON VB CONVERTER ERROR developers@ironsoftware.com了解有关 IronPDF 中页眉和页脚的更多信息。
测试阶段
1.比较TallComponents和IronPDF版本的可视化输出结果 2.验证空白页问题是否得到解决 3.测试所有文档模板 4.验证 PDF 合并功能 5.测试数字签名 6.确认安全设置应用正确
建议迁移时间表
鉴于TallComponents已经停产,没有任何支持,迁移工作应立即进行:
第 1 周:审核代码库并确定所有TallComponents的使用情况 第 2 周:将文档模板从 XML 转换为 HTML 第 3 周:更新安全性、合并和签署代码 第 4 周:测试和生产部署
延迟意味着运行不支持的软件,并记录渲染错误--这是任何专业开发团队在 2026 年都不能接受的风险。
主要迁移优势
从TallComponents迁移到 IronPdf 带来了立竿见影的优势:
现代 Chromium 渲染引擎:全面的 CSS 和JavaScript支持可确保 PDF 完全按照预期呈现,消除了TallComponents中记录的空白页和图形缺失 bug。
主动维护和安全更新:IronPDF 定期接受更新,确保与当前和未来的 .NET 版本(包括 .NET 10)兼容。
更好的 .NET 集成:本地 async/await 支持和现代 API 模式符合当代 C# 开发实践。
结论
Apryse 收购TallComponents为 .NET 开发人员带来了明确的迁移要求。 由于TallComponents没有新的许可证,对现有用户也没有支持,而且文档中的渲染错误永远不会得到修复,继续使用TallComponents意味着无法弥补的技术债务。
IronPDF 通过更简洁的 API、基于 HTML 的现代渲染和积极的开发,提供了直接迁移的途径。 本指南中的代码示例演示了TallComponents模式如何转化为IronPDF的对应模式--通常会大大降低复杂性。
立即开始迁移,免费试用 IronPDF,确保您的 PDF 生成基础架构获得长期成功。






