Ausfüllen und Bearbeiten von PDF-Formularen in C# | IronPDF
TX Text Control hat sich als umfassende Dokumenteditor-Komponente im .NET-Ökosystem etabliert und bietet robuste DOCX-Bearbeitungsfunktionen mit eingebetteten UI-Controls. Für Entwicklungsteams, deren primäre Anforderung die PDF-Erzeugung und nicht die vollständige Bearbeitung von Dokumenten ist, stellt die Architektur von TextControl jedoch einen erheblichen Aufwand in Bezug auf Lizenzkosten, Komplexität und Laufzeitabhängigkeiten dar.
Dieser Leitfaden bietet einen vollständigen Migrationspfad von TextControl zu IronPDF, mit Schritt-für-Schritt-Anleitungen, Code-Vergleichen und praktischen Beispielen für professionelle .NET-Entwickler, die diesen Übergang evaluieren.
Warum von TextControl migrieren
Die Entscheidung, von TextControl zu migrieren, konzentriert sich in der Regel auf die Anpassung Ihrer Werkzeuge an Ihre tatsächlichen Anforderungen. TX Text Controlist im Wesentlichen ein Dokumenten-Editor, der die PDF-Erstellung als sekundäre Funktion behandelt. Zu den wichtigsten Gründen, warum Entwicklerteams eine Migration in Betracht ziehen, gehören:
Teure Lizenzierung: Eine einzelneTX Text Control .NET ServerEntwicklerlizenz kostet $4,198 unbefristet mit einem Jahr Updates/Support; eine Vier-Entwickler- Teamlizenz kostet $8,398 unbefristet + 1 Jahr (laut textcontrol.com Preisinformation). Die jährliche Abo-Erneuerung beträgt etwa 40% des Listenpreises (ca. $1,698/Jahr/Entwickler), und die Erneuerungsfrist endet 30 Tage nach Ablauf. Für den Produktionseinsatz sind auch separate Server-Laufzeitlizenzen erforderlich.
PDF als sekundärer Weg: Die Hauptarchitektur ist eine Textverarbeitungs-Engine (DOCX/RTF zuerst), mit PDF als Exportweg statt als primäre Oberfläche.
Eingebundene Editorebene: TX Text Controlwird mit DOCX-Bearbeitungs-UI-Komponenten geliefert, die möglicherweise unnötig sind, wenn die Anforderung rein serverseitige PDF-Erstellung ist.
Textverarbeitungsarchitektur: Der HTML-Import fließt durch eine Textverarbeitungspipeline statt durch einen auf Chromium basierenden Renderer, sodass die HTML5/CSS3-Treue typischerweise schwächer ist als bei einer browserbasierten PDF-Bibliothek.
STA-Affinität in ASP.NET: ServerTextControl stammt aus einem STA-COM-Komponentenmodell und ist am zuverlässigsten in STA-kompatiblen Threads, was die asynchrone/MTA-Hosting in modernen ASP.NET Core-Stapeln verkompliziert.
Komplexe API: Das ServerTextControl Kontextmanagement plus separate StringStreamType / BinaryStreamType / StreamType Enums und ein auswahlgesteuertes Dokumentmodell fügen bei einfachen PDF-Erstellungsaufgaben Overhead hinzu.
Kostenvergleich
| Aspekt | TX Text Control .NET Server | IronPDF |
|---|---|---|
| Einzelentwickler | $4,198 unbefristet + 1 Jahr Support | Einmalige Pro-Entwickler-Lizenz |
| Team von 4 | $8,398 unbefristet + 1 Jahr Support | Niedriger pro Sitzplatz |
| Jährliche Erneuerung | ~40% der Liste (~$1,698/Entwickler/jahr) | Optionale Unterstützung |
| Serverlaufzeit | Separate Laufzeitlizenz erforderlich für Produktion | Nicht erforderlich |
| UI-Komponenten | Eingebundene DOCX-Editorebene | PDF-fokussiert |
IronPDF vs. TextControl: Funktionsvergleich
Das Verständnis der architektonischen Unterschiede hilft technischen Entscheidungsträgern, die Investition in die Migration zu bewerten:
| Feature | TX Text Control | IronPDF |
|---|---|---|
| Primäres Ziel | DOCX / Textverarbeitung | PDF-Erstellung |
| Lizenzkosten (einzelner Entwickler) | $4,198 unbefristet + 1 Jahr; ~40%/Jahr Erneuerung | Einmalige Pro-Entwickler-Lizenz |
| PDF-Erzeugung | Exportpfad bei einer Textverarbeitungs-Engine | Kernfunktionalität |
| Server-Laufzeit-Lizenz | Erforderlich für Produktion | Nicht erforderlich |
| Threading | STA-Affinität in ASP.NET | Keine STA-Anforderung |
| HTML/CSS-Rendering | HTML-Import über die Textverarbeitungspipeline | Chromium HTML5/CSS3 |
| HTML zu PDF | Ja (sekundär) | Ja (primär) |
| CSS-Unterstützung | Beschränkt | Vollständig CSS3 |
| JavaScript | Beschränkt | Vollständiger ES2024 |
| URL zu PDF | Komplexe Einrichtung | Native |
| Kopf-/Fußzeilen | Komplexe API | Einfaches HTML |
| Serienbriefe | Proprietär | HTML-Vorlagen |
| PDF/A | Ja | Ja |
| Passwortschutz | Ja | Ja |
| Digitale Signaturen | Ja | Ja |
| PDFs zusammenführen | Beschränkt | Ja |
| PDFs teilen | Beschränkt | Ja |
| Kontext-Management | Erforderlich | Nicht erforderlich |
| Plattformübergreifend | Windows-orientiert | Windows / Linux / macOS / Docker |
Schnellstart: TextControl-zu-IronPDF-Migration
Mit diesen grundlegenden Schritten kann die Migration sofort beginnen.
Schritt 1: Ersetzen von NuGet-Paketen
Der headless Server-Laufzeit von TX Text Controlwird nicht als einziges öffentliches NuGet-Paket verteilt — das öffentliche Paket ist TXTextControl.Web (der Editor-Begleiter), und der eigentliche ServerTextControl Laufzeit wird über den lizenzierten Windows-Installer/MSI oder den privaten NuGet-Feed des Anbieters ausgeliefert. Entfernen bedeutet normalerweise, diese Installer-akkumulierten Pakete plus TXTextControl.Web und das Deinstallieren des MSI zu entfernen.
# Remove TX Text Controlpackages (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 TX Text Controlpackages (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
Schritt 2: Namespaces aktualisieren
Ersetzen Sie TextControl-Namespaces durch das IronPDF- Namespace:
// 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
Schritt 3: Lizenz initialisieren
Hinzufügen der Lizenzinitialisierung beim Start der Anwendung:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Beispiele für die Code-Migration
Konvertierung von HTML in PDF
Der häufigste Anwendungsfall verdeutlicht den architektonischen Unterschied zwischen diesen .NET-PDF-Bibliotheken.
TextControl-Ansatz:
// 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
IronPDF-Ansatz:
// 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
Die TextControl-Version erfordert das Erstellen einer ServerTextControl Instanz, das Aufrufen von Create() zur Initialisierung des Kontextes, das Laden von HTML mit StreamType.HTMLFormat und das Speichern mit StreamType.AdobePDF. Der using Block ist obligatorisch für die ordnungsgemäße Entsorgung von Ressourcen.
IronPDF macht das Kontextmanagement vollständig überflüssig. Der ChromePdfRenderer erfordert keine Initialisierungszeremonie — erstellen Sie ihn, rendern Sie HTML und speichern Sie. Diese architektonische Vereinfachung reduziert die kognitive Belastung und mögliche Fehler in der Ressourcenverwaltung.
Für fortgeschrittene HTML-zu-PDF-Szenarien siehe den HTML-zu-PDF-Konvertierungsleitfaden.
Mehrere PDFs zusammenführen
Die PDF-Zusammenführung zeigt einen weiteren bedeutenden Komplexitätsunterschied zwischen diesen Bibliotheken.
TextControl-Ansatz:
// 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
IronPDF-Ansatz:
// 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 erfordert das Lesen von Dateien in Byte-Arrays, das Verwalten des ServerTextControl Kontextes und das Aufrufen von Append mit BinaryStreamType.AdobePDF und AppendSettings.StartWithNewSection, um Dokumente zu verketten. Die PdfDocument.Merge() Methode von IronPDF erledigt alles mit einem einzigen, expliziten Aufruf.
Für fortgeschrittene Zusammenführungsszenarien, einschließlich selektiver Seitenextraktion, siehe den Leitfaden zum Zusammenführen und Teilen von PDFs.
Kopf- und Fußzeilen einfügen
Kopf- und Fußzeilen mit dynamischen Seitenzahlen verdeutlichen den Unterschied in der API-Komplexität.
TextControl-Ansatz:
// 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
IronPDF-Ansatz:
// 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 erfordert das Erstellen von HeaderFooter Objekten mit spezifischen HeaderFooterType Enums, den Zugriff auf Dokumentabschnitte durch textControl.Sections[0] und das Hinzufügen zur HeadersAndFooters Sammlung.IronPDF bietet direkte AddTextHeader und AddTextFooter Methoden (via TextHeaderFooter) mit einfacher Platzhalter-Syntax.
Für HTML-basierte Kopfzeilen mit vollständiger Styling-Kontrolle unterstützt IronPDF auch 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
}
Weitere Informationen über Kopf- und Fußzeilenoptionen finden Sie in der Kopf- und Fußzeilen-Dokumentation.
TextControl API zu IronPDF Mapping Referenz
Dieses Mapping beschleunigt die Migration, indem es direkte API-Entsprechungen aufzeigt:
| TX Text Control | 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-Vorlagen + Razor |
HeaderFooter + Sections[i].HeadersAndFooters |
HtmlHeaderFooter / TextHeaderFooter |
LoadSettings |
RenderingOptions |
StreamType.AdobePDF |
Standard-Ausgabe |
Gängige Migrationsprobleme und Lösungen
Ausgabe 1: ServerTextControl-Kontext
TextControl erfordert Create() und using Block für jede Operation.
Lösung:IronPDF verfügt über keine Kontextverwaltung:
// 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)
Ausgabe 2: StreamType-Konvertierungen
TextControl jongliert mit drei verschiedenen Enums — StringStreamType für String-Überladungen, BinaryStreamType für byte[] Überladungen und StreamType für Dateipfad-Speichern — zur Ladung verschiedener Formate und Export zu PDF.
Lösung:IronPDF rendert HTML direkt ohne Zwischenformatkonvertierung:
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
Dim pdf = renderer.RenderHtmlAsPdf(html)
Ausgabe 3: DOCX-Vorlagen
TextControl verwendet DOCX-Dateien für Vorlagen mit Seriendruck.
Lösung: Konvertierung in HTML-Vorlagen mit C# String-Interpolation oder 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")
Problem 4: STA-Affinität in ASP.NET
TextControl ServerTextControl historisch stammt aus einem STA COM-Stil-Komponentenmodell und ist am zuverlässigsten, wenn es auf STA-kompatible Threads gehostet wird (z.B. [ASPCOMPAT] in klassischen Web Forms, oder indem Aufrufe in einem dedizierten STA-Thread/Warteschlange in ASP.NET Core umwickelt werden). Freies Mischen mit MTA-Arbeits-Threads kann unter Last gelegentliche Thread-Affinitätsfehler verursachen.
Lösung:IronPDF hat keine STA-Anforderung und läuft unverändert auf MTA-Arbeits-Threads, in asynchronen Controllern und innerhalb von Linux-Containern unter .NET 6/7/8/9.
TextControl-Migrations-Checkliste
Vor der Migration anfallende Aufgaben
Überprüfen Sie Ihre Codebasis, um alle TextControl-Verwendungen zu identifizieren:
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" .
Dokument-Serienbriefvorlagen für die Konvertierung in HTML. Beachten Sie die Kopfzeilen/Fußzeilen-Anforderungen für die Implementierung mit HtmlHeaderFooter. Identifizieren Sie alle DOCX-Bearbeitungsfunktionen, die möglicherweise alternative Lösungen erfordern.
Aufgaben der Code-Aktualisierung
- TX Text ControlNuGet-Pakete entfernen 2.IronPDF NuGet-Paket installieren
- Entfernen Sie das
ServerTextControlKontextmanagement (keineCreate()Aufrufe mehr) - Konvertieren Sie
StringStreamType.HTMLFormatLadungen inRenderHtmlAsPdf - Konvertierung von Serienbriefen in HTML-Vorlagen mit String-Interpolation oder Razor
- Aktualisieren Sie Kopfzeilen/Fußzeilen, um
HtmlHeaderFooteroderAddTextFooterzu verwenden - Vereinfachen Sie die Seiteneinstellungen mit
RenderingOptions - Lizenzinitialisierung beim Start hinzufügen
Post-Migrationstests
Überprüfen Sie diese Aspekte nach der Migration:
- Testen Sie, ob alle Dokumentvorlagen korrekt wiedergegeben werden
- Überprüfung der PDF/A-Konformität (falls erforderlich)
- Passwortschutzfunktionalität testen
- Sicherstellen, dass Kopf- und Fußzeilen auf allen Seiten erscheinen
- Überprüfen Sie das Hosting von ASP.NET Core auf MTA-Arbeits-Threads und Linux-Containern —IronPDF hat keine STA-Affinitätsanforderung
Die wichtigsten Vorteile der Migration zu IronPDF
Der Wechsel von TextControl zu IronPDF bietet mehrere Vorteile für Teams, die sich auf die PDF-Erstellung konzentrieren:
PDF-First-Architektur:IronPDF ist speziell für die PDF-Erstellung maßgeschneidert und bietet Dokumentenerstellungs- und Rendering-Funktionen, indem moderne HTML5- und CSS3-Standards genutzt werden.
Kosteneffizienz: IronPDFs einmalige Pro-Entwickler-Preispolitik vergleicht sich günstig mit TX Text Control.NET Servers $4,198 unbefristetem + 1 Jahr Einstiegsebene und den ~40%/Jahr Erneuerungsmodell, insbesondere wenn separate Server-Laufzeit-Lizenzen berücksichtigt werden.
Keine STA-Affinität:IronPDF läuft auf standardmäßigen MTA-Arbeits-Threads in ASP.NET Core, asynchronen Controllern und Linux-Containern ohne die STA-kompatiblen Hosting-Anforderungen, die ServerTextControl von seinem COM-Komponentenmodell erbt.
Kein Kontextmanagement: Eliminieren Sie die ServerTextControl Erstellungszeremonie und das Drei-Enum (StringStreamType / BinaryStreamType / StreamType) Lade/Speicher-Tanz — ChromePdfRenderer ist zustandslos.
Moderner Rendering-Engine: IronPDFs auf Chromium-basierter Rendering zielt auf aktuelle HTML5/CSS3/JavaScript-Standards ab, anstatt auf einen Textverarbeitungs-Engine-basierten HTML-Importpfad.

