Passer au contenu du pied de page
VIDéOS

Comment remplir et éditer des formulaires PDF en C# | IronPDF

TX Text Control s'est imposé comme un composant d'édition de documents complet dans l'écosystème .NET, offrant de solides capacités d'édition DOCX avec des contrôles d'interface utilisateur intégrés. Cependant, pour les équipes de développement dont le besoin principal est la génération de PDF plutôt que l'édition complète de documents, l'architecture de TextControl présente des frais généraux importants en termes de coûts de licence, de complexité et de dépendances d'exécution.

Ce guide fournit un chemin de migration complet de TextControl à IronPDF, avec des instructions étape par étape, des comparaisons de code et des exemples pratiques pour les développeurs .NET professionnels qui évaluent cette transition.

Pourquoi migrer de TextControl

La décision de migrer à partir de TextControl est généralement centrée sur l'adaptation de votre outil à vos besoins réels. Contrôle de texte TXest fondamentalement un éditeur de documents qui traite la génération de PDF comme une fonctionnalité secondaire. Les principales raisons pour lesquelles les équipes de développement envisagent la migration sont les suivantes

Licences Coûteuses : Une licence développeur serveur Contrôle de texte TX.NET unique coûte 4 198 $ en perpétuel avec un an de mises à jour/assistance ; une licence d'équipe de quatre développeurs coûte 8 398 $ en perpétuel + 1 an (selon les prix sur textcontrol.com). Les renouvellements annuels d'abonnement représentent environ 40 % du prix de liste (environ 1 698 $/an/développeur), et la fenêtre de renouvellement se ferme 30 jours après l'expiration. Le déploiement en production nécessite également des licences d'exécution serveur distinctes.

PDF comme Chemin Secondaire : L'architecture centrale est un moteur de traitement de texte (DOCX/RTF en premier), avec PDF comme une route d'exportation plutôt que la surface principale.

Surface de l'Éditeur Groupé : Contrôle de texte TXest livré avec des composants d'édition DOCX qui peuvent être inutiles lorsque le besoin est purement la génération de PDF côté serveur.

Architecture de Traitement de Texte : L'importation HTML passe par un pipeline de traitement de texte plutôt qu'un rendu basé sur Chromium, donc la fidélité HTML5/CSS3 est généralement plus faible qu'une bibliothèque de PDF à moteur de navigateur.

Affinity STA dans ASP.NET : ServerTextControl remonte à un modèle de composant de style COM STA et est le plus fiable sur des threads compatibles STA, ce qui complique l'hébergement async/MTA dans les piles ASP.NET Core modernes.

API complexe : La gestion du contexte de ServerTextControl ainsi que les enums StringStreamType / BinaryStreamType / StreamType séparés et un modèle de document basé sur la sélection ajoutent de la lourdeur pour des tâches de génération de PDF simples.

Comparaison des coûts

Aspect TX Text Control .NET Server IronPDF
Développeur unique 4 198 $ perpétuel + 1 an de support Licence unique par développeur
Équipe de 4 8 398 $ perpétuel + 1 an de support Moins par place
Renouvellement annuel ~40 % de la liste (~1 698 $/dével./an) Support optionnel
Exécution serveur Licence d'exécution distincte requise pour la production Non requis
Composants de l'interface utilisateur Surface d'éditeur DOCX groupée Axé sur le PDF

IronPDF vs TextControl : Comparaison des fonctionnalités

La compréhension des différences architecturales aide les décideurs techniques à évaluer l'investissement dans la migration :

Fonction Contrôle de texte TX IronPDF
Objectif principal DOCX / traitement de texte Génération PDF
Coût de la licence (développeur unique) 4 198 $ perpétuel + 1 an ; ~40 %/an renouvellement Licence unique par développeur
Génération PDF Chemin d'exportation sur un moteur de traitement de texte Fonctionnalité de base
Licence d'exécution serveur Requise pour la production Non requis
Filetage Affinity STA dans ASP.NET Aucune exigence STA
Rendu HTML/CSS Importation HTML via un pipeline de traitement de texte HTML5/CSS3 Chromium
HTML vers PDF Oui (secondaire) Oui (principal)
Support CSS Limité CSS3 complet
JavaScript Limité ES2024 complet
URL vers PDF Configuration complexe Natif
En-têtes/Pieds de page API complexe HTML simple
Fusion de courriers Propriétaire Modèles HTML
PDF/A Oui Oui
Protection par mot de passe Oui Oui
Signatures numériques Oui Oui
Fusionner des PDF Limité Oui
Diviser les PDF Limité Oui
Gestion du contexte Les exigences sont les suivantes Pas nécessaire
Multiplateforme Axé sur Windows Windows / Linux / macOS / Docker

Démarrage rapide : Migration de TextControl vers IronPDF

La migration peut commencer immédiatement grâce à ces étapes fondamentales.

Étape 1 : Remplacer les paquets NuGet

Le temps d'exécution sans interface de Contrôle de texte TXn'est pas distribué en tant que package public unique NuGet — le package public est TXTextControl.Web (le compagnon éditeur), et le temps d'exécution réel ServerTextControl est fourni via l'installateur Windows sous licence/MSI ou via le canal privé NuGet du vendeur. La suppression signifie généralement désinstaller ces packages fournis par l'installateur, plus TXTextControl.Web et désinstaller le MSI.

# Remove Contrôle de texte TXpackages (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 Contrôle de texte TXpackages (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

Étape 2 : Mise à jour des espaces de noms

Remplacer les espaces de noms TextControl par l'espace de nom 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

Étape 3 : initialisation de la licence

Ajouter l'initialisation de la licence au démarrage de l'application :

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

Exemples de migration de code

Conversion de HTML en PDF

Le cas d'utilisation le plus courant démontre la différence architecturale entre ces bibliothèques PDF .NET.

Approche de 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

Approche 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

La version TextControl nécessite la création d'une instance ServerTextControl, l'appel de Create() pour initialiser le contexte, le chargement du HTML avec StreamType.HTMLFormat et l'enregistrement avec StreamType.AdobePDF. Le bloc using est obligatoire pour une bonne gestion des ressources.

IronPDF élimine totalement la gestion du contexte. Le ChromePdfRenderer ne nécessite aucune cérémonie d'initialisation : créez-le, générez le HTML et enregistrez. Cette simplification architecturale réduit la charge cognitive et les bogues potentiels liés à la gestion des ressources.

Pour les scénarios avancés de conversion de HTML en PDF, voir le guide de conversion de HTML en PDF.

Fusionner plusieurs fichiers PDF

La fusion des PDF révèle une autre différence de complexité importante entre ces bibliothèques.

Approche de 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

Approche 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 nécessite de lire les fichiers dans des tableaux d'octets, de gérer le contexte ServerTextControl, et d'appeler Append avec BinaryStreamType.AdobePDF et AppendSettings.StartWithNewSection pour concaténer les documents. La méthode PdfDocument.Merge() d'IronPDF gère tout avec un appel explicite unique.

Pour des scénarios de fusion avancés, notamment l'extraction sélective de pages, voir le guide de fusion et de division de PDF.

Ajouter des en-têtes et des pieds de page

Des en-têtes et des pieds de page avec des numéros de page dynamiques illustrent la différence de complexité des API.

Approche de 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

Approche 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 nécessite de créer des objets HeaderFooter avec des enums HeaderFooterType spécifiques, d'accéder aux sections du document via textControl.Sections[0], et d'ajouter à la collection HeadersAndFooters.IronPDF fournit des méthodes AddTextHeader et AddTextFooter directes (via TextHeaderFooter) avec une syntaxe de placeholder simple.

Pour les en-têtes basés sur HTML avec un contrôle de style complet,IronPDF prend également en charge 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

Pour en savoir plus sur les options d'en-tête et de pied de page, consultez la documentation sur les en-têtes et les pieds de page.

Référence de mappage de l'API TextControl vers IronPDF

Cette cartographie accélère la migration en indiquant les équivalents directs des API :

Contrôle de texte 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 Modèles HTML + Razor
HeaderFooter + Sections[i].HeadersAndFooters HtmlHeaderFooter / TextHeaderFooter
LoadSettings RenderingOptions
StreamType.AdobePDF Résultat par défaut

Problèmes de migration courants et solutions

Enjeu 1 : Contexte du ServerTextControl

TextControl nécessite un bloc Create() et using pour chaque opération.

Solution:IronPDF ne dispose pas de gestion du contexte :

// 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

Édition 2 : Conversions de types de flux

TextControl jongle avec trois enums différents — StringStreamType pour les surcharges de chaînes, BinaryStreamType pour les surcharges de byte[], et StreamType pour l'enregistrement de chemin de fichier — pour charger différents formats et exporter en PDF.

Solution:IronPDF rend le HTML directement sans conversion de format intermédiaire :

// 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

Édition 3 : Modèles DOCX

TextControl utilise des fichiers DOCX pour les modèles avec fusion de courrier.

Solution: Convertir en modèles HTML avec l'interpolation de chaînes de caractères 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

Problème 4 : Affinity STA dans ASP.NET

TextControl ServerTextControl remonte historiquement à un modèle de composant de style COM STA et est le plus fiable lorsqu'il est hébergé sur des threads compatibles STA (par exemple [ASPCOMPAT] dans les Web Forms classiques, ou en encapsulant les appels sur un thread/une file d'attente STA dédié dans ASP.NET Core). Le mélanger librement avec des threads de travail MTA peut produire des erreurs d'affinité de thread occasionnelles sous charge.

Solution :IronPDF n'a pas d'exigence STA et fonctionne non modifié sur des threads de travail MTA, dans des contrôleurs async, et à l'intérieur de conteneurs Linux sous .NET 6/7/8/9.

Liste de contrôle de la migration vers TextControl

Tâches préalables à la migration

Auditez votre base de code pour identifier toutes les utilisations de 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

Modèles de publipostage pour la conversion en HTML. Remarquez les exigences d'en-tête/pied de page pour l'implémentation avec HtmlHeaderFooter. Identifiez toute fonctionnalité d'édition DOCX qui pourrait nécessiter des solutions alternatives.

Tâches de mise à jour du code

  1. Supprimer les paquets NuGet de TX Text Control
  2. Installez le package NuGet IronPDF
  3. Supprimer la gestion du contexte ServerTextControl (plus d'appels Create())
  4. Convertir les chargements StringStreamType.HTMLFormat en RenderHtmlAsPdf
  5. Convertir les modèles de fusion de courrier en modèles HTML avec l'interpolation de chaînes de caractères ou Razor
  6. Mettre à jour les en-têtes/pieds de page pour utiliser HtmlHeaderFooter ou AddTextFooter
  7. Simplifier les paramètres de page en utilisant RenderingOptions
  8. Ajouter l'initialisation de la licence au démarrage

Test de post-migration

Après la migration, vérifiez ces aspects :

  • Testez l'affichage correct de tous les modèles de documents
  • Vérifier la conformité PDF/Asi nécessaire
  • Tester la fonctionnalité de la protection par mot de passe
  • Vérifier que les en-têtes/pieds de page apparaissent sur toutes les pages
  • Vérifiez l'hébergement ASP.NET Core sur des threads de travail MTA et des conteneurs Linux —IronPDF n'a pas d'exigence d'affinité STA

Avantages clés de la migration vers IronPDF

Le passage de TextControl à IronPDF présente plusieurs avantages pour les équipes axées sur la génération de PDF :

Architecture PDF-First :IronPDF est spécifiquement conçu pour la génération de PDF, offrant des capacités de création et de rendu de documents en utilisant les normes modernes HTML5 et CSS3.

Efficacité des Coûts : Le prix unique par développeur d'IronPDF se compare favorablement au niveau d'entrée de 4 198 $ perpétuel + 1 an deTX Text Control .NET Serveret au modèle de renouvellement de ~40 %/an, en particulier lorsque la licence d'exécution serveur distincte est prise en compte.

Pas d'Affinity STA :IronPDF fonctionne sur des threads de travail MTA standard dans ASP.NET Core, des contrôleurs async, et des conteneurs Linux sans les considérations d'hébergement compatibles STA que ServerTextControl hérite de son modèle de threading de style COM.

Pas de gestion de contexte : Éliminez la cérémonie de création ServerTextControl et la danse de chargement/enregistrement avec trois enums (StringStreamType / BinaryStreamType / StreamType) — ChromePdfRenderer est sans état.

Moteur de Rendu Moderne : Le rendu basé sur Chromium d'IronPDF cible les normes actuelles HTML5/CSS3/JavaScript plutôt qu'un chemin d'importation HTML basé sur un moteur de traitement de texte.

Veuillez noterText Control est une marque déposée de son propriétaire respectif. Ce site n'est pas affilié à, approuvé par, ou sponsorisé par Text Control. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi