IRONSOFTWAREHOME
IRONPDF NUTZEN

Effizienter Vergleich zweier PDF-Dateien mit C# und IronPDF

Curtis Chau
Curtis Chau
Updated: 20. Juni 2026

Erstellen Sie PdfDocument Objekte aus Ihren Byte-Arrays und verwenden Sie PdfDocument.Merge(), um diese zu einem einzigen PDF zu kombinieren, ohne auf die Festplatte zu speichern. Diese Methode behandelt die komplexe PDF-Struktur automatisch, sodass Sie Dokumente, die in Datenbanken gespeichert oder von APIs empfangen wurden, zusammenführen können, ohne jemals temporäre Dateien zu schreiben.

Die Arbeit mit als Byte-Arrays gespeicherten PDF-Dateien ist in modernen C#-Anwendungen üblich. Ob Sie PDF-Dokumente aus einer Datenbank abrufen, von Webdiensten empfangen oder im Arbeitsspeicher verarbeiten – die Möglichkeit, mehrere PDF-Dateien zu einer einzigen zusammenzuführen , ohne sie auf der Festplatte zu speichern, ist für die Arbeitsabläufe in Enterprise unerlässlich. IronPDF macht dies mit einer intuitiven API unkompliziert. In diesem Artikel erfahren Sie, wie Sie PDF-Byte-Arrays in C# zusammenführen, indem Sie verschiedene Ansätze untersuchen, einschließlich MemoryStream Handhabung und realer Datenbankmuster.

Was sind PDF-Byte-Arrays und warum sollten sie zusammengeführt werden?

Ein Byte-Array sind rohe Binärdaten, die eine PDF-Datei im Speicher repräsentieren. Bei der Arbeit mit PDF-Dokumenten in C# stößt man häufig auf Fälle, in denen die Dateien als Byte-Arrays und nicht auf der Festplatte vorliegen. Dies kommt besonders häufig vor beim Abrufen von Dokumenten aus Datenbanken, in denen PDFs als Binärspalten gespeichert sind, oder beim Empfangen von Dokumenten von REST-APIs.

Die MemoryStream-Funktionalität in .NET – dokumentiert in der Microsoft MemoryStream-Referenz – ermöglicht eine effiziente Handhabung dieser Byte-Arrays, insbesondere in Kombination mit einer geeigneten Speicherverwaltung für große Dokumente. Anstatt temporäre Dateien zu schreiben, können Sie PDFs vollständig im Arbeitsspeicher laden, verarbeiten und speichern – das ist schneller, sauberer und vermeidet Probleme mit Dateisystemberechtigungen.

Warum kann man PDF-Byte-Arrays nicht einfach verketten?

Das einfache Verketten zweier PDF-Byte-Arrays funktioniert nicht. Im Gegensatz zu einfachen Textdateien weisen PDF-Dateien komplexe interne Strukturen mit Kopfzeilen, Querverweistabellen und spezifischen Formatierungskonventionen auf. Die ISO 32000 PDF-Spezifikation definiert komplexe Regeln zur Dokumentstruktur, einschließlich Metadaten, Einbettung von Schriftarten und Verschlüsselungsebenen. Das direkte Zusammenfügen der Bytes führt zu einer beschädigten Datei. Sie benötigen eine geeignete PDF-Bibliothek, um diese Byte-Arrays zu parsen und korrekt zusammenzufügen, wobei die gesamte Struktur erhalten bleibt.

IronPDF bewältigt diese gesamte Komplexität intern. Mit nur wenigen Codezeilen können Sie PDF-Dokumente zusammenführen und dabei Schriftarten, Bilder und Formatierungen genau so beibehalten, wie sie in den Quelldateien vorhanden waren.

Wann sollte man Byte-Array-Merging verwenden?

Diese Vorgehensweise funktioniert gut, wenn:

Dokumente werden in einer SQL Server- oder PostgreSQL-Datenbank als Binärspalten gespeichert. Ihre Anwendung empfängt PDF-Daten von einer externen API oder einem Microservice. Sie verarbeiten Datei-Uploads in ASP.NET , ohne sie auf der Festplatte zu speichern. Sie arbeiten in einer Cloud-Umgebung wie Azure Functions oder AWS Lambda, in der der temporäre Dateispeicher eingeschränkt ist.

Bei der Arbeit mit Azure Blob Storage oder ähnlichen Cloud-Diensten ist die Manipulation von Byte-Arrays unerlässlich, da man die Rohbytes herunterlädt, verarbeitet und das Ergebnis wieder hochlädt – und das alles, ohne das Dateisystem zu berühren.

Wie füge ich die PDF-Bibliothek zu meinem Projekt hinzu?

Für den Einstieg müssen Sie das IronPDF NuGet Paket zu Ihrem Projekt hinzufügen. Das Paket ist auf NuGet verfügbar. Sie können es entweder über die Paket-Manager-Konsole oder die .NET Befehlszeilenschnittstelle installieren:

PM > Install-Package IronPdf

> dotnet add package IronPdf

Ausführliche Installationsoptionen, einschließlich Docker-Bereitstellung oder Linux-Setup , finden Sie im erweiterten Installationsleitfaden . Bei der Bereitstellung in einer minimalen Umgebung reduziert IronPDF Slim den Bereitstellungsaufwand erheblich.

Nach der Installation fügen Sie die folgenden Namespaces am Anfang Ihrer C#-Datei hinzu:

using IronPdf;
using System.IO;
using System.Collections.Generic;

IronPDF unterstützt die Plattformen Windows, macOS und Linux . Es lässt sich ohne zusätzliche Konfiguration in ASP.NET Core , Blazor, Konsolenanwendungen und Cloud-Umgebungen integrieren.

Visual Studio's NuGet Package Manager-Oberfläche, die Suchergebnisse für die IronPDF-Bibliothek anzeigt, mit der Version 2025.9.4 zur Installation im IronTesting-Projekt ausgewählt - wobei der Installationsknopf und das Dropdown-Menü für die Version deutlich sichtbar sind

Erster Schritt:
arrow pointer

Wie kombiniert man zwei PDF-Byte-Arrays in C#?

Hier ist ein vollständiges Beispiel, das zeigt, wie man zwei PDF-Byte-Arrays zu einem einzigen PDF-Dokument zusammenführt:

// Simulate two PDF byte arrays (in practice, these come from a database or API)
byte[] pdfBytes1 = File.ReadAllBytes("document1.pdf");
byte[] pdfBytes2 = File.ReadAllBytes("document2.pdf");

// Create PdfDocument objects from byte arrays
var pdf1 = new PdfDocument(pdfBytes1);
var pdf2 = new PdfDocument(pdfBytes2);

// Merge the two PDF documents
PdfDocument combinedPdf = PdfDocument.Merge(pdf1, pdf2);

// Convert the combined PDF back to a byte array
byte[] mergedPdfBytes = combinedPdf.BinaryData;

// Optionally save the merged PDF to disk
File.WriteAllBytes("merged.pdf", mergedPdfBytes);

Die PdfDocument Klasse akzeptiert rohe Byte-Arrays direkt in ihrem Konstruktor. Sobald Sie zwei PdfDocument Instanzen haben, kombiniert PdfDocument.Merge() diese zu einem einzigen Dokument. Die BinaryData Eigenschaft liefert Ihnen dann das Ergebnis als Byte-Array, bereit zur Speicherung in einer Datenbank oder zur Übertragung über eine API.

Die PdfDocument-API bietet über das einfache Zusammenführen hinausgehende umfangreiche Funktionalitäten, darunter Seitenmanipulation , Textextraktion und Formularverarbeitung . Sobald Sie ein zusammengeführtes Dokument haben, können Sie jede dieser Operationen anwenden, bevor Sie das endgültige Byte-Array extrahieren.

Wie sieht die zusammengeführte Ausgabe aus?

PDF-Viewer zeigt erfolgreich zusammengeführte PDF-Dokumente mit 'PDF One' auf Seite 1 und 'PDF Two' auf Seite 2 an, was deutliche Dokumentengrenzen und erhaltene Formatierungen bei 100% Zoom demonstriert

Das Ergebnis ist ein einziges PDF, das alle Seiten aus beiden Quelldokumenten in der Reihenfolge enthält, in der sie an Merge() übergeben wurden. Seitenzahlen, Schriftarten, Bilder und eingebettete Inhalte bleiben erhalten. Das zusammengeführte Dokument verhält sich identisch zu jedem anderen PDF – Sie können es paginieren, kommentieren, signieren oder komprimieren, indem Sie die gleichen IronPDF Methoden verwenden, die Sie auch auf jedes andere Dokument anwenden würden.

Wie läuft der Fusionsprozess intern ab?

Wenn Sie ein Byte-Array an den PdfDocument Konstruktor übergeben, parst IronPDF die Binärdaten und erstellt eine Speicherabbildung der PDF-Struktur. Die PdfDocument.Merge() Methode kombiniert dann mehrere Dokumente, indem sie Seiten aus jeder Quelle der Reihe nach anhängt, die Querverweistabelle neu aufbaut und alle Schriftarten- oder Ressourcennamenskonflikte zwischen den Dokumenten löst.

Deshalb lassen sich Byte-Arrays nicht einfach verketten – die Querverweistabelle in der ersten PDF-Datei verweist auf Offsets innerhalb dieser Datei. Nach der Verkettung sind diese Offsets ungültig, da sie in der zweiten Datei verschoben wurden. IronPDF rekonstruiert die gesamte Struktur korrekt, was zu einem gültigen, wohlgeformten PDF führt.

Wie kann man mehr als zwei PDF-Dateien gleichzeitig zusammenführen?

IronPDF bietet eine List Überladung zum Zusammenführen beliebiger Dokumentanzahlen in einer einzigen Operation. Dies ist effizienter als das Verketten mehrerer Zusammenführungen von zwei Dokumenten:

// Load four PDFs as byte arrays
List<byte[]> pdfByteArrays = new List<byte[]>
{
    File.ReadAllBytes("example1.pdf"),
    File.ReadAllBytes("example2.pdf"),
    File.ReadAllBytes("example3.pdf"),
    File.ReadAllBytes("example4.pdf")
};

// Convert each byte array to a PdfDocument
List<PdfDocument> pdfsToMerge = new List<PdfDocument>();
for (int i = 0; i < pdfByteArrays.Count; i++)
{
    pdfsToMerge.Add(new PdfDocument(pdfByteArrays[i]));
}

// Merge all documents in one call
PdfDocument combinedPdf = PdfDocument.Merge(pdfsToMerge);
byte[] finalPdfBytes = combinedPdf.BinaryData;

// Apply compression if the result is large
if (finalPdfBytes.Length > 1024 * 1024 * 10) // 10 MB
{
    combinedPdf.CompressImages(90);
    finalPdfBytes = combinedPdf.BinaryData;
}

Dieser Ansatz lässt sich auf beliebig viele Dokumente skalieren. Jedes PDF wird in ein PdfDocument Objekt geladen, zu einer Liste hinzugefügt und dann in einem einzigen Aufruf zusammengeführt. Bei großen Ausgabedateien reduziert die PDF-Komprimierung die endgültige Dateigröße, ohne dass dabei nennenswerte Qualitätseinbußen entstehen.

Wann sollte man MemoryStream für die PDF-Zusammenführung verwenden?

Der MemoryStream Ansatz gibt Ihnen mehr Kontrolle bei der Integration mit anderen .NET-Bibliotheken, die mit Streams statt mit Byte-Arrays arbeiten. Es ist auch dann nützlich, wenn bereits ein Datenstrom verfügbar ist (z. B. aus einer HTTP-Antwort oder einem Blob-Storage-SDK):

using (var stream1 = new MemoryStream(pdfBytes1))
using (var stream2 = new MemoryStream(pdfBytes2))
{
    var pdf1 = new PdfDocument(stream1);
    var pdf2 = new PdfDocument(stream2);

    var merged = PdfDocument.Merge(pdf1, pdf2);

    // Add metadata to the merged document
    merged.MetaData.Author = "Your Application";
    merged.MetaData.Title = "Merged Document";
    merged.MetaData.CreationDate = DateTime.Now;

    byte[] result = merged.BinaryData;
}

Sie können das zusammengeführte Dokument anreichern, indem Sie Metadaten festlegen , Wasserzeichen hinzufügen oder digitale Signaturen anwenden, bevor Sie die endgültigen Bytes extrahieren. Für Compliance-Szenarien empfiehlt sich die Konvertierung in PDF/A für die Langzeitarchivierung oder die Einhaltung der PDF/UA- Vorgaben für Barrierefreiheitsanforderungen.

Streambasierte Verarbeitung bietet ein besseres Speichermanagement für größere PDF-Dateien und lässt sich nahtlos in Cloud-Speicher-SDKs integrieren. Dieser Ansatz ist besonders praktisch für asynchrone Muster in Diensten mit hohem Durchsatz.

Wie führt man aus einer Datenbank abgerufene PDFs zusammen?

Ein häufiges Anwendungsbeispiel aus der Praxis ist das Abrufen von PDF-Byte-Arrays aus einer SQL-Datenbank und deren bedarfsgerechte Kombination. Hier ist ein produktionsreifes Beispiel mit Fehlerbehandlung:

public string MergePdfDocumentsFromDatabase(List<int> documentIds)
{
    List<PdfDocument> documents = new List<PdfDocument>();

    try
    {
        foreach (int id in documentIds)
        {
            // Fetch PDF byte array from database
            byte[] pdfData = GetPdfFromDatabase(id); // Replace with your data access logic

            if (pdfData == null || pdfData.Length == 0)
            {
                Console.WriteLine($"Warning: Document {id} is empty or not found");
                continue;
            }

            documents.Add(new PdfDocument(pdfData));
        }

        if (documents.Count == 0)
        {
            return "Error: No valid documents found to merge";
        }

        // Merge all documents
        PdfDocument mergedDocument = PdfDocument.Merge(documents);

        // Add page numbers to the footer
        mergedDocument.AddHtmlFooters(new HtmlHeaderFooter()
        {
            HtmlFragment = "<center>Page {page} of {total-pages}</center>",
            DrawDividerLine = true
        });

        // Save back to the database
        byte[] resultBytes = mergedDocument.BinaryData;
        SaveMergedPdfToDatabase(resultBytes);

        return "Document successfully combined and saved.";
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error merging PDFs: {ex.Message}");
        return $"Merge failed: {ex.Message}";
    }
}

Dieses Muster geht elegant mit fehlenden oder leeren Datensätzen um, indem es diese überspringt und mit gültigen Dokumenten fortfährt. Dem zusammengeführten Ergebnis werden über HTML-Kopf- und Fußzeilen Seitenzahlen hinzugefügt, bevor es zurück in die Datenbank geschrieben wird. Für eine erweiterte Navigation können Sie Lesezeichen hinzufügen , um den Lesern die Navigation in einem langen, zusammengeführten Dokument zu erleichtern.

Was macht das Datenbankmuster effektiv?

Das oben beschriebene Muster funktioniert für Rechnungen, Berichte, Verträge oder beliebige Dokumente, die als Binärspalten gespeichert sind. Wichtigste Vorteile:

  • Keine temporären Dateien : Der gesamte Workflow findet im Arbeitsspeicher statt, wodurch der Zugriff auf das Dateisystem vermieden und die Angriffsfläche verringert wird.
  • Sanftes Überspringen : Ungültige oder fehlende Datensätze führen nicht zum Abbruch des gesamten Zusammenführungsprozesses – sie werden protokolliert und übersprungen.
  • Anreicherung vor dem Speichern : Das Hinzufügen von Fußzeilen oder Metadaten zum zusammengeführten Dokument erfolgt, bevor das endgültige Byte-Array extrahiert wird, sodass das Ergebnis vollständig und sofort einsatzbereit ist.
  • Einmaliger Datenbank-Schreibvorgang : Das zusammengeführte Ergebnis wird nur einmal geschrieben, wodurch die Datenbanktransaktionen einfach bleiben.

Wie gehen Sie mit Fehlern und Sonderfällen um?

Was sind die häufigsten Fehlerszenarien?

Beim Erstellen von PDF-Merge-Workflows sollten verschiedene Fehlerquellen vermieden werden:

  1. Null- oder leere Byte-Arrays : Das häufigste Problem. Überprüfen Sie immer pdfData != null && pdfData.Length > 0, bevor Sie eine PdfDocument konstruieren.
  2. Beschädigte oder ungültige PDF-Daten : Wenn das Byte-Array während der Speicherung in der Datenbank oder der API-Übertragung abgeschnitten wurde, löst der Konstruktor eine Ausnahme aus. Umschließen Sie alles mit einem try-catch-Block und protokollieren Sie die Dokument-ID.
  3. Verschlüsselte PDFs ohne Passwörter : Der Versuch, eine passwortgeschützte PDF-Datei ohne Angabe des Passworts zusammenzuführen, führt zu einer Ausnahme. Verwenden Sie die passwortgeschützte PDF-Verarbeitung von IronPDF, um Anmeldeinformationen anzugeben.
  4. Speicherdruck durch viele große Dateien : Das gleichzeitige Laden von Dutzenden großer PDFs kann den verfügbaren Speicher überlasten. Verarbeiten Sie sie in Chargen und entsorgen Sie PdfDocument Objekte nach dem Zusammenführen.

Hier ist ein zuverlässiges Muster mit Eingabevalidierung:

public bool TryMergePdfByteArrays(byte[] pdfBytes1, byte[] pdfBytes2, out byte[] mergedBytes)
{
    mergedBytes = null;

    try
    {
        if (pdfBytes1 == null || pdfBytes1.Length == 0)
            throw new ArgumentException("First PDF byte array is null or empty");

        if (pdfBytes2 == null || pdfBytes2.Length == 0)
            throw new ArgumentException("Second PDF byte array is null or empty");

        using var pdf1 = new PdfDocument(pdfBytes1);
        using var pdf2 = new PdfDocument(pdfBytes2);

        if (pdf1.PageCount == 0)
            throw new InvalidOperationException("First PDF has no pages");

        if (pdf2.PageCount == 0)
            throw new InvalidOperationException("Second PDF has no pages");

        var mergedPdf = PdfDocument.Merge(pdf1, pdf2);
        mergedBytes = mergedPdf.BinaryData;

        return true;
    }
    catch (Exception ex)
    {
        Console.WriteLine($"PDF merge failed: {ex.Message}");
        return false;
    }
}

Die using Anweisungen sorgen dafür, dass PdfDocument Objekte korrekt entsorgt werden, um nicht verwaltete Ressourcen freizugeben, auch wenn eine Ausnahme auftritt. Das TryXxx Muster gibt einen booleschen Erfolgsindikator zurück statt zu werfen, was es einfach macht, es von höherer Ebene Code aufzurufen, der mit mehreren Dokumenten arbeitet.

Wie lassen sich häufige Fehler vermeiden?

Mehrere Gewohnheiten verringern das Risiko von Produktionsausfällen:

  • Vor dem Laden validieren : Sicherstellen, dass die Byte-Arrays nicht null sind und eine plausible Mindestlänge aufweisen (PDF-Header sind mindestens einige hundert Bytes lang).
  • Verwenden Sie using zur Entsorgung: IronPDF-Dokumente halten native Ressourcen. Entsorgen Sie sie immer, entweder mit using Anweisungen oder durch explizite Dispose() Aufrufe.
  • Benutzerdefinierte Protokollierung aktivieren : Dokument-ID, Byte-Array-Länge und Seitenzahl werden protokolliert, wenn Dokumente aus einer Datenbank zusammengeführt werden. Dadurch wird die Fehlersuche in der Produktion deutlich einfacher.
  • Verschlüsselte PDFs explizit behandeln : Vor dem Zusammenführen prüfen, ob ein Dokument ein Passwort erfordert. Der Versuch, ein verschlüsseltes Dokument ohne Zugangsdaten zu lesen, löst eine Ausnahme aus, anstatt leere Seiten zurückzugeben.
  • Zeitlimits für komplexe Dokumente festlegen : Die Verarbeitung sehr großer oder komplexer PDFs kann Zeit in Anspruch nehmen. Bei hohem Datenaufkommen sollten asynchrone Operationen und geeignete Timeout-Werte berücksichtigt werden.
Vergleich der PDF-Zusammenführungsmethoden
AnsatzAm besten fürSpeichernutzungFlexibilität
Direktes Byte-Array (zwei Dateien)Einfaches Zusammenführen zweier DokumenteNiedrigGrundlegendes
List<PdfDocument> overloadStapelverarbeitung vieler DateienMittelHoch
MemoryStream-KonstruktorStreambasierte IntegrationenNiedrigHoch
DatenbankabrufmusterWorkflows für ProduktionsdokumenteMittelSehr hoch

Wie fange ich mit dem Zusammenführen von PDFs in der Produktion an?

IronPDF bietet eine vollumfängliche kostenlose Testversion , damit Sie das Zusammenführen von PDFs in Ihrer tatsächlichen Anwendung testen können, bevor Sie sich für eine Lizenz entscheiden. Die Testversion beinhaltet die vollständige API – Zusammenführen, Aufteilen, Konvertieren, Kommentieren, Signieren und mehr – ohne Funktionseinschränkungen während der Evaluierungsphase.

Für den Produktiveinsatz reichen die Lizenzoptionen von Einzelentwicklerlizenzen bis hin zu Enterprise , die unbegrenzte Bereitstellungen abdecken. Organisationen, die mit einem hohen Arbeitsaufkommen arbeiten, können OEM-Lizenzen für Weiterverteilungsszenarien in Betracht ziehen.

Neben dem Zusammenführen von Dateien deckt IronPDF den gesamten PDF-Verarbeitungszyklus ab: HTML-zu-PDF-Konvertierung , PDF-Bearbeitung , Formularerstellung und -ausfüllung , Textextraktion , digitale Signaturen und Sicherheitsmanagement . Sobald der Merge-Workflow funktioniert, lassen sich diese Funktionen ohne zusätzliche Abhängigkeiten nahtlos integrieren.

Auf der IronPDF -Tutorialseite finden Sie vollständige Anleitungen für jede wichtige Funktion. Detaillierte Dokumentationen zu jeder Klasse und Methode finden Sie in der API-Referenz .

NuGetMit NuGet installieren

PM > Install-Package IronPdf

Install IronPDF by running the command above in the NuGet Package Manager Console, or search for the package in the NuGet Package Manager.
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 Handbücher.

...
Weiterlesen

Verwandte Artikel

Key in blue circle

Holen Sie sich sofort Ihren kostenlosen 30-Tage-Testschlüssel.

Your trial license will be sent to your email address

Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.

OR
bullet_checkedIhr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Buchen Sie Ihre kostenlose Live-Demo
Booking Badge

Von Millionen von Ingenieur*innen weltweit vertraut

Kundenlogos von Iron Software
Erhalten Sie Ihre unverbindliche Beratung
Füllen Sie das Formular unten aus oder senden Sie eine E-Mail an sales@ironsoftware.com
Ihre Daten werden immer vertraulich behandelt.
Von Millionen von Ingenieur*innen weltweit vertraut
Kundenlogos von Iron Software
Erhalten Sie sofort Ihren kostenlosen 30-Tage-Testschlüssel.
Ihr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.
C# NuGet-Bibliothek für PDF
Installation mit NuGet

Version: 2026.9

PM > Install-Package IronPdf
nuget.org/packages/IronPdf/
  1. Rechtsklick auf Referenzen, NuGet-Pakete verwalten
  2. Wählen Sie Durchsuchen und suchen Sie nach 'IronPDF'
  3. Paket auswählen und installieren
C# PDF DLL
Download DLL

Version: 2026.9

oder laden Sie den Windows-Installer hier herunter.

  1. Laden Sie IronPDF herunter und entpacken Sie es in ein Verzeichnis wie ~/Libs innerhalb Ihres Lösungsverzeichnisses
  2. Im Visual Studio-Projektmappen-Explorer klicken Sie mit der rechten Maustaste auf Referenzen. Wählen Sie Durchsuchen, "IronPDF.dll"

Lizenzen ab 999 $