Como migrar de TextControl para IronPDF em C#
O Controle de texto TX se consolidou como um componente abrangente de edição de documentos no ecossistema .NET , oferecendo recursos robustos de edição de DOCX com controles de interface do usuário integrados. No entanto, para equipes de desenvolvimento cuja principal necessidade é a geração de PDFs em vez da edição completa de documentos, a arquitetura do TextControl apresenta custos adicionais significativos em licenciamento, complexidade e dependências de tempo de execução.
Este guia fornece um caminho completo de migração do TextControl para o IronPDF, com instruções passo a passo, comparações de código e exemplos práticos para desenvolvedores .NET profissionais que estejam avaliando essa transição.
Por que migrar do TextControl?
A decisão de migrar do TextControl geralmente se concentra em adequar suas ferramentas às suas necessidades reais. O Controle de texto TX é fundamentalmente um editor de documentos que trata a geração de PDFs como um recurso secundário. Os principais motivos pelos quais as equipes de desenvolvimento consideram a migração incluem:
Licenciamento Caro: Uma única licença de desenvolvedor doTX Text Control .NET Serveré $4,198 perpétua com um ano de atualizações/suporte; uma licença de equipe de quatro desenvolvedores é $8,398 perpétua + 1 ano (segundo preços no textcontrol.com). Renovações de assinatura anual correm ~40% do preço de tabela (cerca de $1,698/ano/desenvolvedor), e a janela de renovação fecha 30 dias após o vencimento. A implantação de produção também requer licenças separadas de tempo de execução do servidor.
PDF como Caminho Secundário: A arquitetura central é um motor de processamento de palavras (DOCX/RTF primeiro), com PDF como uma rota de exportação ao invés da superfície principal.
Superfície de Editor Integrada: O Controle de texto TX é fornecido com componentes de UI de edição DOCX que podem ser desnecessários quando o requisito é puramente geração de PDF do lado do servidor.
Arquitetura de Processador de Palavras: A importação de HTML passa por um pipeline de processamento de palavras, ao invés de um renderizador baseado em Chromium, portanto, a fidelidade HTML5/CSS3 é tipicamente mais fraca do que uma biblioteca PDF de motor de navegador.
Compatibilidade STA em ASP.NET: O ServerTextControl tem suas raízes em um modelo de componente COM estilo STA e é mais confiável em threads compatíveis com STA, o que complica o hosting async/MTA em stacks ASP.NET Core modernos.
API Complexa: O gerenciamento de contexto ServerTextControl, além de enums StringStreamType / BinaryStreamType / StreamType separadas e um modelo de documento orientado por seleção, adicionam sobrecarga para tarefas simples de geração de PDF.
Comparação de custos
| Aspecto | TX Text Control .NET Server | IronPDF |
|---|---|---|
| Desenvolvedor único | $4,198 perpétua + 1 ano de suporte | Licença única por desenvolvedor |
| Equipe de 4 | $8,398 perpétua + 1 ano de suporte | Menor por assento |
| Renovação anual | ~40% do preço de tabela (~$1,698/desenvolvedor/ano) | Suporte opcional |
| Runtime do servidor | Licença de tempo de execução separada necessária para produção | Não é necessário |
| Componentes de interface do usuário | Superfície do editor DOCX integrada | com foco em PDF |
IronPDF vs TextControl: Comparação de Recursos
Compreender as diferenças arquitetônicas ajuda os responsáveis pelas decisões técnicas a avaliar o investimento em migração:
| Recurso | Controle de texto TX | IronPDF |
|---|---|---|
| Foco principal | DOCX / processamento de palavras | Geração de PDF |
| Custo da licença (apenas um desenvolvedor) | $4,198 perpétua + 1 ano; ~40%/ano renovação | Licença única por desenvolvedor |
| Geração de PDF | Caminho de exportação em um motor de processamento de palavras | Funcionalidade principal |
| Licença de tempo de execução do servidor | Necessário para produção | Não é necessário |
| Threading | Compatibilidade STA em ASP.NET | Sem requisito de STA |
| Renderização HTML/CSS | Importação de HTML via pipeline de processamento de palavras | Chromium HTML5/CSS3 |
| HTML para PDF | Sim (secundário) | Sim (primário) |
| Suporte a CSS | Limitado | CSS3 completo |
| JavaScript | Limitado | ES2024 completo |
| URL para PDF | Configuração complexa | Nativo |
| Cabeçalhos/Rodapés | API complexa | HTML simples |
| Mala direta | Proprietário | Modelos HTML |
| PDF/A | Sim | Sim |
| Proteção por senha | Sim | Sim |
| Assinaturas digitais | Sim | Sim |
| Mesclar PDFs | Limitado | Sim |
| Dividir PDFs | Limitado | Sim |
| Gestão de Contexto | Obrigatório | Não é necessário |
| Multiplataforma | Focado no Windows | Windows / Linux / macOS / Docker |
Guia rápido: Migração do TextControl para o IronPDF
A migração pode começar imediatamente com esses passos fundamentais.
Passo 1: Substituir pacotes NuGet
O runtime sem interface do Controle de texto TX não é distribuído como um único pacote publico NuGet — o pacote publico é TXTextControl.Web (o editor companheiro), e o ServerTextControl runtime atual é entregue via o instalador licenciado do Windows/MSI ou pelo feed privado de NuGet do fornecedor. A remoção geralmente significa desinstalar aqueles pacotes enviados pelo instalador, além de TXTextControl.Web e desinstalar o MSI.
# Remove Controle de texto TX packages (names depend on which were installed
# from the licensed installer / private feed / public NuGet)
dotnet remove package TXTextControl.Web
# Then install IronPDF(single self-contained package)
dotnet add package IronPdf
# Remove Controle de texto TX packages (names depend on which were installed
# from the licensed installer / private feed / public NuGet)
dotnet remove package TXTextControl.Web
# Then install IronPDF(single self-contained package)
dotnet add package IronPdf
Etapa 2: Atualizar Namespaces
Substitua namespaces TextControl pelo namespace 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
Etapa 3: Inicializar a licença
Adicionar inicialização de licença na inicialização do aplicativo:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Exemplos de migração de código
Converter HTML para PDF
O caso de uso mais comum demonstra a diferença arquitetônica entre essas bibliotecas PDF for .NET .
Abordagem 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
Abordagem 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
A versão TextControl requer criar uma instância ServerTextControl, chamar Create() para inicializar o contexto, carregar HTML com StreamType.HTMLFormat e salvar com StreamType.AdobePDF. O bloco using é obrigatório para o descarte correto dos recursos.
O IronPDF elimina completamente o gerenciamento de contexto. O ChromePdfRenderer não requer cerimônia de inicialização — crie-o, renderize o HTML e salve. Essa simplificação arquitetônica reduz a carga cognitiva e os potenciais problemas de gerenciamento de recursos.
Para cenários avançados de conversão de HTML para PDF, consulte o guia de conversão de HTML para PDF .
Unir vários PDFs
A fusão de PDFs revela outra diferença significativa de complexidade entre essas bibliotecas.
Abordagem 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
Abordagem 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 requer leitura de arquivos em arrays de bytes, gerenciamento do contexto ServerTextControl e chamar Append com BinaryStreamType.AdobePDF e AppendSettings.StartWithNewSection para concatenar documentos. O método PdfDocument.Merge() do IronPDF lida com tudo em uma única chamada explícita.
Para cenários avançados de mesclagem, incluindo extração seletiva de páginas, consulte o guia de mesclagem e divisão de PDFs .
Adicionando cabeçalhos e rodapés
Cabeçalhos e rodapés com numeração de páginas dinâmica demonstram a diferença na complexidade da API.
Abordagem 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
Abordagem 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 requer a criação de objetos HeaderFooter com enums HeaderFooterType específicos, acessando seções de documentos através de textControl.Sections[0] e adicionando à coleção HeadersAndFooters.IronPDF fornece métodos diretos AddTextHeader e AddTextFooter (via TextHeaderFooter) com sintaxe simples de placeholder.
Para cabeçalhos baseados em HTML com controle completo de estilo,IronPDF também suporta 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
}
Saiba mais sobre as opções de cabeçalho e rodapé na documentação de cabeçalhos e rodapés .
Referência de mapeamento da API TextControl para IronPDF
Este mapeamento acelera a migração ao mostrar equivalentes diretos da API:
| Controle de texto 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 |
Modelos HTML + Razor |
HeaderFooter + Sections[i].HeadersAndFooters |
HtmlHeaderFooter / TextHeaderFooter |
LoadSettings |
RenderingOptions |
StreamType.AdobePDF |
Saída padrão |
Problemas e soluções comuns em migrações
Problema 1: Contexto do ServerTextControl
TextControl requer Create() e bloco using para cada operação.
Solução: O IronPDF não possui gerenciamento de contexto.
// 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)
Problema 2: Conversões de StreamType
TextControl lida com três enums diferentes — StringStreamType para sobrecargas de string, BinaryStreamType para sobrecargas de byte[] e StreamType para Save do caminho do arquivo — para carregar diferentes formatos e exportar para PDF.
Solução: O IronPDF renderiza HTML diretamente, sem conversão de formato intermediária:
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
Dim pdf = renderer.RenderHtmlAsPdf(html)
Edição 3: Modelos DOCX
O TextControl utiliza arquivos DOCX para modelos com mala direta.
Solução: Converter para modelos HTML com interpolação de strings em C# ou Razor:
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")
Questão 4: Compatibilidade STA em ASP.NET
TextControl ServerTextControl historicamente remonta a um modelo de componente estilo STA COM e é mais confiável quando hospedado em threads compatíveis com STA (por exemplo, [ASPCOMPAT] em Web Forms clássicos, ou empacotando chamadas em um thread/fila STA dedicado no ASP.NET Core). Misturar isso livremente com threads de trabalho MTA pode produzir erros de afinidade de thread ocasionais sob carga.
Solução:IronPDF não tem requisito de STA e roda sem modificação em threads de trabalho MTA, em controladores async e dentro de contêineres Linux sob .NET 6/7/8/9.
Lista de verificação para migração do TextControl
Tarefas pré-migração
Faça uma auditoria em seu código-fonte para identificar todos os usos do controle 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" .
Modelos de mala direta para conversão em HTML. Observe os requisitos de cabeçalho/rodapé para implementação com HtmlHeaderFooter. Identifique qualquer funcionalidade de edição de DOCX que possa exigir soluções alternativas.
Tarefas de atualização de código
- Remova os pacotes NuGet do TX Text Control.
- Instale o pacote NuGet do IronPDF
- Remova o gerenciamento de contexto
ServerTextControl(sem mais chamadas deCreate()) - Converta carregamentos
StringStreamType.HTMLFormatparaRenderHtmlAsPdf - Converter mala direta em modelos HTML com interpolação de strings ou Razor
- Atualize cabeçalhos/rodapés para usar
HtmlHeaderFooterouAddTextFooter - Simplifique as configurações de página usando
RenderingOptions - Adicionar inicialização de licença na inicialização
Testes pós-migração
Após a migração, verifique os seguintes aspectos:
- Teste se todos os modelos de documento são renderizados corretamente.
- Verificar a conformidade com o padrão PDF/A, se necessário.
- Testar a funcionalidade de proteção por senha
- Verificar se os cabeçalhos/rodapés aparecem em todas as páginas.
- Verifique o hosting ASP.NET Core em threads de trabalho MTA e contêineres Linux —IronPDF não tem requisito de afinidade STA
Principais benefícios da migração para o IronPDF
A migração do TextControl para o IronPDF oferece diversas vantagens para equipes focadas na geração de PDFs:
Arquitetura Primeiro para PDF: O IronPDF é adaptado especificamente para geração de PDFs, oferecendo capacidades de criação e renderização de documentos aproveitando os padrões modernos de HTML5 e CSS3.
Eficiência de Custo: O preço único por desenvolvedor do IronPDF é comparativamente favorável ao doTX Text Control .NET Serverde $4,198 perpétua + 1 ano no nível de entrada e modelo de renovação ~40%/ano, particularmente uma vez que o licenciamento de tempo de execução do servidor separado é levado em consideração.
Sem Compatibilidade de STA: O IronPDF roda em threads de trabalho MTA padrão no ASP.NET Core, controladores async, e contêineres Linux sem as considerações de hosting compatível com STA que o ServerTextControl herda de seu modelo de threading estilo COM.
Sem Gerenciamento de Contexto: Elimine a cerimônia de criação do ServerTextControl e a dança de carga/salvamento de três enums (StringStreamType / BinaryStreamType / StreamType) — ChromePdfRenderer é sem estado.
Motor de Renderização Moderno: O motor baseado em Chromium do IronPDF visa padrões atuais de HTML5/CSS3/JavaScript ao invés de um caminho de importação HTML de motor de processamento de palavras.

