Ir para o conteúdo do rodapé
GUIAS DE MIGRAçãO

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
SHELL

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

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

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

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

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

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

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

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

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

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

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

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

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" .
SHELL

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

  1. Remova os pacotes NuGet do TX Text Control.
  2. Instale o pacote NuGet do IronPDF
  3. Remova o gerenciamento de contexto ServerTextControl (sem mais chamadas de Create())
  4. Converta carregamentos StringStreamType.HTMLFormat para RenderHtmlAsPdf
  5. Converter mala direta em modelos HTML com interpolação de strings ou Razor
  6. Atualize cabeçalhos/rodapés para usar HtmlHeaderFooter ou AddTextFooter
  7. Simplifique as configurações de página usando RenderingOptions
  8. 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.

ObserveText Control é uma marca registrada de seu respectivo proprietário. Este site não é afiliado, endossado ou patrocinado pela Text Control. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais

Equipe de Suporte Iron

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim