跳至页脚内容
迁移指南

如何在 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
SHELL

安装 IronPDF:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

步骤 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
$vbLabelText   $csharpLabel

步骤 3:初始化许可证

在应用程序启动时添加许可证初始化:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

代码迁移示例

将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.com
$vbLabelText   $csharpLabel

IronPdf 方法:

// 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.com
$vbLabelText   $csharpLabel

TextControl 版本需要创建一个 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.com
$vbLabelText   $csharpLabel

IronPdf 方法:

// 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.com
$vbLabelText   $csharpLabel

TextControl 要求将文件读入字节数组,管理 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.com
$vbLabelText   $csharpLabel

IronPdf 方法:

// 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.com
$vbLabelText   $csharpLabel

TextControl 要求使用特定的 HeaderFooterType 枚举创建 HeaderFooter 对象,通过 textControl.Sections[0] 访问文档部分,并添加到 HeadersAndFooters 集合中。 IronPdf 通过简单的占位符语法提供了直接的 AddTextHeaderAddTextFooter 方法。

对于具有完全样式控制功能的基于 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
$vbLabelText   $csharpLabel

页眉和页脚文档中了解有关页眉和页脚选项的更多信息。

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
$vbLabelText   $csharpLabel

问题 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
$vbLabelText   $csharpLabel

问题 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
$vbLabelText   $csharpLabel

第 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" .
SHELL

将文档邮件合并模板转换为 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 文档教程

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。