如何在 C# 中从 TextControl 迁移到 IronPDF
从 TextControl 迁移到 IronPDF:完整的 C# 开发人员指南。
TX Text Control 已成为 .NET 生态系统中一个全面的文档编辑器组件,通过嵌入式用户界面控件提供强大的 DOCX 编辑功能。 然而,对于主要需求是生成 PDF 而非完整文档编辑的开发团队来说,TextControl 的架构在 License 成本、复杂性和运行时依赖性方面带来了巨大的开销。
本指南提供了从 TextControl 到IronPDF的完整迁移路径,为评估这一过渡的 .NET 专业开发人员提供了分步说明、代码比较和实用示例。
为什么要从 TextControl 迁移?
从 TextControl 迁移的决定通常集中在工具与实际需求的匹配上。TX 文本控件从根本上说是一个文档编辑器,将 PDF 生成作为次要功能。 开发团队考虑迁移的主要原因包括
高昂的许可费用:TextControl 采用商业许可,每位开发人员每年的费用至少为 3,398 美元。 一个四人团队预计每年需要投入约 6749 美元,服务器部署运行时 License 还需要额外费用。 每年的续订费用为 40%,这是获得更新的必要条件。
PDF as Afterthought:核心架构是文字处理,而不是 PDF。 虽然可以生成 PDF,但这只是一个附加功能,而不是核心重点,导致输出质量不尽如人意。
硬件错误:英特尔 Iris Xe 图形错误会影响较新英特尔处理器(第 11 代)的文档呈现,需要注册表解决方法。
臃肿的依赖关系:TextControl 包含文档编辑 UI 组件,如果您只关注 PDF 生成,则可能不需要这些组件。
字处理器架构:未针对现代网络应用所需的 HTML 转 PDF 工作流进行优化。
复杂的 API:ServerTextControl 上下文管理和选择模型为简单的 PDF 生成任务增加了不必要的复杂性。
成本比较
| 方面 | TX 文本控件 | IronPDF |
|---|---|---|
| 基本许可 | $3,398+ | 大幅降低 |
| 年度续约 | 必须完成 40 | 可选支持 |
| 每位开发人员 | 是 | 是 |
| 用户界面组件 | 捆绑(膨胀) | 以 PDF 为重点 |
| 3 年总成本 | $5,750+ | 低得多 |
IronPDF与 TextControl:功能比较
了解架构差异有助于技术决策者评估迁移投资:
| 特征 | TX 文本控件 | IronPDF |
|---|---|---|
| 主要重点 | DOCX 编辑 | 生成 PDF |
| 许可成本 | 每位开发人员每年 3,398 美元 | 每位开发人员一次性收费 749 美元 |
| PDF 质量 | 基本、附加功能 | 高级核心功能 |
| 硬件兼容性 | 英特尔 Iris 的已知问题 | 在所有设备上保持稳定 |
| 与用户界面集成 | 需要用户界面组件 | 没有臃肿的用户界面组件 |
| HTML/CSS 渲染 | HTML Buggy | 现代 HTML5/CSS3 |
| HTML 至 PDF | 是(二级) | 是(主要) |
| CSS 支持 | 有限的 | 完整的 CSS3 |
| JavaScript | 有限的 | 完整的 ES2024 |
| URL 至 PDF | 复杂的设置 | 本地 |
| 页眉/页脚 | 复杂的 API | 简单的 HTML |
| 邮件合并 | 专有 | HTML 模板 |
| PDF/A | 是 | 是 |
| 密码保护 | 是 | 是 |
| 数字签名 | 是 | 是 |
| 合并 PDF | 有限的 | 是 |
| 拆分 PDF | 有限的 | 是 |
| 上下文管理 | 要求 | 不需要 |
| 跨平台 | 以 Windows 为重点 | 是 |
快速入门:TextControl 到IronPDF的迁移。
迁移工作可以通过以下基本步骤立即开始。
步骤 1:替换 NuGet 软件包
删除所有 TextControl 软件包:
# Remove TX Text Control
dotnet remove package TXTextControl.TextControl
dotnet remove package TXTextControl.DocumentServer# Remove TX Text Control
dotnet remove package TXTextControl.TextControl
dotnet remove package TXTextControl.DocumentServer安装 IronPDF:
# Install IronPDF
dotnet add package IronPdf# Install IronPDF
dotnet add package IronPdf步骤 2:更新命名空间
用 IronPdf 命名空间替换 TextControl 命名空间:
// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;
// After (IronPDF)
using IronPdf;// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;
// 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"代码迁移示例
将HTML转换为PDF
最常见的使用案例展示了这些 .NET PDF 库之间的架构差异。
文本控制方法:
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
textControl.Load(html, StreamType.HTMLFormat);
textControl.Save("output.pdf", StreamType.AdobePDF);
}
}
}
}// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
textControl.Load(html, StreamType.HTMLFormat);
textControl.Save("output.pdf", StreamType.AdobePDF);
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// NuGet: Install-Package IronPdf
using IronPdf;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
}// NuGet: Install-Package IronPdf
using IronPdf;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comTextControl 版本需要创建一个 ServerTextControl 实例,调用 Create() 来初始化上下文,使用 StreamType.HTMLFormat 加载 HTML,并使用<代码>StreamType.AdobePDF</代码保存。 using块是正确处理资源的必填项。
IronPdf 完全消除了上下文管理。 ChromePdfRenderer 不需要任何初始化过程--创建、渲染 HTML 并保存。 这种架构简化减少了认知负荷和潜在的资源管理错误。
有关 HTML 转 PDF 的高级应用场景,请参阅 HTML 转 PDF 指南。
合并多个 PDF 文件
PDF 合并显示了这些库在复杂性上的另一个显著差异。
文本控制方法:
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
byte[] pdf1 = File.ReadAllBytes("document1.pdf");
textControl.Load(pdf1, StreamType.AdobePDF);
byte[] pdf2 = File.ReadAllBytes("document2.pdf");
textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append);
textControl.Save("merged.pdf", StreamType.AdobePDF);
}
}
}
}// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
byte[] pdf1 = File.ReadAllBytes("document1.pdf");
textControl.Load(pdf1, StreamType.AdobePDF);
byte[] pdf2 = File.ReadAllBytes("document2.pdf");
textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append);
textControl.Save("merged.pdf", StreamType.AdobePDF);
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// NuGet: Install-Package IronPdf
using IronPdf;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
}// NuGet: Install-Package IronPdf
using IronPdf;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comTextControl 要求将文件读入字节数组,管理 ServerTextControl 上下文,并使用 LoadAppendMode.Append 合并文档。IronPDF的PdfDocument.Merge()方法只需一次显式调用即可处理一切。
有关包括选择性页面提取在内的高级合并方案,请参阅 合并和拆分 PDF 指南。
添加页眉和页脚
带有动态页码的页眉和页脚显示了 API 复杂性的差异。
文本控制方法:
// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
textControl.Load(html, StreamType.HTMLFormat);
HeaderFooter header = new HeaderFooter(HeaderFooterType.Header);
header.Text = "Document Header";
textControl.Sections[0].HeadersAndFooters.Add(header);
HeaderFooter footer = new HeaderFooter(HeaderFooterType.Footer);
footer.Text = "Page {page} of {numpages}";
textControl.Sections[0].HeadersAndFooters.Add(footer);
textControl.Save("output.pdf", StreamType.AdobePDF);
}
}
}
}// NuGet: Install-Package TXTextControl.Server
using TXTextControl;
using System.IO;
namespace TextControlExample
{
class Program
{
static void Main(string[] args)
{
using (ServerTextControl textControl = new ServerTextControl())
{
textControl.Create();
string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
textControl.Load(html, StreamType.HTMLFormat);
HeaderFooter header = new HeaderFooter(HeaderFooterType.Header);
header.Text = "Document Header";
textControl.Sections[0].HeadersAndFooters.Add(header);
HeaderFooter footer = new HeaderFooter(HeaderFooterType.Footer);
footer.Text = "Page {page} of {numpages}";
textControl.Sections[0].HeadersAndFooters.Add(footer);
textControl.Save("output.pdf", StreamType.AdobePDF);
}
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.AddTextHeader("Document Header");
pdf.AddTextFooter("Page {page} of {total-pages}");
pdf.SaveAs("output.pdf");
}
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
string html = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.AddTextHeader("Document Header");
pdf.AddTextFooter("Page {page} of {total-pages}");
pdf.SaveAs("output.pdf");
}
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comTextControl 要求使用特定的 HeaderFooterType 枚举创建 HeaderFooter 对象,通过 textControl.Sections[0] 访问文档部分,并添加到 HeadersAndFooters 集合中。 IronPdf 通过简单的占位符语法提供了直接的 AddTextHeader 和 AddTextFooter 方法。
对于具有完全样式控制功能的基于 HTML 的页眉,IronPDF 还支持<代码>HtmlHeaderFooter</代码:
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; text-align: center; font-size: 12pt;'>
Company Report
</div>",
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; text-align: right; font-size: 10pt;'>
Page {page} of {total-pages}
</div>",
MaxHeight = 25
};renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; text-align: center; font-size: 12pt;'>
Company Report
</div>",
MaxHeight = 30
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = @"
<div style='width: 100%; text-align: right; font-size: 10pt;'>
Page {page} of {total-pages}
</div>",
MaxHeight = 25
};IRON VB CONVERTER ERROR developers@ironsoftware.com在页眉和页脚文档中了解有关页眉和页脚选项的更多信息。
TextControl API 到IronPDF映射参考
这种映射通过显示直接的 API 对应关系来加速迁移:
| TX 文本控件 | IronPDF | 备注 |
|---|---|---|
| <代码>ServerTextControl.Create()</代码 | <代码>new ChromePdfRenderer()</ 代码 | 无上下文管理 |
| <代码>tx.Load(html, StreamType.HTMLFormat)</ 代码 | <代码>renderer.RenderHtmlAsPdf(html)</代码 | 直接渲染 |
| <代码>tx.Load(url, StreamType.HTMLFormat)</ 代码 | <代码>renderer.RenderUrlAsPdf(url)</代码 | URL 支持 |
| <代码>tx.Save(path, StreamType.AdobePDF)</ 代码 | <代码>pdf.SaveAs(路径)</代码 | 简单保存 |
| <代码>SaveSettings.PDFAConformance</代码 | <代码>RenderingOptions.PdfAFormat</代码 | PDF/A |
| <代码>DocumentServer.MailMerge</代码 | HTML 模板 + Razor | 模板合并 |
| <代码>DocumentTarget.HeadersAndFooters</代码 | <代码>HtmlHeaderFooter</代码 | 页眉/页脚 |
| <代码>加载设置</代码 | <代码>渲染选项</代码 | 配置 |
| <代码>StreamType.AdobePDF</代码 | 默认输出 | 以 PDF 为主 |
常见迁移问题和解决方案
问题 1:ServerTextControl 上下文
TextControl 的每个操作都需要 Create() 和 using 块。
解决方案:IronPDF没有上下文管理:
// Just create and use
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);// Just create and use
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);IRON VB CONVERTER ERROR developers@ironsoftware.com问题 2:流类型转换
TextControl 通过 StreamType 枚举加载不同格式并转换为 PDF。
解决方案:IronPDF可直接渲染 HTML,无需进行中间格式转换:
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);IRON VB CONVERTER ERROR developers@ironsoftware.com问题 3:DOCX 模板
TextControl 使用 DOCX 文件制作邮件合并模板。
解决方案:使用 C# 字符串插值或 Razor 转换为 HTML 模板:
var data = new { CustomerName = "John Doe", InvoiceNumber = "12345", Total = "$1,500.00" };
var html = $@"
<html>
<head>
<style>
body {{ font-family: Arial; padding: 40px; }}
h1 {{ color: #333; }}
.total {{ font-size: 24px; color: green; }}
</style>
</head>
<body>
<h1>Invoice #{data.InvoiceNumber}</h1>
<p>Customer: {data.CustomerName}</p>
<p class='total'>Total: {data.Total}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");var data = new { CustomerName = "John Doe", InvoiceNumber = "12345", Total = "$1,500.00" };
var html = $@"
<html>
<head>
<style>
body {{ font-family: Arial; padding: 40px; }}
h1 {{ color: #333; }}
.total {{ font-size: 24px; color: green; }}
</style>
</head>
<body>
<h1>Invoice #{data.InvoiceNumber}</h1>
<p>Customer: {data.CustomerName}</p>
<p class='total'>Total: {data.Total}</p>
</body>
</html>";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("invoice.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.com第 4 期:Intel Iris Xe 图形错误
TextControl记录了第 11 代英特尔处理器的呈现问题,需要注册表解决方法。
解决方案:IronPDF使用 Chromium 呈现--无需硬件加速错误或注册表修改。
文本控制迁移清单
迁移前任务
审核您的代码库,确定所有 TextControl 使用情况:
grep -r "using TXTextControl" --include="*.cs" .
grep -r "ServerTextControl\|Load\|Save" --include="*.cs" .grep -r "using TXTextControl" --include="*.cs" .
grep -r "ServerTextControl\|Load\|Save" --include="*.cs" .将文档邮件合并模板转换为 HTML。 请注意使用<代码>HtmlHeaderFooter</代码实现的页眉/页脚要求。 确定任何可能需要替代解决方案的 DOCX 编辑功能。
代码更新任务
1.删除TX 文本控件NuGet 软件包 2.安装 IronPdf NuGet 软件包 3.移除 ServerTextControl 上下文管理(不再调用 Create()</code) 4.将<代码>StreamType.HTMLFormat</代码>加载转换为<代码>RenderHtmlAsPdf</代码 5.使用字符串插值或 Razor 将邮件合并转换为 HTML 模板 6.更新页眉/页脚以使用<代码>HtmlHeaderFooter</代码或 AddTextHeader/AddTextFooter 7.使用<代码>渲染选项</代码简化页面设置 8.在启动时添加许可证初始化
迁移后测试
迁移后,验证这些方面:
- 测试所有文档模板是否能正确呈现
- 必要时验证PDF/A合规性
- 测试密码保护功能
- 验证页眉/页脚是否出现在所有页面上
- 在英特尔第 11 代硬件上检查-使用 IronPdf 不再需要注册表变通方法
迁移到IronPDF的主要优势
从 TextControl 迁移到IronPDF为专注于 PDF 生成的团队提供了多项优势:
PDF优先架构:IronPDF 专为生成 PDF 量身定制,利用现代 HTML5 和 CSS3 标准提供强大的文档创建和渲染功能。
成本效益:IronPDF 的一次性定价使其随着时间的推移而大大降低了成本,尤其是与 TextControl 基于订阅的服务(每年必须续订 40%)相比。
经过验证的稳定性:各种硬件的可靠性记录,避免出现诸如使用英特尔图形处理器的 TextControl 所面临的问题。
无上下文管理:消除 ServerTextControl 创建仪式和资源处置模式。IronPDF的无状态渲染简化了代码,减少了潜在的内存泄漏。
现代渲染引擎:随着 .NET 10 和 C# 14 在 2026 年之前的采用率不断提高,IronPDF 基于 Chromium 的渲染可确保与当前和未来的网络标准兼容。
结论
TX Text Control 是一款综合性文档编辑器组件,具有完整的 DOCX 编辑功能和嵌入式用户界面控件。 然而,对于以从 HTML、URL 或数据生成 PDF 为主要需求的开发团队来说,文档编辑基础架构意味着不必要的复杂性和成本。
IronPdf 以更简单的应用程序接口、现代的 HTML5/CSS3 渲染技术和显著降低的总体拥有成本,提供专注的 PDF 生成功能。迁移路径简单明了:替换 NuGet 包,取消上下文管理,将 StreamType 操作转换为直接渲染调用。
今天就开始迁移,免费试用 IronPDF,并评估专用 PDF 生成为您的开发工作流程带来的不同。
有关全面的实施指导,请浏览 IronPDF 文档和 教程。






