跳至页脚内容
视频

如何在 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年支持 较低的每席位费用
年度续约 ~列表价的40% (~$1,698/年/开发者) 可选支持
服务器运行时 生产需要单独的运行时许可证 不要求
用户界面组件 捆绑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
# 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
SHELL

步骤 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;
Imports TXTextControl
Imports TXTextControl.DocumentServer

' After (IronPDF)
Imports IronPdf
$vbLabelText   $csharpLabel

步骤 3:初始化许可证

在应用程序启动时添加许可证初始化:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

代码迁移示例

将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 Namespace
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

TextControl版本需要创建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);
            }
        }
    }
}
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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

TextControl需要将文件读取为字节数组,管理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);
            }
        }
    }
}
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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

TextControl需要使用特定的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
}
$vbLabelText   $csharpLabel

页眉和页脚文档中了解有关页眉和页脚选项的更多信息。

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)
$vbLabelText   $csharpLabel

问题 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)
$vbLabelText   $csharpLabel

问题 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")
$vbLabelText   $csharpLabel

问题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" .
grep -r "using TXTextControl" --include="*.cs" .
grep -r "ServerTextControl\|Load\|Save" --include="*.cs" .
SHELL

将文档邮件合并模板转换为 HTML。 注意使用HtmlHeaderFooter实现时的页眉/页脚要求。 确定任何可能需要替代解决方案的 DOCX 编辑功能。

代码更新任务

1.删除TX 文本控件NuGet 软件包

  1. 安装IronPDF NuGet包
  2. 移除ServerTextControl 上下文管理(不再需要Create()调用)
  3. RenderHtmlAsPdf 5.使用字符串插值或 Razor 将邮件合并转换为 HTML 模板
  4. 更新页眉/页脚以使用AddTextFooter
  5. 使用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导入路径。

请注意Text Control 是其各自所有者的注册商标。 本网站与 Text Control 无关、未获得其认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我