如何在 C# 中將 TextControl 遷移到 IronPDF
TX Text Control 已成為 .NET 生態系統中全面的文件編輯器元件,提供強大的 DOCX 編輯功能和嵌入式 UI 控制項。 然而,對於主要需求是產生 PDF 而不是完整編輯文件的開發團隊來說,TextControl 的架構在授權成本、複雜性和執行時間依賴性方面帶來了巨大的開銷。
本指南提供了從 TextControl 到 IronPDF 的完整遷移路徑,包括逐步說明、程式碼比較和實用範例,供正在評估此過渡的專業 .NET 開發人員參考。
為什麼要從 TextControl 遷移?
從 TextControl 遷移的決定通常取決於您的工具是否符合您的實際需求。 TX 文字控制 本質上是一個文件編輯器,它將 PDF 產生視為次要功能。 開發團隊考慮遷移的主要原因包括:
昂貴的授權費用: TextControl 採用商業許可,每位開發者每年最低收費 3,398 美元。 一個四人團隊每年預計投資約 6,749 美元,此外還需要支付伺服器部署運行時許可證的費用。 續約費用每年為 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為重點 |
| 三年總成本 | 5,750美元以上 | 低得多 |
IronPDF 與 TextControl:功能對比
了解架構差異有助於技術決策者評估遷移投資:
| 特徵 | TX 文字控制 | IronPDF |
|---|---|---|
| 主要關注點 | DOCX 編輯 | PDF生成 |
| 許可證費用 | 每位開發商每年 3,398 美元 | 每位開發人員一次性支付 749 美元 |
| PDF品質 | 基本附加功能 | 高核心功能 |
| 硬體相容性 | Intel Iris 的已知問題 | 在所有設備上均穩定 |
| 與使用者介面集成 | 需要 UI 元件 | 沒有使用者介面組件臃腫 |
| HTML/CSS渲染 | HTML有缺陷 | 現代 HTML5/CSS3 |
| HTML 轉 PDF | 是的(次要的) | 是的(主要) |
| CSS 支援 | 有限的 | 完整的 CSS3 |
| JavaScript | 有限的 | 完整版 ES2024 |
| PDF檔案的URL | 複雜的設定 | 本國的 |
| 頁首/頁尾 | 複雜 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:更新命名空間
將 TextControl 命名空間替換為 IronPdf 命名空間:
// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;
// After (IronPDF)
using IronPdf;// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;
// After (IronPDF)
using IronPdf;步驟 3:初始化許可證
在應用程式啟動時新增許可證初始化:
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);
}
}
}
}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");
}
}
}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);
}
}
}
}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");
}
}
}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);
}
}
}
}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");
}
}
}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
};有關頁首和頁尾選項的更多信息,請參閱頁首和頁尾文檔。
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(path) | 簡單保存 |
SaveSettings.PDFAConformance | RenderingOptions.PdfAFormat | PDF/A |
DocumentServer.MailMerge | HTML範本 + Razor | 模板合併 |
DocumentTarget.HeadersAndFooters | HtmlHeaderFooter | 頁首/頁尾 |
LoadSettings | RenderingOptions | 配置 |
StreamType.AdobePDF | 預設輸出 | PDF是主要的 |
常見遷移問題及解決方案
問題 1:伺服器文字控制項上下文
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);問題 2:流類型轉換
TextControl透過StreamType枚舉載入不同格式並將其轉換為 PDF。
解決方案: IronPDF 直接渲染 HTML,無需中間格式轉換:
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);第三期: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");問題 4:Intel Iris Xe 顯示卡缺陷
TextControl已記錄了第 11 代英特爾處理器的渲染問題,需要透過登錄修改來解決。
解決方案: IronPDF 使用 Chromium 渲染-無需硬體加速漏洞或登錄機碼修改。
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 編輯功能。
程式碼更新任務
- 刪除 TX 文字控制項 NuGet 套件
- 安裝 IronPdf NuGet 套件
- 移除
ServerTextControl上下文管理(不再呼叫Create()) - 將
StreamType.HTMLFormat載入轉換為RenderHtmlAsPdf - 使用字串插值或 Razor 將郵件合併轉換為 HTML 模板
- 更新頁首/頁尾,使用
HtmlHeaderFooter或AddTextHeader/AddTextFooter - 使用
RenderingOptions簡化頁面設置 - 新增啟動時許可證初始化功能
遷移後測試
遷移完成後,請確認以下幾個面向:
- 測試所有文件範本是否正確渲染
- 如有需要,請驗證 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 標準的兼容性。






