
如何在 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
步驟 2:更新命名空間
用IronPDF命名空間替換 TextControl 命名空間:
// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;
// After (IronPDF)
using IronPdf;Imports TXTextControl
Imports TXTextControl.DocumentServer
' After (IronPDF)
Imports IronPdfImports 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"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 NamespaceImports 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 NamespaceIronPDF 方法:
// 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");
}
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Namespace IronPdfExample
Class Program
Shared Sub Main(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' NuGet: Install-Package IronPdf
Imports IronPdf
Namespace IronPdfExample
Class Program
Shared Sub Main(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 NamespaceTextControl 版本需要建立一個 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);
}
}
}
}' NuGet: Install-Package TXTextControl.Server
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' NuGet: Install-Package TXTextControl.Server
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 NamespaceIronPDF 方法:
// 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");
}
}
}' NuGet: Install-Package IronPdf
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' NuGet: Install-Package IronPdf
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 NamespaceTextControl 需要將文件讀取到位元組陣列,管理 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);
}
}
}
}' NuGet: Install-Package TXTextControl.Server
Imports TXTextControl
Imports System.IO
Namespace TextControlExample
Module Program
Sub Main(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 Module
End Namespace' NuGet: Install-Package TXTextControl.Server
Imports TXTextControl
Imports System.IO
Namespace TextControlExample
Module Program
Sub Main(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 Module
End NamespaceIronPDF 方法:
// 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");
}
}
}' NuGet: Install-Package IronPdf
Imports IronPdf
Imports IronPdf.Rendering
Namespace IronPdfExample
Module Program
Sub Main(args As String())
Dim renderer = 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 Module
End Namespace' NuGet: Install-Package IronPdf
Imports IronPdf
Imports IronPdf.Rendering
Namespace IronPdfExample
Module Program
Sub Main(args As String())
Dim renderer = 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 Module
End NamespaceTextControl 需要建立具有特定 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
}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)' 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)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");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")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: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" .
記錄合併郵件模板以便轉換為 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 匯入路徑。
Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。
相關文章


