迁移指南 如何在 C# 中从 TextControl 迁移到 IronPDF Curtis Chau 已发布:2026年2月1日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 TX Text Control 已成为 .NET 生态系统中一个全面的文档编辑器组件,通过嵌入式用户界面控件提供强大的 DOCX 编辑功能。 然而,对于主要需求是生成 PDF 而非完整文档编辑的开发团队来说,TextControl 的架构在 License 成本、复杂性和运行时依赖性方面带来了巨大的开销。 本指南提供了从 TextControl 到IronPDF的完整迁移路径,为评估这一过渡的 .NET 专业开发人员提供了分步说明、代码比较和实用示例。 为什么要从 TextControl 迁移? 从 TextControl 迁移的决定通常集中在工具与实际需求的匹配上。TX 文本控件从根本上说是一个文档编辑器,将 PDF 生成作为次要功能。 开发团队考虑迁移的主要原因包括 昂贵的许可费用: TextControl 采用商业许可,每位开发者每年最低收费 3,398 美元。 一个四人团队预计每年需要投入约 6749 美元,服务器部署运行时 License 还需要额外费用。 每年的续订费用为 40%,这是获得更新的必要条件。 PDF 是事后添加的:核心架构是文字处理,而不是 PDF。 虽然可以生成 PDF,但这只是一个附加功能,而不是核心重点,导致输出质量不尽如人意。 硬件漏洞: Intel Iris Xe 显卡漏洞会影响较新的 Intel 处理器(第 11 代)中的文档渲染,需要通过注册表变通方法来解决。 臃肿的依赖项: TextControl 包含文档编辑 UI 组件,如果您只专注于生成 PDF,则可能不需要这些组件。 文字处理器架构:未针对现代 Web 应用程序所需的 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; $vbLabelText $csharpLabel 步骤 3:初始化许可证 在应用程序启动时添加许可证初始化: 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); } } } } $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"); } } } $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); } } } } $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"); } } } $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); } } } } $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"); } } } $vbLabelText $csharpLabel TextControl 要求使用特定的 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 }; $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); $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); $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"); $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.将<code>StreamType.HTMLFormat</code>加载转换为<code>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 使用 Intel 显卡时遇到的问题。 无需上下文管理:消除ServerTextControl创建过程和资源处置模式。IronPDF的无状态渲染简化了代码,减少了潜在的内存泄漏。 现代渲染引擎:随着 .NET 10 和 C# 14 的普及,IronPDF 基于 Chromium 的渲染技术确保了与当前和未来 Web 标准的兼容性。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 Scryber.Core 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 Scryber.Core 迁移到 IronPDF 的方法。从自定义 XML/HTML 解析转换到现代 Chromium 渲染器。包括 HTML 转换、URL 呈现和替换专有绑定的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多 如何用 C# 从 TuesPechkin 迁移到 IronPDF如何用 C# 从 Telerik Reporting ...
已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 Scryber.Core 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 Scryber.Core 迁移到 IronPDF 的方法。从自定义 XML/HTML 解析转换到现代 Chromium 渲染器。包括 HTML 转换、URL 呈现和替换专有绑定的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多