如何在 C# | IronPDF 中填寫和編輯 PDF 表單
TX Text Control 已經在 .NET 生態系統中建立了一個全面的文件編輯元件,提供強大的 DOCX 編輯功能,並配有嵌入式 UI 控制項。 然而,對於主要需求是 PDF 生成而不是完整文件編輯的開發團隊來說,TextControl 的架構在授權成本、複雜性和運行時依賴性方面帶來了顯著的開銷。
本指南為專業 .NET 開發人員提供了從 TextControl 遷移到IronPDF的完整遷移路徑,包含逐步說明、程式碼比較和實際的例子,供評估此轉變。
為什麼從 TextControl 遷移
從 TextControl 遷移的決定通常集中在將您的工具與實際需求相匹配。TX Text Control本質上是一個文件編輯器,其將 PDF 生成視為次要功能。 開發團隊考慮遷移的主要原因包括:
昂貴的授權: 單一TX Text Control .NET Server開發者授權為 $4,198,永久授權並附一年更新/支援; 四個開發者的團隊授權為 $8,398,永久授權加一年的支援(來自 textcontrol.com 的價格)。 年度訂閱續期約為列表價的 40%(大約 $1,698/年/開發者),續約窗口在到期後 30 天內關閉。 生產部署還需要單獨的伺服器運行時授權。
PDF 作為次要路徑: 核心架構是文字處理引擎(優先處理 DOCX/RTF), PDF 作為匯出途徑而不是主要表面。
捆綁的編輯器表面:TX Text Control配有 DOCX 編輯 UI 組件,當僅需伺服器端 PDF 生成時,這些可能是不必要的。
文字處理架構: HTML 導入是通過文字處理管道而不是基於 Chromium 的渲染,因此 HTML5/CSS3 的忠實度通常會比瀏覽器引擎的 PDF 程式庫更弱。
ASP.NET 中的 STA 相容性: ServerTextControl 可以追溯到 하나 STA COM 風格的組件模型,在與 STA 相容的執行緒上最為可靠,這 complicates 現代 ASP.NET Core 堆棧中的非同步/MTA 託管。
複雜的 API: ServerTextControl 的上下文管理加上單獨的 StringStreamType / BinaryStreamType / StreamType 枚舉和選擇驅動的文件模型,使簡單的 PDF 生成任務增加了負擔。
成本比較
| 方面 | TX Text Control .NET Server | IronPDF |
|---|---|---|
| 單一開發者 | $4,198 永久 + 1年支援 | 一次性的開發者授權 |
| 4人團隊 | $8,398 永久 + 1年支援 | 每個席位較低 |
| 年度續期 | 列表價約 40% (約 $1,698/開發者/年) | 可選支援 |
| 伺服器運行時 | 生產需要單獨的運行時授權 | 不需要 |
| UI 組件 | 綁定的 DOCX 編輯器表面 | 專注於 PDF |
IronPDFvs TextControl: 功能比較
了解結構差異有助於技術決策者評估遷移投資:
| 功能 | TX Text Control | IronPDF |
|---|---|---|
| 主要焦點 | DOCX / 文字處理 | PDF生成 |
| 授權費用 (單一開發者) | $4,198 永久 + 1 年; ~40%/年 續期 | 一次性的開發者授權 |
| PDF 生成 | 文字處理引擎上的匯出路徑 | 核心功能 |
| 伺服器運行時授權 | 生產需要 | 不需要 |
| 執行緒 | ASP.NET 中的 STA 相容性 | 不需要 STA |
| HTML/CSS 渲染 | 通過文字處理管道匯入 HTML | Chromium HTML5/CSS3 |
| HTML轉PDF | 是(次要) | 是(主要) |
| CSS支持 | 有限 | 完整支持 CSS3 |
| JavaScript | 有限 | 完整的ES2024 |
| URL到PDF | 複雜的設置 | 本機 |
| 頁眉/頁腳 | 複雜的API | 簡單的HTML |
| 合併郵件 | 專有的 | HTML 模板 |
| PDF/A | 是 | 是 |
| 密碼保護 | 是 | 是 |
| 數位簽名 | 是 | 是 |
| 合併PDF | 有限 | 是 |
| 拆分PDF | 有限 | 是 |
| 上下文管理 | 必需的 | 不需要 |
| 跨平臺 | Windows 為主 | Windows / Linux / macOS / Docker |
快速開始:從 TextControl 到IronPDF的遷移
可以立即透過這些基本步驟開始遷移。
步驟 1:替換 NuGet 套件
TX Text Control 的無頭伺服器運行時並未作為單一公開的 NuGet 包分發 —— 公開包是 TXTextControl.Web(編輯器伴侶),而實際的 ServerTextControl 運行時則通過授權的 Windows 安裝程式/MSI 或廠商的私人 NuGet 提供。 移除通常意味著解除安裝這些由安裝程式提供的包加上 TXTextControl.Web 並解除安裝 MSI。
# RemoveTX Text Controlpackages (names depend on which were installed
# from the licensed installer / private feed / public NuGet)
dotnet remove package TXTextControl.Web
# Then installIronPDF(single self-contained package)
dotnet add package IronPdf
# RemoveTX Text Controlpackages (names depend on which were installed
# from the licensed installer / private feed / public NuGet)
dotnet remove package TXTextControl.Web
# Then installIronPDF(single self-contained package)
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, StringStreamType.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, StringStreamType.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, StringStreamType.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 到 PDF 的場景,請參見 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, BinaryStreamType.AdobePDF);
byte[] pdf2 = File.ReadAllBytes("document2.pdf");
textControl.Append(pdf2, BinaryStreamType.AdobePDF, AppendSettings.StartWithNewSection);
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, BinaryStreamType.AdobePDF);
byte[] pdf2 = File.ReadAllBytes("document2.pdf");
textControl.Append(pdf2, BinaryStreamType.AdobePDF, AppendSettings.StartWithNewSection);
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, BinaryStreamType.AdobePDF)
Dim pdf2 As Byte() = File.ReadAllBytes("document2.pdf")
textControl.Append(pdf2, BinaryStreamType.AdobePDF, AppendSettings.StartWithNewSection)
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 上下文,並用 Append 與 BinaryStreamType.AdobePDF 和 AppendSettings.StartWithNewSection 呼叫來連接文件。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, StringStreamType.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, StringStreamType.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, StringStreamType.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 需要建立具有特定 HeaderFooterType 枚舉的 HeaderFooter 物件,通過 textControl.Sections[0] 存取文件部分,並新增到 HeadersAndFooters 集合中。IronPDF提供直接的 AddTextHeader 和 AddTextFooter 方法(通過 TextHeaderFooter),並且使用簡單的位置符號。
要達成基於 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 Text Control | IronPDF |
|---|---|
ServerTextControl.Create() |
new ChromePdfRenderer() |
tx.Load(html, StringStreamType.HTMLFormat) |
renderer.RenderHtmlAsPdf(html) |
tx.Load(bytes, BinaryStreamType.AdobePDF) |
PdfDocument.FromFile(...) / FromBinaryData(...) |
tx.Save(path, StreamType.AdobePDF) |
pdf.SaveAs(path) |
tx.Append(bytes, BinaryStreamType.AdobePDF, AppendSettings.StartWithNewSection) |
PdfDocument.Merge(a, b) |
SaveSettings.PDFAConformance |
RenderingOptions.PdfAFormat |
DocumentServer.MailMerge |
HTML 模板 + Razor |
HeaderFooter + Sections[i].HeadersAndFooters |
HtmlHeaderFooter / TextHeaderFooter |
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 需要在三個不同枚舉中切換——對字串重載使用 StringStreamType,對位元組[]重載使用 BinaryStreamType,對文件路徑保存使用 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");
Imports IronPdf
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 As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("invoice.pdf")
問題 4:ASP.NET 中的 STA 相容性
TextControl ServerTextControl 歷史上可追溯到一個 STA COM 風格的組件模型,並且當在與 STA 相容的執行緒上託管時最為可靠(如在經典 Web Forms 中使用 [ASPCOMPAT],或者在 ASP.NET Core 中將呼叫包裝在專用的 STA 執行緒/隊列中)。 將其自由與 MTA 工作者執行緒混合使用可能在負載下產生偶發的執行緒相容性錯誤。
解決方案:IronPDF沒有 STA 要求,且能在 MTA 工作者執行緒、異步控制器以及 .NET 6/7/8/9 下的 Linux 容器中正常運行。
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 Text ControlNuGet 包
- 安裝IronPDFNuGet 套件
- 移除
ServerTextControl上下文管理(不再需要Create()呼叫) - 將
StringStreamType.HTMLFormat載入轉換為RenderHtmlAsPdf - 將合併郵件轉換為帶有字串插值或 Razor 的 HTML 模板
- 更新頁眉/頁腳以使用
HtmlHeaderFooter或AddTextFooter - 使用
RenderingOptions簡化頁面設置 - 在啟動時新增授權初始化
遷移後測試
遷移後,驗證以下方面:
- 測試所有文件模板正確渲染
- 驗證PDF/A合規性是否必要
- 測試密碼保護功能
- 驗證頁眉/頁腳是否顯示在所有頁面上
- 驗證 ASP.NET Core 在 MTA 工作用執行緒上的托管以及 Linux 容器——IronPDF 沒有 STA 相容性需求
遷移到IronPDF的關鍵好處
從 TextControl 遷移到IronPDF為專注於 PDF 生成的團隊提供了多種優勢:
PDF 優先架構:IronPDF是專為 PDF 生成而設計,通過利用現代 HTML5 和 CSS3 標準,提供文件建立和渲染能力。
成本效益:IronPDF的一次性開發者定價與TX Text Control .NET Server的 $4,198 勝過+ 1年入門級別和 ~40%/年續用模式對比,特別是當考慮到單獨的伺服器運行時授權時。
無 STA 相容性:IronPDF可在 ASP.NET Core 的標準 MTA 工作者執行緒、異步控制器和 Linux 容器中運行,不需要 ServerTextControl 從其 COM 風格執行緒模型繼承的 STA 相容性託管考慮。
無上下文管理: 消除 @ @--CODE-5072--@@ 的建立儀式和三枚舉 (StringStreamType / BinaryStreamType / StreamType) 載入/保存舞 – ChromePdfRenderer 是無狀態的。
現代渲染引擎:IronPDF的 Chromium-based 渲染針對當前的 HTML5/CSS3/JavaScript 標準而非文字處理引擎 HTML 匯入路徑。

