
如何在 C# | IronPDF 中填写和编辑 PDF 表单
TX Text Control 已成为 .NET 生态系统中一个全面的文档编辑器组件,通过嵌入式用户界面控件提供强大的 DOCX 编辑功能。 然而,对于主要需求是生成 PDF 而非完整文档编辑的开发团队来说,TextControl 的架构在 License 成本、复杂性和运行时依赖性方面带来了巨大的开销。
本指南提供了从 TextControl 到IronPDF的完整迁移路径,为评估这一过渡的 .NET 专业开发人员提供了分步说明、代码比较和实用示例。
为什么要从 TextControl 迁移?
从 TextControl 迁移的决定通常集中在工具与实际需求的匹配上。TX 文本控件从根本上说是一个文档编辑器,将 PDF 生成作为次要功能。 开发团队考虑迁移的主要原因包括
昂贵的许可证费用:单个TX Text Control .NET Server 开发者许可证为$4,198永久使用,包含一年更新/支持; 四人开发团队许可证为$8,398永久使用 + 1年(根据 textcontrol.com 的定价)。 年度订阅续费约占列表价的40%(约$1,698/年/开发者),续费窗口在到期后30天关闭。 生产部署还需要单独的服务器运行时许可证。
PDF 作为次要路径:核心架构是一个文字处理引擎(优先处理 DOCX/RTF),PDF作为导出路径而不是主要界面。
捆绑编辑器界面:TX Text Control 搭载了可能在纯服务器端PDF生成需求下不必要的DOCX编辑UI组件。
文字处理器架构:HTML导入通过文字处理管道,而不是基于Chromium的渲染器,因此HTML5/CSS3保真度通常比浏览器引擎PDF库弱。
ASP.NET 中的STA倾向:ServerTextControl 可追溯到 STA COM 风格组件模型,在 STA 兼容线程上最为可靠,这使得现代 ASP.NET Core 栈中异步/MTA 托管复杂。
复杂API:ServerTextControl上下文管理加上单独的StringStreamType / BinaryStreamType / StreamType枚举和基于选择的文档模型,为直接的PDF生成任务增加了开销。
成本比较
| 方面 | TX Text Control .NET Server | IronPDF |
|---|---|---|
| 单一开发商 | $4,198 永久使用 + 1年支持 | 一次性每开发者许可证 |
| 4人团队 | $8,398 永久使用 + 1年支持 | 较低的每席位费用 |
| 年度续约 | 可选支持 | |
| 服务器运行时 | 生产需要单独的运行时许可证 | 不要求 |
| 用户界面组件 | 捆绑DOCX编辑界面 | 以 PDF 为重点 |
##IronPDF与 TextControl:功能比较
了解架构差异有助于技术决策者评估迁移投资:
| 特征 | TX 文本控件 | 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包分发——公共包是ServerTextControl运行时通过授权的Windows安装程序/MSI或供应商的私人NuGet源分发。 移除通常意味着卸载那些安装程序分发的包加上TXTextControl.Web并卸载MSI。
# RemoveTX 文本控件packages (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:更新命名空间
将 TextControl 命名空间替换为IronPDF命名空间:
// 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 库之间的架构差异。
文本控制方法:
// 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版本需要创建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, 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需要将文件读取为字节数组,管理AppendSettings.StartWithNewSection一起连接文档。 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, 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需要使用特定的HeadersAndFooters集合。 IronPDF提供直接的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 文本控件 | 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每次操作都需要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:流类型转换
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)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工作线程、异步控制器和Linux容器中的.Net 6/7/8/9 版本下无修改运行。
文本控制迁移清单
迁移前任务
审核您的代码库,确定所有 TextControl 使用情况:
grep -r "using TXTextControl" --include="*.cs" .
grep -r "ServerTextControl\|Load\|Save" --include="*.cs" .
将文档邮件合并模板转换为 HTML。 注意使用HtmlHeaderFooter实现时的页眉/页脚要求。 确定任何可能需要替代解决方案的 DOCX 编辑功能。
代码更新任务
1.删除TX 文本控件NuGet 软件包
2. 安装IronPDF NuGet包
3. 移除ServerTextControl 上下文管理(不再需要Create()调用)
4. 将RenderHtmlAsPdf
5.使用字符串插值或 Razor 将邮件合并转换为 HTML 模板
6. 更新页眉/页脚以使用AddTextFooter
7. 使用RenderingOptions简化页面设置
8.在启动时添加许可证初始化
迁移后测试
迁移后,验证这些方面:
- 测试所有文档模板是否能正确呈现
- 必要时验证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兼容托管考虑。
无上下文管理:消除StringStreamType / BinaryStreamType / ChromePdfRenderer是无状态的。
现代渲染引擎:IronPDF的Chromium基于的渲染目标当前HTML5/CSS3/JavaScript标准,而不是文字处理引擎HTML导入路径。
Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。
相关文章


