Zum Fußzeileninhalt springen
MIGRATIONSLEITFäDEN

Wie man von TextControl zu IronPDF in C# migriert

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: TextControl wird mit einer kommerziellen Lizenz betrieben, die mindestens 3.398 US-Dollar pro Jahr und Entwickler kostet. Ein vierköpfiges Team muss mit Kosten in Höhe von 6.749 US-Dollar pro Jahr rechnen, wobei zusätzliche Kosten für Laufzeitlizenzen für die Serverbereitstellung anfallen. Die jährlichen Verlängerungskosten liegen bei 40 %, was zwingend erforderlich ist, um Zugang zu Updates zu erhalten.

PDF als nachträglicher Gedanke: Die Kernarchitektur ist die Textverarbeitung, nicht die PDF-Datei. Die PDF-Generierung ist zwar verfügbar, aber sie ist eher ein zusätzliches Feature als das Hauptaugenmerk, was zu einer nicht ganz optimalen Ausgabequalität führt.

Hardware-Bugs: Der Intel Iris Xe Grafikfehler betrifft die Dokumentenwiedergabe in neueren Intel-Prozessoren (11. Generation) und erfordert einen Registry-Workaround zur Behebung.

Überflüssige Abhängigkeiten: TextControl enthält UI-Komponenten zur Dokumentenbearbeitung, die Sie möglicherweise nicht benötigen, wenn Ihr Fokus ausschließlich auf der PDF-Erstellung liegt.

Architektur der Textverarbeitung: Nicht optimiert für die HTML-zu-PDF-Workflows, die moderne Webanwendungen erfordern.

Komplexe API: Das Kontextmanagement- und Auswahlmodell von ServerTextControl führt zu unnötiger Komplexität bei einfachen PDF-Generierungsaufgaben.

Kostenvergleich

Aspekt TX Text Control IronPDF
Basislizenz $3,398+ Erheblich niedriger
Jährliche Erneuerung 40% obligatorisch Optionale Unterstützung
Pro Entwickler Ja Ja
UI-Komponenten Gebündelt (aufgebläht) PDF-fokussiert
3-Jahres-Gesamtkosten $5,750+ Viel niedriger

IronPDFvs. 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-Bearbeitung PDF-Erstellung
Lizenzkosten 3.398 $/Jahr pro Entwickler $749 einmalig pro Entwickler
PDF-Qualität Grundlegende, ergänzende Funktion Hohe, zentrale Funktionalität
Hardware-Kompatibilität Bekannte Probleme mit Intel Iris Stabil auf allen Geräten
Integration mit UI Benötigte UI-Komponenten Keine überladenen UI-Komponenten
HTML/CSS-Rendering Fehlerhaft mit HTML Modernes 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 Ja

Schnellstart: TextControl-zu-IronPDF-Migration

Mit diesen grundlegenden Schritten kann die Migration sofort beginnen.

Schritt 1: Ersetzen von NuGet-Paketen

Entfernen Sie alle TextControl-Pakete:

# Remove TX Text Control
dotnet remove package TXTextControl.TextControl
dotnet remove package TXTextControl.DocumentServer
# Remove TX Text Control
dotnet remove package TXTextControl.TextControl
dotnet remove package TXTextControl.DocumentServer
SHELL

IronPDF installieren:

# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
SHELL

Schritt 2: Namespaces aktualisieren

Ersetzen Sie die TextControl-Namensräume durch den IronPdf-Namensraum:

// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;

// After (IronPDF)
using IronPdf;
// Before (TextControl)
using TXTextControl;
using TXTextControl.DocumentServer;

// After (IronPDF)
using IronPdf;
$vbLabelText   $csharpLabel

Schritt 3: Lizenz initialisieren

Hinzufügen der Lizenzinitialisierung beim Start der Anwendung:

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

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, StreamType.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, StreamType.HTMLFormat);
                textControl.Save("output.pdf", StreamType.AdobePDF);
            }
        }
    }
}
$vbLabelText   $csharpLabel

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

Die TextControl-Version erfordert die Erstellung einer ServerTextControl-Instanz, den Aufruf von Create() zur Initialisierung des Kontexts, das Laden von HTML mit StreamType.HTMLFormat und das Speichern mit StreamType.AdobePDF. Der benutzen-Block ist obligatorisch für die ordnungsgemäße Entsorgung der Ressourcen.

IronPDF macht das Kontextmanagement vollständig überflüssig. Der ChromePdfRenderer benötigt keine Initialisierungszeremonie - er wird erstellt, HTML gerendert und gespeichert. 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, StreamType.AdobePDF);

                byte[] pdf2 = File.ReadAllBytes("document2.pdf");
                textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append);

                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, StreamType.AdobePDF);

                byte[] pdf2 = File.ReadAllBytes("document2.pdf");
                textControl.Load(pdf2, StreamType.AdobePDF, LoadAppendMode.Append);

                textControl.Save("merged.pdf", StreamType.AdobePDF);
            }
        }
    }
}
$vbLabelText   $csharpLabel

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

TextControl erfordert das Lesen von Dateien in Byte-Arrays, die Verwaltung des ServerTextControl-Kontextes und die Verwendung von LoadAppendMode.Append zum Zusammenführen von Dokumenten. Die Methode PdfDocument.Merge() vonIronPDFerledigt 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, StreamType.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, StreamType.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);
            }
        }
    }
}
$vbLabelText   $csharpLabel

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

TextControl erfordert das Erstellen von HeaderFooter-Objekten mit bestimmten HeaderFooterType-Enums, den Zugriff auf Dokumentabschnitte über textControl.Sections[0] und das Hinzufügen zur HeadersAndFooters-Sammlung.IronPDFbietet direkte AddTextHeader und AddTextFooter Methoden mit einfacher Platzhalter-Syntax.

Für HTML-basierte Kopfzeilen mit voller Styling-Kontrolle unterstütztIronPDFauch 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
};
$vbLabelText   $csharpLabel

Weitere Informationen über Kopf- und Fußzeilenoptionen finden Sie in der Kopf- und Fußzeilen-Dokumentation.

TextControl API zuIronPDFMapping Referenz

Dieses Mapping beschleunigt die Migration, indem es direkte API-Entsprechungen aufzeigt:

TX Text Control IronPDF Notizen
ServerTextControl.Create() new ChromePdfRenderer() Kein Kontextmanagement
tx.Load(html, StreamType.HTMLFormat) renderer.RenderHtmlAsPdf(html) Direktes Rendering
tx.Load(url, StreamType.HTMLFormat) renderer.RenderUrlAsPdf(url) URL-Unterstützung
tx.Save(Pfad, StreamType.AdobePDF) pdf.SaveAs(Pfad) Einfach speichern
SaveSettings.PDFAConformance RenderingOptions.PdfAFormat PDF/A
DocumentServer.MailMerge HTML-Vorlagen + Razor Zusammenführung von Vorlagen
DocumentTarget.HeadersAndFootters HtmlHeaderFooter Kopfzeilen/Fußzeilen
LoadSettings RenderingOptions Konfiguration
StreamType.AdobePDF Standard-Ausgabe PDF ist primär

Gängige Migrationsprobleme und Lösungen

Ausgabe 1: ServerTextControl-Kontext

TextControl benötigt einen Create() und using Block für jede Operation.

Lösung:IronPDFverfü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);
$vbLabelText   $csharpLabel

Ausgabe 2: StreamType-Konvertierungen

TextControl lädt verschiedene Formate und konvertiert über StreamType-Enums in PDF.

Lösung:IronPDFrendert HTML direkt ohne Zwischenformatkonvertierung:

// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
// No format conversion needed
var pdf = renderer.RenderHtmlAsPdf(html);
$vbLabelText   $csharpLabel

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

Ausgabe 4: Intel Iris Xe Grafikfehler

TextControl hat Rendering-Probleme mit Intel-Prozessoren der 11. Generation dokumentiert, die Workarounds für die Registrierung erfordern.

Lösung:IronPDFverwendet Chromium-Rendering - es sind keine Fehler bei der Hardwarebeschleunigung oder Änderungen der Registrierung erforderlich.

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

Dokument-Serienbriefvorlagen für die Konvertierung in HTML. Beachten Sie die Anforderungen an Kopf- und Fußzeilen für die Implementierung mit HtmlHeaderFooter. Identifizieren Sie alle DOCX-Bearbeitungsfunktionen, die möglicherweise alternative Lösungen erfordern.

Aufgaben der Code-Aktualisierung

  1. TX Text ControlNuGet-Pakete entfernen
  2. IronPdf NuGet-Paket installieren
  3. Entfernen Sie die ServerTextControl Kontextverwaltung (keine Create() Aufrufe mehr)
  4. Konvertieren Sie StreamType.HTMLFormat-Lasten in RenderHtmlAsPdf
  5. Konvertierung von Serienbriefen in HTML-Vorlagen mit String-Interpolation oder Razor
  6. Aktualisieren Sie Kopf- und Fußzeilen, um HtmlHeaderFooteroder AddTextHeader/AddTextFooter zu verwenden
  7. Vereinfachung der Seiteneinstellungen mit RenderingOptions
  8. 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
  • Prüfung auf Intel-Hardware der 11. Generation - mitIronPDFsind keine Umgehungen der Registrierung mehr erforderlich

Die wichtigsten Vorteile der Migration zu IronPDF

Der Wechsel von TextControl zuIronPDFbietet mehrere Vorteile für Teams, die sich auf die PDF-Erstellung konzentrieren:

PDF-First-Architektur:IronPDFist speziell auf die PDF-Generierung zugeschnitten und bietet robuste Funktionen zur Dokumentenerstellung und -wiedergabe durch die Nutzung moderner HTML5- und CSS3-Standards.

Kosteneffizienz: Durch die einmalige Preisgestaltung vonIronPDFist es auf lange Sicht deutlich günstiger, insbesondere im Vergleich zum abonnementbasierten Service von TextControl mit obligatorischen jährlichen Verlängerungsgebühren von 40 %.

Bewährte Stabilität: Dokumentierte Zuverlässigkeit auf unterschiedlicher Hardware, wodurch Probleme wie sie bei TextControl mit Intel-Grafik auftreten, vermieden werden.

Kein Kontextmanagement: Eliminieren Sie die Erstellungszeremonie ServerTextControl und die Muster zur Ressourcenfreigabe. Das zustandslose Rendering vonIronPDFvereinfacht den Code und reduziert potenzielle Speicherlecks.

Moderne Rendering-Engine: Da die Verbreitung von .NET 10 und C# 14 bis 2026 zunimmt, gewährleistet das auf Chromium basierende Rendering vonIronPDFdie Kompatibilität mit aktuellen und zukünftigen Webstandards.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen