如何在 C# 中從 TextControl 轉移到 IronPDF
TX Text Control 已經成為 .NET 生態系統中的全面性文件編輯元件,提供內嵌 UI 控制的強大 DOCX 編輯功能。 然而,對於主要需求為 PDF 產生而非完整文件編輯的開發團隊而言,TextControl 的架構在 License 成本、複雜性和執行時依賴性方面帶來顯著的開銷。
本指南提供了從 TextControl 到IronPDF的完整轉換路徑,為評估此轉換的 .NET 專業開發人員提供了分步說明、程式碼比較以及實用範例。
為何要從 TextControl 遷移?
從 TextControl 遷移的決定通常是以將您的工具與實際需求相匹配為中心。TX 文字控制基本上是一個文件編輯器,將 PDF 生成視為次要功能。 開發團隊考慮遷移的主要原因包括
昂貴的授權費用: TextControl 採用商業許可,每位開發者每年最低收費 3,398 美元。 一個四人團隊預計每年投資約 6,749 美元,伺服器部署運行時 License 需額外支付費用。 每年的續約費用為 40%,這是維持更新存取權的必要條件。
PDF 是事後新增的:核心架構是文字處理,而不是 PDF。 雖然可以產生 PDF,但這只是附加功能,而非核心重點,導致輸出品質未達最佳。
硬體漏洞: Intel Iris Xe 顯示卡漏洞會影響較新的 Intel 處理器(第 11 代)中的文件渲染,需要透過登錄變通方法來解決。
臃腫的依賴項: TextControl 包含文件編輯 UI 元件,如果您只專注於產生 PDF,則可能不需要這些元件。
文字處理器架構:未針對現代 Web 應用程式所需的 HTML 到 PDF 工作流程進行最佳化。
複雜的 API: ServerTextControl 上下文管理和選擇模型為簡單的 PDF 生成任務增加了不必要的複雜性。
成本比較
| 範疇 | TX 文字控制 | IronPDF |
|---|---|---|
| 基本授權 | $3,398+ | 大幅降低 |
| 年度續約 | 必須達到 40 | 可選支援 |
| 每位開發人員 | 是 | 是 |
| UI 元件 | 捆綁式(臃腫) | 以 PDF 為主 |
| 3 年總成本 | $5,750+ | 低很多 |
IronPDFvs TextControl:功能比較
了解架構上的差異有助於技術決策者評估遷移投資:
| 特點 | TX 文字控制 | IronPDF |
|---|---|---|
| 主要焦點 | DOCX 編輯 | 生成 PDF |
| 授權費用 | 每位開發人員每年 3,398 美元 | 每位開發人員一次性 749 美元 |
| PDF 品質 | 基本、附加功能 | 高、核心功能 |
| 硬體相容性 | Intel Iris 的已知問題 | 在所有裝置上都能保持穩定 |
| 與 UI 整合 | 需要 UI 元件 | 沒有臃腫的 UI 元件 |
| HTML/CSS 渲染 | 使用 HTML 的錯誤 | 現代 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;
Imports TXTextControl
Imports TXTextControl.DocumentServer
' After (IronPDF)
Imports IronPdf
步驟 3:初始化授權
在應用程式啟動時加入授權初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
程式碼遷移範例
將 HTML 轉換為 PDF
最常見的使用案例展示了這些 .NET PDF 函式庫之間的架構差異。
TextControl 方法:
// 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);
}
}
}
}
Imports TXTextControl
Imports System.IO
Namespace TextControlExample
Class Program
Shared Sub Main(ByVal args As String())
Using textControl As New ServerTextControl()
textControl.Create()
Dim html As String = "<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)
End Using
End Sub
End Class
End Namespace
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");
}
}
}
Imports IronPdf
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End Class
End Namespace
TextControl 版本需要建立一個 ServerTextControl 實例,呼叫 Create() 初始化上下文,使用 StreamType.HTMLFormat 載入 HTML,並使用 StreamType.AdobePDF 儲存。 using 程式碼區塊是正確處置資源所必需的。
IronPDF 完全消除了上下文管理。 ChromePdfRenderer 不需要初始化儀式-建立它,渲染 HTML,然後儲存。 這種架構上的簡化可減少認知負荷和潛在的資源管理錯誤。
如需進階的 HTML 至IronPDF情境,請參閱 HTML 至 PDF 轉換指南。
合併多個 PDF 文件
PDF 合併揭示了這些函式庫在複雜性上的另一個顯著差異。
TextControl 方法:
// 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);
}
}
}
}
Imports TXTextControl
Imports System.IO
Namespace TextControlExample
Class Program
Shared Sub Main(ByVal args As String())
Using textControl As New ServerTextControl()
textControl.Create()
Dim pdf1 As Byte() = File.ReadAllBytes("document1.pdf")
textControl.Load(pdf1, StreamType.AdobePDF)
Dim pdf2 As Byte() = File.ReadAllBytes("document2.pdf")
textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append)
textControl.Save("merged.pdf", StreamType.AdobePDF)
End Using
End Sub
End Class
End Namespace
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");
}
}
}
Imports IronPdf
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim pdf1 = PdfDocument.FromFile("document1.pdf")
Dim pdf2 = PdfDocument.FromFile("document2.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End Class
End Namespace
TextControl 需要將檔案讀取到位元組數組中,管理 ServerTextControl 上下文,並使用 LoadAppendMode.Append 合併文件。IronPDF的 PdfDocument.Merge() 方法透過一次明確呼叫即可處理所有事情。
如需進階合併情境,包括選擇性抽取頁面,請參閱 合併與分割 PDF 指南。
新增頁首與頁尾
具有動態頁碼的頁首和頁尾會展示 API 複雜性的差異。
TextControl 方法:
// 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);
}
}
}
}
Imports TXTextControl
Imports System.IO
Namespace TextControlExample
Class Program
Shared Sub Main(ByVal args As String())
Using textControl As New ServerTextControl()
textControl.Create()
Dim html As String = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>"
textControl.Load(html, StreamType.HTMLFormat)
Dim header As New HeaderFooter(HeaderFooterType.Header)
header.Text = "Document Header"
textControl.Sections(0).HeadersAndFooters.Add(header)
Dim footer As New HeaderFooter(HeaderFooterType.Footer)
footer.Text = "Page {page} of {numpages}"
textControl.Sections(0).HeadersAndFooters.Add(footer)
textControl.Save("output.pdf", StreamType.AdobePDF)
End Using
End Sub
End Class
End Namespace
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");
}
}
}
Imports IronPdf
Imports IronPdf.Rendering
Namespace IronPdfExample
Class Program
Shared Sub Main(args As String())
Dim renderer As New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Document Content</h1><p>Main body text.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.AddTextHeader("Document Header")
pdf.AddTextFooter("Page {page} of {total-pages}")
pdf.SaveAs("output.pdf")
End Sub
End Class
End Namespace
TextControl 需要建立具有特定枚舉的 HeaderFooter 對象,透過 HeaderFooterType 枚舉存取文件部分,並新增至 textControl.Sections[0] 集合中。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
};
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='width: 100%; text-align: center; font-size: 12pt;'>
Company Report
</div>",
.MaxHeight = 30
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter With {
.HtmlFragment = "
<div style='width: 100%; text-align: right; font-size: 10pt;'>
Page {page} of {total-pages}
</div>",
.MaxHeight = 25
}
在 標頭和頁尾文件中瞭解更多關於標頭和頁尾選項的資訊。
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) |
tx.Save(path, StreamType.AdobePDF) |
pdf.SaveAs(path) |
SaveSettings.PDFAConformance |
RenderingOptions.PdfAFormat |
DocumentServer.MailMerge |
HTML 模板 + Razor |
DocumentTarget.HeadersAndFooters |
HtmlHeaderFooter |
LoadSettings |
RenderingOptions |
StreamType.AdobePDF |
預設輸出 |
常見的遷移問題與解決方案
問題 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);
' Just create and use
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
第 2 期:StreamType 轉換
TextControl載入不同的格式並透過 StreamType 枚舉轉換為 PDF。
解決方案:IronPDF可直接渲染 HTML,無需進行中間格式轉換:
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
Dim pdf = renderer.RenderHtmlAsPdf(html)
問題 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");
Option Strict On
Dim data = New With {Key .CustomerName = "John Doe", Key .InvoiceNumber = "12345", Key .Total = "$1,500.00"}
Dim 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>"
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("invoice.pdf")
第 4 期:Intel Iris Xe 顯示錯誤
TextControl已記錄第 11 代 Intel 處理器的呈現問題,需要註冊表變通。
解決方案:IronPDF使用 Chromium 演算法 - 不需要硬體加速 bug 或修改註冊表。
TextControl 移轉清單
遷移前的任務
審核您的程式碼庫,以辨識所有 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.安裝IronPDFNuGet 套件
- 移除
ServerTextControl上下文管理(不再呼叫Create()) - 將
StreamType.HTMLFormat載入轉換為RenderHtmlAsPdf5.使用字串插值或 Razor 將郵件合併轉換為 HTML 模板 - 更新頁首/頁腳,使用
HtmlHeaderFooter或AddTextHeader/AddTextFooter - 使用
RenderingOptions簡化頁面設置 8.在啟動時加入授權初始化
後遷移測試
轉移後,驗證這些方面:
- 測試所有文件範本是否能正確呈現
- 必要時驗證PDF/A合規性
- 測試密碼保護功能
- 確認頁首/頁腳出現在所有頁面上
- 在 Intel 第 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 標準的兼容性。

