Zum Fußzeileninhalt springen
MIGRATIONSLEITFäDEN

Migrieren von Ghostscript GPL zu IronPDF in C#

Durch die Migration von Ghostscript GPLzuIronPDFwird Ihr .NET-PDF-Workflow von Befehlszeilen-Prozess-Spawning und String-basierter Schaltermanipulation auf eine typsichere, IntelliSense-fähige native .NET-API umgestellt. Dieser Leitfaden bietet einen umfassenden, schrittweisen Migrationspfad, der AGPL-Lizenzierungsprobleme und externe Binärabhängigkeiten für professionelle .NET-Entwickler beseitigt.

Warum von Ghostscript GPLzuIronPDFmigrieren

Die Ghostscript GPL-Herausforderungen

Ghostscript GPL ist ein altehrwürdiger PostScript/PDF-Interpreter mit jahrzehntelanger Geschichte, dessen Einsatz in modernen .NET-Anwendungen jedoch erhebliche Herausforderungen mit sich bringt:

  1. AGPL-Lizenzbeschränkungen: Die AGPL-Lizenz von Ghostscript GPLverpflichtet Sie zur Veröffentlichung Ihres Quellcodes, wenn Sie Software vertreiben, die diesen verwendet – es sei denn, Sie erwerben eine teure kommerzielle Lizenz von Artifex. Dieses "virale" Lizenzierungsmodell birgt erhebliche rechtliche Risiken für proprietäre Anwendungen.

  2. Befehlszeilenschnittstelle: Ghostscript GPList im Grunde ein Befehlszeilentool. Die Verwendung in C# erfordert das Starten von Prozessen, die Übergabe von String-Argumenten und das Parsen der Ausgabe - ein anfälliger und fehleranfälliger Ansatz.

  3. Externe Binärabhängigkeit: Sie müssen Ghostscript GPLseparat installieren, PATH-Variablen verwalten und die Versionskompatibilität in allen Bereitstellungsumgebungen sicherstellen. Für 32-Bit und 64-Bit werden unterschiedliche DLLs benötigt (gsdll32.dll und gsdll64.dll).

  4. Keine native HTML-zu-PDF-Konvertierung: Ghostscript GPLkann HTML nicht direkt in PDF konvertieren. Sie müssen zunächst HTML mit einem anderen Tool in PostScript konvertieren und dann Ghostscript GPLverwenden, um PostScript in PDF zu konvertieren - eine mehrstufige Pipeline mit externen Abhängigkeiten.

  5. Komplexe Schaltersyntax: Operationen werden über kryptische Befehlszeilenschalter wie -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=... gesteuert. Kein IntelliSense, keine Typsicherheit und leicht zu vertippen.

  6. Fehlerbehandlung: Fehler werden über stderr als Textzeichenfolgen ausgegeben, was ein Parsen anstelle einer strukturierten Ausnahmebehandlung erfordert.

  7. Mehraufwand für das Prozessmanagement: Jeder Vorgang erzeugt einen separaten Prozess, was zusätzlichen Aufwand und Komplexität für Fehlerbehandlung, Timeouts und Ressourcenbereinigung mit sich bringt.

Vergleich zwischen Ghostscript GPLund IronPDF

Aspekt Ghostscript GPL IronPDF
Lizenz AGPL (viral) oder teure kommerzielle Übersetzung Kommerziell mit klaren Begriffen
Integration Spawnen von Prozessen in der Befehlszeile Native .NET-Bibliothek
API-Entwurf String-basierte Schalter Typisierte, IntelliSense-fähige API
Fehlerbehandlung Parsen von stderr-Text .NET-Ausnahmen
HTML-zu-PDF Nicht unterstützt (externe Tools erforderlich) Eingebaute Chromium-Engine
Abhängigkeiten Externe Binärinstallation Eigenständiges NuGet-Paket
Bereitstellung PATH konfigurieren, DLLs kopieren Einfach NuGet-Referenz hinzufügen
Thread-Sicherheit Nur Prozessisolierung Thread-sicher durch Design
Modernes .NET Begrenzte Unterstützung Vollständige Unterstützung von .NET 6/7/8/9/10
Async-Unterstützung Prozessbasiert Natives async/await

Für Teams, die die Einführung von .NET 10 und C# 14 bis 2025 und 2026 planen, bietetIronPDFeine zukunftssichere Grundlage, die sich nativ in moderne .NET-Muster integrieren lässt.


Migrationskomplexitätsbewertung

Geschätzter Aufwand nach Merkmalen

Feature Komplexität der Migration Notizen
PDF in Bilder Niedrig Direkte API-Zuordnung
PDFs zusammenführen Niedrig Einfacher mit IronPDF
PDF komprimieren Niedrig Eingebaute Optionen
PDF-Optimierung Niedrig Unterschiedlicher Ansatz
Verschlüsselung Medium Verschiedene API
Seite extrahieren Niedrig 0-indiziert vs. 1-indiziert
PostScript zu PDF Mittel-Hoch Zuerst PS → PDF konvertieren
Benutzerdefinierte Schalter Mittel-Hoch Äquivalente Funktionen recherchieren

Paradigmen-Verschiebung

Der grundlegende Wandel bei dieser Ghostscript-GPL-Migration besteht in der Verlagerung der Prozessausführung von der Kommandozeile hin zu typisierten .NET-API-Aufrufen:

Ghostscript GPL:  "Übergeben Sie diese String-Schalter an externe Prozesse"
IronPDF:          "Diese Methoden für .NET-Objekte aufrufen"

Bevor Sie beginnen

Voraussetzungen

  1. .NET-Version:IronPDFunterstützt .NET Framework 4.6.2+ und .NET Core 2.0+ / .NET 5/6/7/8/9+
  2. Lizenzschlüssel: Ihren IronPDF-Lizenzschlüssel erhalten Sie auf ironpdf.com.
  3. Datensicherung: Erstellen Sie einen Branch für die Migrationsarbeiten.

Alle Ghostscript GPL-Nutzungen identifizieren

# Find all Ghostscript.NET references
grep -r "Ghostscript\.NET\|GhostscriptProcessor\|GhostscriptRasterizer\|gsdll" --include="*.cs" .

# Find direct process calls to Ghostscript
grep -r "gswin64c\|gswin32c\|gs\|ProcessStartInfo.*ghost" --include="*.cs" .

# Find package references
grep -r "Ghostscript" --include="*.csproj" .
# Find all Ghostscript.NET references
grep -r "Ghostscript\.NET\|GhostscriptProcessor\|GhostscriptRasterizer\|gsdll" --include="*.cs" .

# Find direct process calls to Ghostscript
grep -r "gswin64c\|gswin32c\|gs\|ProcessStartInfo.*ghost" --include="*.cs" .

# Find package references
grep -r "Ghostscript" --include="*.csproj" .
SHELL

NuGet-Paketänderungen

# Remove Ghostscript.NET
dotnet remove package Ghostscript.NET

# Install IronPDF
dotnet add package IronPdf
# Remove Ghostscript.NET
dotnet remove package Ghostscript.NET

# Install IronPDF
dotnet add package IronPdf
SHELL

Ghostscript GPL-Abhängigkeiten entfernen

Nach der Migration:

  • Ghostscript GPLvon Servern deinstallieren
  • Entfernen von gsdll32.dll / gsdll64.dll aus Bereitstellungen
  • PATH-Konfiguration für Ghostscript GPLentfernen
  • Entfernen Sie alle GhostscriptVersionInfoVerweise

Schnellstart Migration

Schritt 1: Lizenzkonfiguration aktualisieren

Vor (Ghostscript GPL):

Ghostscript GPL unter AGPL erfordert entweder die Offenlegung des Quellcodes oder eine teure kommerzielle Lizenz von Artifex.

Nach (IronPDF):

// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
// Set once at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";
$vbLabelText   $csharpLabel

Schritt 2: Aktualisieren der Namensraum-Importe

// Before (Ghostscript GPL)
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using Ghostscript.NET.Rasterizer;

// After (IronPDF)
using IronPdf;
// Before (Ghostscript GPL)
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using Ghostscript.NET.Rasterizer;

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

Komplette API-Referenz

Kernklassen-Zuordnung

Ghostscript.NET IronPDF Beschreibung
GhostscriptProzessor Verschiedene PdfDocument-Methoden PDF-Verarbeitung
GhostscriptRasterizer PdfDocument.ToBitmap() / RasterizeToImageFiles() PDF in Bilder
GhostscriptVersionInfo N/A (nicht erforderlich) DLL-Speicherort
GhostscriptStdIO N/A (Ausnahmen verwenden) E/A-Behandlung
Prozess + Befehlszeile ChromePdfRenderer HTML zu PDF

Zuordnung von Befehlszeilenschaltern

Ghostscript GPL-Schalter IronPDF-Äquivalent Beschreibung
-dNOPAUSE N/A (nicht erforderlich) Keine Pausen zwischen den Seiten
-dBATCH N/A (nicht erforderlich) Beenden nach der Bearbeitung
-dSAFER N/A (Standard) Sicherer Dateizugriff
-sDEVICE=pdfwrite Verschiedene PDF-Methoden PDF-Ausgabe
-sDEVICE=png16m ToBitmap() oder RasterizeToImageFiles() PNG-Ausgabe
-sOutputFile=X SaveAs("X") Dateiname der Ausgabe
-r300 DPI-Parameter in Methoden Auflösung
-dPDFSETTINGS=/ebook Bilder komprimieren(Qualität: 75) Mittlere Qualität
-sOwnerPassword=X SecuritySettings.OwnerPassword Passwort des Eigentümers
-sBenutzerPasswort=X SecuritySettings.UserPassword Benutzer-Passwort

Beispiele für die Code-Migration

Beispiel 1: Konvertierung von HTML in PDF

Vor (Ghostscript GPL):

// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.IO;
using System.Text;

class GhostscriptExample
{
    static void Main()
    {
        // Ghostscript cannot directly convert HTML to PDF
        // You need to first convert HTML to PS/EPS using another tool
        // then use Ghostscript to convert PS to PDF

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
        string psFile = "temp.ps";
        string outputPdf = "output.pdf";

        // This is a workaround - Ghostscript primarily works with PostScript
        GhostscriptProcessor processor = new GhostscriptProcessor();

        List<string> switches = new List<string>
        {
            "-dNOPAUSE",
            "-dBATCH",
            "-dSAFER",
            "-sDEVICE=pdfwrite",
            $"-sOutputFile={outputPdf}",
            psFile
        };

        processor.Process(switches.ToArray());
    }
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.IO;
using System.Text;

class GhostscriptExample
{
    static void Main()
    {
        // Ghostscript cannot directly convert HTML to PDF
        // You need to first convert HTML to PS/EPS using another tool
        // then use Ghostscript to convert PS to PDF

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";
        string psFile = "temp.ps";
        string outputPdf = "output.pdf";

        // This is a workaround - Ghostscript primarily works with PostScript
        GhostscriptProcessor processor = new GhostscriptProcessor();

        List<string> switches = new List<string>
        {
            "-dNOPAUSE",
            "-dBATCH",
            "-dSAFER",
            "-sDEVICE=pdfwrite",
            $"-sOutputFile={outputPdf}",
            psFile
        };

        processor.Process(switches.ToArray());
    }
}
$vbLabelText   $csharpLabel

Nach (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class IronPdfExample
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class IronPdfExample
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

Der Unterschied ist gravierend: Ghostscript GPLkann HTML nicht direkt in PDF konvertieren, sondern erfordert eine PostScript-Konvertierung mit externen Tools. Der ChromePdfRenderervonIronPDFbietet eine direkte HTML-zu-PDF-Konvertierung mit vollständiger Unterstützung von CSS3, JavaScript und modernen Webstandards. Weitere Rendering-Optionen finden Sie in der HTML to PDF Dokumentation.

Beispiel 2: PDF in Bilder

Vor (Ghostscript GPL):

// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Rasterizer;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

class GhostscriptExample
{
    static void Main()
    {
        string inputPdf = "input.pdf";
        string outputPath = "output";

        GhostscriptVersionInfo gvi = new GhostscriptVersionInfo("gsdll64.dll");

        using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
        {
            rasterizer.Open(inputPdf, gvi, false);

            for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
            {
                Image img = rasterizer.GetPage(300, pageNumber);
                img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png);
                img.Dispose();
            }
        }
    }
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Rasterizer;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

class GhostscriptExample
{
    static void Main()
    {
        string inputPdf = "input.pdf";
        string outputPath = "output";

        GhostscriptVersionInfo gvi = new GhostscriptVersionInfo("gsdll64.dll");

        using (GhostscriptRasterizer rasterizer = new GhostscriptRasterizer())
        {
            rasterizer.Open(inputPdf, gvi, false);

            for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
            {
                Image img = rasterizer.GetPage(300, pageNumber);
                img.Save($"{outputPath}_page{pageNumber}.png", ImageFormat.Png);
                img.Dispose();
            }
        }
    }
}
$vbLabelText   $csharpLabel

Nach (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfExample
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        var images = pdf.ToBitmap();

        for (int i = 0; i < images.Length; i++)
        {
            images[i].Save($"output_page{i + 1}.png");
        }
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class IronPdfExample
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("input.pdf");

        var images = pdf.ToBitmap();

        for (int i = 0; i < images.Length; i++)
        {
            images[i].Save($"output_page{i + 1}.png");
        }
    }
}
$vbLabelText   $csharpLabel

Der Ghostscript-GPL-Ansatz erfordert das Auffinden der externen gsdll64.dll, die Erstellung eines GhostscriptVersionInfo-Objekts und die Verwendung von 1-indizierten Seitenzahlen. Die ToBitmap()-Methode vonIronPDFbietet einen sauberen, einzeiligen Ansatz ohne externe Abhängigkeiten. Beachten Sie den Unterschied in der Seitenindizierung: Ghostscript GPLverwendet 1-indizierte Seiten, währendIronPDF0-indizierte Seiten verwendet (Standardkonvention für .NET).

Beispiel 3: PDF-Dateien zusammenführen

Vor (Ghostscript GPL):

// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.Collections.Generic;

class GhostscriptExample
{
    static void Main()
    {
        string outputPdf = "merged.pdf";
        string[] inputFiles = { "file1.pdf", "file2.pdf", "file3.pdf" };

        GhostscriptProcessor processor = new GhostscriptProcessor();

        List<string> switches = new List<string>
        {
            "-dNOPAUSE",
            "-dBATCH",
            "-dSAFER",
            "-sDEVICE=pdfwrite",
            $"-sOutputFile={outputPdf}"
        };

        switches.AddRange(inputFiles);

        processor.Process(switches.ToArray());
    }
}
// NuGet: Install-Package Ghostscript.NET
using Ghostscript.NET;
using Ghostscript.NET.Processor;
using System.Collections.Generic;

class GhostscriptExample
{
    static void Main()
    {
        string outputPdf = "merged.pdf";
        string[] inputFiles = { "file1.pdf", "file2.pdf", "file3.pdf" };

        GhostscriptProcessor processor = new GhostscriptProcessor();

        List<string> switches = new List<string>
        {
            "-dNOPAUSE",
            "-dBATCH",
            "-dSAFER",
            "-sDEVICE=pdfwrite",
            $"-sOutputFile={outputPdf}"
        };

        switches.AddRange(inputFiles);

        processor.Process(switches.ToArray());
    }
}
$vbLabelText   $csharpLabel

Nach (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class IronPdfExample
{
    static void Main()
    {
        var pdfs = new List<PdfDocument>
        {
            PdfDocument.FromFile("file1.pdf"),
            PdfDocument.FromFile("file2.pdf"),
            PdfDocument.FromFile("file3.pdf")
        };

        var merged = PdfDocument.Merge(pdfs);
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class IronPdfExample
{
    static void Main()
    {
        var pdfs = new List<PdfDocument>
        {
            PdfDocument.FromFile("file1.pdf"),
            PdfDocument.FromFile("file2.pdf"),
            PdfDocument.FromFile("file3.pdf")
        };

        var merged = PdfDocument.Merge(pdfs);
        merged.SaveAs("merged.pdf");
    }
}
$vbLabelText   $csharpLabel

Der Ghostscript-GPL-Ansatz erfordert das Auswendiglernen der Switch-Syntax (-dNOPAUSE, -dBATCH, -sDEVICE=pdfwrite) und die Verkettung von Dateipfaden in einem String-Array. Die statische Merge-Methode vonIronPDFermöglicht das typsichere, IntelliSense-fähige Zusammenführen mit geeigneten PdfDocument-Objekten. Erfahren Sie mehr über das Zusammenführen und Aufteilen von PDFs.


Kritische Hinweise zur Migration

Konvertierung der Seitenindizierung

Eine der wichtigsten Änderungen bei dieser Ghostscript-GPL-Migration ist der Unterschied bei der Seitenindexierung:

// Ghostscript GPL: 1-indexed pages
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
    Image img = rasterizer.GetPage(300, pageNumber);
}

// IronPDF: 0-indexed pages (standard .NET)
for (int i = 0; i < images.Length; i++)
{
    images[i].Save($"output_page{i + 1}.png");
}
// Ghostscript GPL: 1-indexed pages
for (int pageNumber = 1; pageNumber <= rasterizer.PageCount; pageNumber++)
{
    Image img = rasterizer.GetPage(300, pageNumber);
}

// IronPDF: 0-indexed pages (standard .NET)
for (int i = 0; i < images.Length; i++)
{
    images[i].Save($"output_page{i + 1}.png");
}
$vbLabelText   $csharpLabel

AGPL-Lizenz-Bedenken beseitigt

Die AGPL-Lizenz von Ghostscript GPLhat "virale" Eigenschaften, die die Offenlegung des Quellcodes bei der Verbreitung von Anwendungen erfordern. Die kommerzielle Lizenz vonIronPDFhat klare Bedingungen, die keine solchen Anforderungen stellen.

Keine externen Binärdateien

IronPDF ist vollständig in sich geschlossen. Entfernen Sie diese nach der Migration:

  • gsdll32.dll und gsdll64.dll Dateien
  • Ghostscript GPL-Installation von Servern
  • Konfigurationen der Umgebungsvariablen PATH
  • GhostscriptVersionInfoVerweise im Code

PostScript-Dateien

IronPDF kann PostScript-Dateien (.ps) nicht direkt verarbeiten. Wenn Ihr Arbeitsablauf PostScript-Verarbeitung erfordert, sollten Sie entweder:

  1. Konvertierung von PostScript in PDF mit einem anderen Tool vor der IronPDF-Verarbeitung
  2. Konvertieren Sie den Quellinhalt in HTML und verwenden Sie das HTML-Rendering von IronPDF

Erwägungen zur Leistung

Kein Prozess-Spawning

Ghostscript GPL-Operationen erzeugen externe Prozesse mit entsprechendem Overhead.IronPDFarbeitet innerhalb Ihres .NET-Prozesses:

// Ghostscript GPL: Process spawning overhead
processor.Process(switches.ToArray());  // Creates new OS process

// IronPDF: In-process execution
var merged = PdfDocument.Merge(pdfs);  // Native .NET method call
// Ghostscript GPL: Process spawning overhead
processor.Process(switches.ToArray());  // Creates new OS process

// IronPDF: In-process execution
var merged = PdfDocument.Merge(pdfs);  // Native .NET method call
$vbLabelText   $csharpLabel

Thread-Sicherheit

IronPDF ist von vornherein thread-sicher. Mehrere Threads können ChromePdfRendererund PdfDocument gleichzeitig verwenden, ohne dass Synchronisierungsprobleme auftreten.


Migrations-Checkliste

Vor der Migration

  • Erfassung aller Ghostscript-GPL-Nutzungen im Quellcode
  • Dokumentieren Sie die aktuell verwendeten Befehlszeilenoptionen.
  • Jegliche PostScript-Verarbeitung identifizieren (erfordert spezielle Behandlung)
  • Überprüfung des AGPL-Lizenzkonformitätsstatus
  • IronPDF-Lizenzschlüssel erhalten
  • Migrationszweig in der Versionskontrolle erstellen

Code-Migration

  • Entfernen Sie das Ghostscript.NET NuGet-Paket: dotnet remove package Ghostscript.NET
  • Installieren Sie das IronPdf NuGet-Paket: dotnet add package IronPdf
  • Entfernen der externen Ghostscript-GPL-Binärabhängigkeiten
  • GhostscriptVersionInfound DLL-Verweise entfernen
  • Konvertierung GhostscriptProcessor.Process() in IronPDF-Methoden
  • Konvertiere GhostscriptRasterizerin pdf.ToBitmap()
  • Ersetzen Sie Befehlszeilenoptionen durch API-Aufrufe
  • Aktualisierung der Fehlerbehandlung von stderr-Parsing auf Ausnahmen
  • Konvertierung von 1-indizierten Seitenzahlen in 0-indizierte Seitenzahlen

Testen

  • Test der PDF-zu-Bild-Konvertierung
  • PDF-Zusammenführung testen
  • Extraktion der Testseite
  • Kompressionsqualität prüfen
  • Passwortschutz testen
  • Überprüfen, ob die Ausgabequalität den Erwartungen entspricht
  • Leistungsbenchmark kritische Pfade

Bereitstellung

  • Ghostscript GPLvon den Servern entfernen
  • Entfernen Sie die PATH-Konfiguration
  • Entfernen Sie gsdll*.dll -Dateien aus den Bereitstellungen
  • Überprüfen, ob die Anwendung auch ohne installiertes Ghostscript GPLfunktioniert.

Nach der Migration

  • Ghostscript-GPL-Lizenz entfernen (falls kommerziell)
  • Dokumentation aktualisieren
  • Schulung des Teams zur IronPDF-API
  • Die Produktion auf etwaige Probleme überwachen

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