Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

Aspose.BarCode for .NET vs IronBarcode: C# BarCode Bibliothek Vergleich

Jeder Entwickler, der Aspose.BarCode verwendet hat, hat eine Version dieser Zeile geschrieben: new BarCodeReader(path, DecodeType.Code128). Es funktioniert einwandfrei, wenn man weiß, welches Format das Bild hat. Wenn dies nicht der Fall ist – wenn ein Dokument aus einem externen System stammt, von einem Lieferanten, der sein Etikettenformat geändert hat, oder von einem Benutzer hochgeladen wurde –, müssen Sie entweder eine Liste von Dekodierungstypen erraten oder auf DecodeType.AllSupportedTypes zurückgreifen, was merklich langsamer ist. Die Anforderung an die Formatvorgabe ist zwar kein K.O.-Kriterium, aber sie führt zu alltäglichen Reibungsverlusten, die sich bei jedem Lesevorgang in Ihrer Codebasis summieren.

Die PDF-Geschichte ist die Budgetgeschichte. Wenn Sie Barcodes aus PDF-Dokumenten verarbeiten, kann Aspose.BarCode dies nicht allein leisten. Sie benötigen Aspose.PDF für .NET , um die Seiten zunächst in Bilder umzuwandeln. Aspose.PDF ist ein weiteres Abonnement: 999 bis 4.995 US-Dollar pro Jahr zusätzlich zu den Kosten für Aspose.BarCode. Zwei Abonnements für einen Workflow, den die meisten Entwickler als eine einzige Aufgabe betrachten.

IronBarcode erkennt Barcode-Formate automatisch, liest PDFs nativ in einem einzigen Paket und bietet eine unbefristete Lizenz ab 749 US-Dollar. Dieser Vergleich untersucht beide Bibliotheken detailliert, damit Sie eine fundierte Entscheidung treffen können.

Aspose.BarCode verstehen

Aspose entwickelt seit Jahren Dokumentenverarbeitungsbibliotheken für .NET, Java und andere Plattformen. Aspose.BarCode ist eines von vielen Produkten dieser Familie, neben Aspose.Words, Aspose.Cells, Aspose.PDF, Aspose.Slides und etwa einem Dutzend weiterer Produkte. Für Teams, die bereits Aspose.Total – das Paket mit allen Aspose-Produkten – nutzen, entstehen durch die Integration von Aspose.BarCode keine zusätzlichen Kosten. Für Teams, die lediglich eine Barcode-Bibliothek benötigen, ist das Abonnementmodell hingegen schwerer zu rechtfertigen.

Aspose.BarCode unterstützt über 60 Barcode-Symbologien und bietet damit die vollständigste Formatliste aller kommerziellen .NET -Barcodebibliotheken. Diese Bandbreite ist das stärkste Verkaufsargument der Bibliothek. Die API-Oberfläche ist entsprechend groß, und die Ausführlichkeit der API nimmt mit den Funktionen zu. Um einen einfachen Code-128-Barcode zu generieren, muss eine BarcodeGenerator-Instanz erstellt, XDimension, BarHeight und weitere Parameter festgelegt und anschließend Save mit einem expliziten Formatargument aufgerufen werden. Zum Lesen ist es erforderlich, die zu durchsuchenden Dekodierungstypen anzugeben, ReadBarCodes() aufzurufen und dann FoundBarCodes zu iterieren. Beide Operationen funktionieren einwandfrei – sie sind nur etwas ausführlicher als nötig.

Wichtigste architektonische Merkmale von Aspose.BarCode:

  • Format-First-Lesemodell: Jeder Lesevorgang erfordert die explizite Angabe von DecodeType. Der Fallback DecodeType.AllSupportedTypes ist deutlich langsamer als eine gezielte Liste, da der Decoder jede bekannte Symbolik nacheinander durchläuft.
  • Instanzbasierte API: Sowohl BarCodeReader als auch BarcodeGenerator sind instanziierte Objekte, die IDisposable implementieren. Wenn sie nicht in using Blöcke eingeschlossen werden, führt dies zu Ressourcenlecks.
  • Keine native PDF-Unterstützung: Aspose.BarCode kann PDF-Dokumente nicht direkt öffnen oder darstellen. Zum Auslesen von Barcodes aus PDFs ist Aspose.PDF erforderlich, ein separates Abonnementprodukt, das 999 bis 4.995 US-Dollar pro Jahr kostet.
  • Tiefe Parameterhierarchie: Die Anpassung erfolgt über generator.Parameters.Barcode.* Eigenschaftsketten – eine mehrstufige Objekthierarchie, die auswendig gelernt werden muss.
  • Nur Abonnementlizenzen: Alle Stufen sind Jahresabonnements. Eine unbefristete Lizenz ist als eigenständiges Produkt nicht verfügbar.
  • Dateibasierte Lizenzaktivierung: Für Produktionsbereitstellungen wird eine .lic-Datei benötigt, die unter einem bekannten Pfad zugänglich ist. Dies fügt einen zusätzlichen Bereitstellungsschritt für Docker- und Kubernetes-Umgebungen hinzu.

Das Format-First-Lesemodell

Die Lese-API von Aspose.BarCode basiert auf der Annahme, dass der Aufrufer das Barcode-Format kennt:

// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition

' Aspose.BarCode: must specify format or use slow AllSupportedTypes
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
reader.ReadBarCodes()
For Each result In reader.FoundBarCodes
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
$vbLabelText   $csharpLabel

Wenn man das Format kennt, ist dieses Muster in Ordnung. Das Problem ist jedoch, "wenn man das Format kennt". Ein Einkaufssystem, das Lieferantenrechnungen verarbeitet, kann nicht garantieren, dass jeder Lieferant denselben Barcode-Typ verwendet. Ein Dokumentenmanagementsystem, das Benutzer-Uploads akzeptiert, kann nicht vorhersagen, welches Format ein Scanner verwendet hat. In diesen Fällen wird DecodeType.AllSupportedTypes als Ausweichlösung verwendet, die jedoch deutlich langsamer ist als eine gezielte Dekodierungstypliste.

Der Decoder muss ebenfalls entsorgt werden:

using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
$vbLabelText   $csharpLabel

Die Nichtverwendung von using führt zu einem Ressourcenleck. Der BarcodeGenerator implementiert auch IDisposable, allerdings sind die Folgen einer Nichtbeachtung weniger gravierend. In beiden Fällen verwalten Sie die Lebensdauer von Objekten, die eine statische Factory-API automatisch übernehmen würde.

IronBarcode verstehen

IronBarcode verwendet statische Factory-Methoden sowohl zum Lesen als auch zum Schreiben. Es gibt keine Instanz, die erstellt, konfiguriert oder freigegeben werden könnte. Die Lese-API ist standardmäßig formatunabhängig, und der gleiche Aufruf funktioniert unabhängig davon, ob die Quelldatei eine PNG-, JPEG-, TIFF- oder PDF-Datei ist.

IronBarcode wird von Iron Software entwickelt und gepflegt, einem Unternehmen, das sich ausschließlich auf .NET Entwicklerwerkzeuge konzentriert. Die Bibliothek basiert auf dem Prinzip, dass das Lesen von Barcodes keine Vorkenntnisse über das Barcode-Format erfordern sollte – die Erkennungs-Engine der Bibliothek ermittelt das Format anhand des Bildinhalts. Zur Generierung wird die in anderen Bibliotheken übliche mehrstufige Parameterhierarchie durch eine flüssige Methodenkette ersetzt.

Hauptmerkmale von IronBarcode:

  • Automatische Formaterkennung: BarcodeReader.Read() erkennt die Barcode-Symbologie aus dem Bildinhalt, ohne dass der Aufrufer ein DecodeType Äquivalent angeben muss.
  • Statische, zustandslose API: Alle Lese- und Schreibvorgänge sind statische Methoden. Es müssen keine Wegwerfinstanzen verwaltet werden, und die API ist von Natur aus threadsicher für die gleichzeitige Nutzung.
  • Native PDF-Unterstützung: BarcodeReader.Read("doc.pdf") liest direkt aus PDF-Dateien ohne zusätzliche Pakete oder Rendering-Schritte. Ergebnisse umfassen result.PageNumber.
  • Fluent Generation API: BarcodeWriter.CreateBarcode() gibt ein verkettbares Objekt zurück. Die Anpassung erfolgt mittels Methodenverkettung anstelle einer Eigenschaftshierarchie.
  • Dauerlizenzmodell: Alle Stufen bieten einen einmaligen Kauf ohne jährliche Verlängerungspflicht.
  • Lizenzaktivierung über Zeichenketten: Der Lizenzschlüssel wird über IronBarCode.License.LicenseKey festgelegt und ist kompatibel mit Umgebungsvariablen und CI/CD Secret Managern.

Funktionsvergleich

Feature Aspose.BarCode IronBarcode
Formaterkennung Manuell — muss DecodeType angeben oder langsam AllSupportedTypes verwenden Automatischer Ablauf über alle unterstützten Formate hinweg
Symbolik zählen 60+ 50+
PDF-Unterstützung Keine native Unterstützung – separate Aspose.PDF-Lizenz erforderlich. Native — BarcodeReader.Read("doc.pdf") im Paket integriert
Preismodell Nur Abonnement – ​​999–4.995 $/Jahr Dauerlizenz ab 749 $ (einmalig)
Dauerlizenz Nicht verfügbar Ja, alle Stufen.
API-Stil Instanzbasierte, ausführliche Konfiguration Statische Factory-Methoden, flüssige API
Einwegbedarf Ja — BarCodeReader und BarcodeGenerator Nein – zustandslose statische Methoden
Thread-Sicherheit Für jeden Thread sind separate Instanzen erforderlich. Staatenlos – natürlich sicher für gleichzeitige Nutzung

Detaillierter Funktionsvergleich

Feature Aspose.BarCode IronBarcode
Generation
API-Stil new BarcodeGenerator(EncodeTypes.X, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X)
Anpassungsmodell generator.Parameters.Barcode.* Eigenschaftshierarchie Fluent Method Chain (.ResizeTo(), .ChangeBarCodeColor())
QR-Code mit Logo Manuelle GDI+-Überlagerung nach der Generierung .AddBrandLogo("logo.png") eingebaut
Ausgabe in Bytes generator.GenerateBarCodeImage() .ToPngBinaryData()
Farbige Barcodes generator.Parameters.Barcode.BarColor .ChangeBarCodeColor(Color.X)
Lektüre
Formatspezifikation Erforderlich (DecodeType) Nicht erforderlich – automatisch
Fallback für unbekanntes Format DecodeType.AllSupportedTypes (langsam) Gleicher Anruf – kein Fallback-Modus erforderlich
Leistungsoptimierung 12+ QualitySettings Parameter ReadingSpeed enum — drei Ebenen
Einweglesegerät Ja — using var reader = new BarCodeReader(...) Nein – statischer Aufruf, kein Objekt zum Freigeben
Ergebniszugriff reader.FoundBarCodesnach dem Aufruf von ReadBarCodes() Rückgabewert von BarcodeReader.Read()
Barcode-Werteigenschaft result.CodeText result.Value
Format Name Eigenschaft result.CodeTypeName result.Format.ToString()
PDF-Unterstützung
Native PDF-Lesung Nein Ja
Erforderlich für PDF Aspose.PDF (999–4.995 US-Dollar/Jahr zusätzlich) Kein zusätzliches Paket
Seitenzahl in den Ergebnissen Nicht anwendbar result.PageNumber
Lizenzierung
Lizenzmodell Nur Abonnement, jährliche Verlängerung Dauerhafter, einmaliger Kauf
Einzelentwickler 999 $/Jahr 749 $ einmalig
10 Entwickler 4.995 $/Jahr (Standortlizenz) 2.999 $ einmalig (Professional)
Unbegrenzte Entwickler 14.985 $/Jahr (OEM) 5.999 $ einmalig (unbegrenzt)
PDF-Unterstützung inklusive Nein – separates Aspose.PDF-Abonnement erforderlich. Ja
Plattform und Bereitstellung
Lizenzaktivierung .lic Dateipfad String-Schlüssel — Umgebungsvariable
Docker-Einsatz Die Datei .lic muss in das Image kopiert oder eingebunden werden. Umgebungsvariable – keine Datei erforderlich
.NET Framework Ja Ja (4.6.2+)
.NET Core / .NET 5+ Ja Ja (.NET Core 3.1+, .NET 5/6/7/8/9)
Windows Ja Ja (x64/x86)
Linux Ja Ja (x64)
macOS Ja Ja (x64/ARM)
Docker Ja Ja
Azure / AWS Lambda Ja Ja

API-Generierung

Die API zur Generierung ist der Bereich, in dem der Unterschied in der Ausführlichkeit zwischen den beiden Bibliotheken im alltäglichen Code am deutlichsten sichtbar wird.

Aspose.BarCode-Ansatz

Aspose.BarCode verwendet eine BarcodeGenerator Klasse mit einer Parameters Hierarchie zur Konfiguration. Ein minimaler Generierungsaufruf erfordert drei Schritte – Instanziierung, Speicheraufruf und Formatspezifikation. Die praktische Nutzung erfordert typischerweise die Navigation zu generator.Parameters.Barcode.*:

using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
Imports Aspose.BarCode.Generation
Imports System.Drawing

Dim generator As New BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345")

' Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2
generator.Parameters.Barcode.BarHeight.Pixels = 100
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial"
generator.Parameters.Barcode.Padding.Left.Pixels = 10
generator.Parameters.Barcode.Padding.Right.Pixels = 10
generator.Parameters.BackColor = Color.White
generator.Parameters.Resolution = 300

generator.Save("barcode.png", BarCodeImageFormat.Png)
$vbLabelText   $csharpLabel

Jede Anpassung navigiert in generator.Parameters.Barcode.*, eine mehrstufige Objekthierarchie. Nicht kompliziert, sobald man es auswendig gelernt hat – aber es erfordert Auswendiglernen.

IronBarcode Ansatz

IronBarcode ersetzt die Parameterhierarchie durch eine flüssige Methodenkette. Die Standardeinstellungen liefern für die meisten Anwendungsfälle korrekte Ergebnisse, und Anpassungen werden direkt im Code vorgenommen:

using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports IronBarCode

' Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")

' Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")

' Get as bytes instead of saving to disk
Dim pngData As Byte() = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Für QR-Codes bietet die QR-Generierungs-API von IronBarcode Unterstützung für Markenlogos ohne manuelle Bildkomposition:

using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
Imports IronBarCode
Imports IronSoftware.Drawing

' With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")

' With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded-high-ecc.png")

' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
    .ChangeBarCodeColor(Color.DarkBlue) _
    .SaveAsPng("qr-colored.png")
$vbLabelText   $csharpLabel

Aspose.BarCode erfordert manuelles Zeichnen mit GDI+, um ein Logo auf einen QR-Code zu legen – also das Generieren des Barcode-Bildes und anschließendes Komponieren des Logos mit der Zentrierung darüber mithilfe von System.Drawing.Graphics. IronBarcodes AddBrandLogo erledigt das mit einem einzigen Aufruf und stellt die Fehlerkorrektur automatisch entsprechend ein.

PDF-Barcode-Lesen

Für viele Teams ist dieser Vergleich von größter Bedeutung. Das Auslesen von Barcodes aus PDF-Dokumenten ist ein gängiger Arbeitsablauf: eingehende Rechnungen, als PDF gespeicherte Versandetiketten, gescannte Dokumentenarchive.

Aspose.BarCode-Ansatz

Aspose.BarCode bietet keine native PDF-Unterstützung. Um mit Aspose einen Barcode aus einer PDF-Datei zu lesen, benötigen Sie Aspose.PDF zum Laden der PDF-Datei und zum Rendern der Seiten in Bilder sowie Aspose.BarCode zum Scannen dieser gerenderten Bilder. Beides sind Abonnementprodukte. Beide benötigen eine Lizenzaktivierung. Zusammengenommen belaufen sich die Kosten auf 1.998 bis 9.990 US-Dollar pro Jahr für das, was die meisten Entwickler als eine einzige Funktion betrachten.

// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Devices
Imports Aspose.BarCode.BarCodeRecognition
Imports System.IO

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim barcodeValues As New List(Of String)()

    ' Step 1: Load and render the PDF using Aspose.PDF
    Dim pdfDocument As New Aspose.Pdf.Document(pdfPath)
    Dim resolution As New Resolution(300)
    Dim device As New PngDevice(resolution)

    For pageNum As Integer = 1 To pdfDocument.Pages.Count
        Using pageStream As New MemoryStream()
            device.Process(pdfDocument.Pages(pageNum), pageStream)
            pageStream.Seek(0, SeekOrigin.Begin)

            ' Step 2: Scan the rendered image for barcodes using Aspose.BarCode
            Using reader As New BarCodeReader(pageStream, DecodeType.AllSupportedTypes)
                For Each result In reader.ReadBarCodes()
                    barcodeValues.Add(result.CodeText)
                Next
            End Using
        End Using
    Next

    Return barcodeValues
End Function
$vbLabelText   $csharpLabel

Das sind zwei Lizenzkonfigurationen, zwei using-Anweisungen aus zwei Namensräumen, eine Rendering-Pipeline, Speicherstromverwaltung und eine verschachtelte Schleife. Außerdem wird DecodeType.AllSupportedTypes verwendet, da zum Zeitpunkt der Bildextraktion das Format des Barcodes in der Regel noch nicht bekannt ist.

IronBarcode Ansatz

IronBarcode übernimmt das Parsen von PDFs, das Rendern der Seiten und die Barcode-Erkennung intern. Sie rufen Read mit einem Pfad auf, der mit .pdf endet, und erhalten Barcode-Ergebnisse, die result.PageNumberenthalten, sodass Sie wissen, von welcher Seite jeder einzelne stammt. Kein zweites Paket, keine zweite Lizenz, kein Rendering-Code.

using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
Imports IronBarCode

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim results = BarcodeReader.Read(pdfPath)
    Return results.Select(Function(r) r.Value).ToList()
End Function
$vbLabelText   $csharpLabel
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports System

' With page number context
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Die IronBarcode Dokumentation zum Lesen von PDFs behandelt Optionen zur Stapelverarbeitung mehrseitiger Dokumente sowie zur Filterung von Seitenbereichen.

Lesen unbekannter Barcode-Formate

Wenn man nicht weiß, welches Barcode-Format ein Bild enthält, gehen die beiden Bibliotheken sehr unterschiedlich mit der Situation um.

Aspose.BarCode-Ansatz

DecodeType.AllSupportedTypes ist die Lösung von Aspose für Szenarien mit unbekanntem Format. In der Dokumentation von Aspose wird selbst eingeräumt, dass dies langsamer ist als die Angabe einer Zielliste, da der Decoder alle bekannten Symboliken nacheinander durchläuft. Bei der Verarbeitung großer Mengen – beispielsweise in einem Lager, das Tausende von Etiketten pro Minute scannt – ist dieser Leistungsunterschied nicht zu vernachlässigen.

using Aspose.BarCode.BarCodeRecognition;

// AllSupportedTypes scans for every known format — significantly slower
using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
using Aspose.BarCode.BarCodeRecognition;

// AllSupportedTypes scans for every known format — significantly slower
using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
Imports Aspose.BarCode.BarCodeRecognition

' AllSupportedTypes scans for every known format — significantly slower
Using reader As New BarCodeReader("unknown-format.png")
    reader.SetBarCodeReadType(DecodeType.AllSupportedTypes)
    For Each result In reader.ReadBarCodes()
        Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
    Next
End Using
$vbLabelText   $csharpLabel

IronBarcode Ansatz

Es gibt keinen "langsamen Modus" und keinen "schnellen Modus" basierend auf Formatkenntnissen. Die Erkennungsmethode von IronBarcode verwendet denselben Algorithmus, unabhängig davon, ob das Bild einen Code 128 oder eine DataMatrix enthält. Wenn Sie das Verhältnis zwischen Leistung und Genauigkeit optimieren möchten, ermöglicht Ihnen die Option ReadingSpeed dies, ohne dass Formatkenntnisse erforderlich sind:

using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode

' The same call regardless of format — always auto-detects
Dim results = BarcodeReader.Read("unknown-format.png")
For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("document.png", options);
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("document.png", options);
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read("document.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Faster priorisiert den Durchsatz. ReadingSpeed.Detailed legt Wert auf Genauigkeit bei beschädigten oder kontrastarmen Bildern. Für keine der beiden Methoden müssen Sie das Format im Voraus kennen. Die vollständigen Einstellparameter finden Sie unter IronBarcode Leseoptionen .

API-Mapping-Referenz

Aspose.BarCode IronBarcode
new BarCodeGenerator(EncodeTypes.Code128, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
generator.Save("file.png", BarCodeImageFormat.Png) .SaveAsPng("file.png")
new BarCodeReader(path, DecodeType.Code128) BarcodeReader.Read(path)
DecodeType.AllSupportedTypes (langsamer, vollständiger Scan) Automatisch – immer schnell, gleicher Aufruf für alle Formate
reader.ReadBarCodes() (part of BarcodeReader.Read — returns results directly)
reader.FoundBarCodes Rückgabewert von BarcodeReader.Read
result.CodeText result.Value
result.CodeTypeName result.Format.ToString()
result.Confidence result.Confidence
Aspose.BarCode + Aspose.PDF for PDF reading BarcodeReader.Read("doc.pdf") — ein Paket
license.SetLicense("Aspose.BarCode.lic") IronBarCode.License.LicenseKey = "key"
new Aspose.BarCode.Metered() + .SetMeteredKey() (not needed — single key covers all environments)
generator.GenerateBarCodeImage() .ToPngBinaryData()oder .SaveAsPng()
QREncodeMode.Auto + QRErrorLevel.LevelH + manuelle Logo-Überlagerung QRCodeWriter.CreateQrCode().AddBrandLogo()

Wenn Teams einen Wechsel von Aspose.BarCode zu IronBarcode erwägen

Mehrere Szenarien veranlassen Entwicklungsteams üblicherweise dazu, IronBarcode als Alternative zu Aspose.BarCode zu evaluieren.

Die Abonnementverlängerung ist da

Bei der jährlichen Abonnementverlängerung überprüfen Teams am häufigsten ihre Bibliotheksentscheidungen. Wenn Aspose.BarCode das einzige Aspose-Produkt im Portfolio ist, veranlassen die Kosten von 999 bis 4.995 US-Dollar pro Jahr für die Barcode-Funktionalität zu einem Vergleich. Das Gespräch verläuft üblicherweise so: "Das zahlen wir jedes Jahr auf ewig." Was kostet IronBarcode einmalig? In der Professional Version (2.999 US-Dollar für 10 Entwickler) amortisiert sich IronBarcode innerhalb des ersten Jahres mit der Standortlizenz.

Für Teams, die Aspose.Total verwenden – wo Aspose.BarCode mit mehr als 20 anderen Produkten gebündelt ist – sieht die Rechnung anders aus. Die Grenzkosten von Aspose.BarCode innerhalb dieses Pakets nähern sich Null. Diese Teams haben weniger Grund zum Wechseln.

PDF-Unterstützung wird zur Voraussetzung

Viele Projekte beginnen mit dem Auslesen von Barcodes aus Bildern und fügen dann später die PDF-Unterstützung hinzu, wenn ein Beteiligter feststellt, dass die eingehenden Dokumente PDFs und keine Bilddateien sind. An diesem Punkt steht das Aspose.BarCode-Team vor einer Entscheidung: Aspose.PDF hinzufügen (ein weiteres Abonnement), einen PDF-Renderer von Drittanbietern finden oder die Barcode-Bibliothek neu bewerten.

Die Integration von Aspose.PDF erfüllt zwar das unmittelbare Problem, verdoppelt aber die Abonnementkosten. Die Suche nach einem Drittanbieter-Renderer führt zu einer zusätzlichen Abhängigkeit und einem höheren Integrationsaufwand. Das Ergebnis ist oft die erneute Überprüfung der Barcode-Bibliothek – und die Entdeckung, dass IronBarcode PDFs nativ gegen eine einmalige Gebühr lesen kann.

Formatunbekannte Szenarien in der Produktion

Kundenorientierte Anwendungen, die Dokumenten-Uploads akzeptieren, können nicht steuern, welches Barcode-Format ein hochgeladenes Dokument verwendet. Wenn die Anwendung unter der Annahme von Code-128-Eingaben erstellt wurde und ein Kunde ein DataMatrix-Label hochlädt, liefert ein fest codiertes DecodeType.Code128 stillschweigend keine Ergebnisse. Die Umstellung auf DecodeType.AllSupportedTypes behebt zwar die Korrektheit, führt aber zu Leistungseinbußen.

Teams, die auf dieses Problem gestoßen sind – nämlich immer mehr DecodeType-Werte zu ihrer Reader-Konfiguration hinzuzufügen, wenn neue Formate in der Produktion auftauchen –, müssen oft eine Liste pflegen, die jedes Mal aktualisiert werden muss, wenn eine neue Formatquelle hinzugefügt wird. Die automatische Erkennung von IronBarcode macht diese Liste überflüssig.

Cloud- und containerbasierte Bereitstellungen

Die dateibasierte Lizenzierung von Aspose.BarCode erfordert einen zusätzlichen Bereitstellungsschritt: Die Lizenzdatei muss zur Laufzeit über einen Pfad zugänglich sein, den die Anwendung lesen kann. In einem GitOps-Workflow landet die Lizenzdatei entweder in der Quellcodeverwaltung (ein Sicherheitsrisiko) oder muss über ein eingebundenes geheimes Volume eingebunden werden. Der schlüsselbasierte Ansatz von IronBarcode fügt sich nahtlos in Kubernetes Secrets und CI/CD Secret-Variablen ein, ohne dass im Container-Image eine Datei verwaltet werden muss.

Gemeinsame Überlegungen zur Migration

Teams, die von Aspose.BarCode auf IronBarcode umsteigen, müssen einige wenige, vorhersehbare technische Anpassungen vornehmen.

Zuordnung von Eigenschaftsnamen

Der häufigste Kompilierungsfehler nach dem Tauschen von Paketen ist die Umbenennung von result.CodeTextin result.Value. Eine Suche im gesamten Quellcode deckt dies schnell ab:

grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
SHELL

result.CodeText wird zu result.Value. result.CodeTypeNamewird zu result.Format.ToString(). Die Eigenschaft result.Format ist ein BarcodeEncoding Enumerationswert, der bei Bedarf auch typisierte Vergleiche ermöglicht.

DecodeType-Entfernung

Alle Verweise auf DecodeType.* im Quellcode können entfernt werden:

grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
SHELL

Wenn ein bestimmter DecodeType zur Leistungsverbesserung in einem bekannten Format aufgeführt wurde, bietet ReadingSpeed.Faster in BarcodeReaderOptions einen ähnlichen Vorteil ohne Formatkenntnisse.

Änderung der Lizenzinitialisierung

Aspose.BarCode verwendet eine .lic Datei, die über license.SetLicense() geladen wird. IronBarcode verwendet einen String-Schlüssel:

IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
Imports IronBarCode
Imports System

License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))
$vbLabelText   $csharpLabel

Entfernen Sie die Datei .lic aus dem Repository und den Build-Artefakten. In Dockerentfernen Sie die Zeile COPY Aspose.BarCode.lic und ersetzen sie durch einen Eintrag ENV IRONBARCODE_LICENSE.

Zuordnung von Codierungstypen zu Barcode-Codierung

EncodeTypes.QR entspricht BarcodeEncoding.QRCode — der Unterschied in der Benennung ist der Punkt, an dem Teams nach der Migration des Generierungscodes am häufigsten auf den ersten Kompilierungsfehler stoßen. Alle anderen Zuordnungen sind direkte Entsprechungen mit einheitlicher Benennung.

Zusätzliche IronBarcode Funktionen

Über die zentralen Vergleichspunkte hinaus bietet IronBarcode Funktionen, die je nach Anwendungskontext relevant sein können:

.NET-Kompatibilität und Zukunftsfähigkeit

IronBarcode unterstützt .NET Framework4.6.2+, .NET Core 3.1+ sowie .NET 5, 6, 7, 8 und 9. Die Bibliothek wird regelmäßig gemäß dem .NET Releasezyklus von Microsoft aktualisiert, wodurch die Kompatibilität mit .NET 10, das voraussichtlich Ende 2026 erscheint, gewährleistet ist. Aspose.BarCode unterstützt denselben .NET Versionsbereich, sodass keine der beiden Bibliotheken Kompatibilitätsvorteile gegenüber aktuellen Versionen bietet. Der entscheidende Unterschied für die Zukunftsfähigkeit liegt in der Lizenzierung: Eine heute erworbene unbefristete IronBarcode -Lizenz deckt zukünftige .NET Versionen ohne zusätzliche Kosten ab, während Aspose.BarCode-Abonnements eine fortlaufende Verlängerung erfordern, um Zugriff auf aktualisierte Versionen zu erhalten.

Abschluss

Aspose.BarCode und IronBarcode repräsentieren zwei unterschiedliche Philosophien im Design von Barcode-Bibliotheken. Aspose.BarCode basiert auf einer expliziten, instanzbasierten API, bei der der Aufrufer das Format angibt, die Lebensdauer von Objekten verwaltet und jede Operation über eine Eigenschaftshierarchie konfiguriert. IronBarcode basiert auf einer statischen, formatunabhängigen API, wobei die Bibliothek die Erkennung, den Objektlebenszyklus und das PDF-Rendering intern übernimmt. Keiner der beiden Ansätze ist an sich richtig – die richtige Wahl hängt davon ab, was die Anwendung benötigt.

Aspose.BarCode ist die bessere Wahl für Teams, die bereits im Aspose-Ökosystem tätig sind. Wenn Aspose.Total bereits lizenziert ist, verursacht Aspose.BarCode keine zusätzlichen Kosten, und seine Symbologieliste mit über 60 Zeichen ist die umfangreichste, die in einer kommerziellen .NET Barcodebibliothek verfügbar ist. Für Anwendungen, die ungewöhnliche Formate erfordern – MaxiCode, DotCode oder spezielle Postsymbologien, die nicht in der Liste der über 50 Symbole von IronBarcode enthalten sind – ist Aspose.BarCode möglicherweise die einzig praktikable Option. Seine Reife und Formatvielfalt sind echte Stärken.

Für Teams, die Aspose.BarCode als Einzelkauf in Betracht ziehen, gestaltet sich die Wertberechnung schwieriger. Die Anforderung an die Formatvorgabe führt zu zusätzlichen Schwierigkeiten bei jedem Lesevorgang. Das Fehlen einer nativen PDF-Unterstützung verdoppelt die Abonnementkosten für eine Funktion, die IronBarcode bereits im Basispaket bietet. Und das Abonnementmodell bedeutet, dass sich die Kosten jährlich erhöhen – 4.995 US-Dollar pro Jahr für ein Team von 10 Entwicklern summieren sich über fünf Jahre auf 24.975 US-Dollar, verglichen mit 2.999 US-Dollar bei einem einmaligen Kauf von IronBarcode Professional . Die automatische Erkennung, die native PDF-Lesefunktion und die unbefristete Lizenz von IronBarcode lösen alle drei Probleme in einem einzigen Paket.

Die Entscheidung hängt letztendlich von der Passung zum Ökosystem und den Symbolikanforderungen ab. Teams, die eng mit Aspose-Produkten integriert sind, oder Teams, die Formate außerhalb der von IronBarcode unterstützten Liste benötigen, gehören zu Aspose.BarCode. Teams, die eine eigenständige Dauerlizenz, native PDF-Lesefunktion und eine API wünschen, die keine Formatkenntnisse bei jedem Lesevorgang erfordert, werden IronBarcode als die praktischere Wahl empfinden.

Häufig gestellte Fragen

Was ist Aspose.BarCode für .NET?

Aspose.BarCode for .NET ist eine .NET-Barcode-Bibliothek zum Erzeugen und Lesen von Barcodes in C#-Anwendungen. Sie ist eine von mehreren Alternativen, die Entwickler bei der Auswahl einer Barcode-Lösung für .NET-Projekte in Betracht ziehen.

Was sind die Hauptunterschiede zwischen Aspose.BarCode for .NET und IronBarcode?

IronBarcode verwendet eine statische, zustandslose API, die keine Instanzverwaltung erfordert, während Aspose.BarCode for .NET in der Regel eine Instanzerstellung und -konfiguration vor der Verwendung erfordert. IronBarcode bietet außerdem native PDF-Unterstützung, automatische Formaterkennung und Single-Key-Lizenzierung in allen Umgebungen.

Ist IronBarcode einfacher zu lizenzieren als Aspose.BarCode for .NET?

IronBarcode verwendet einen einzigen Lizenzschlüssel, der sowohl die Entwicklungs- als auch die Produktionsbereitstellung abdeckt. Dies vereinfacht CI/CD-Pipelines und Docker-Konfigurationen im Vergleich zu Lizenzierungssystemen, die SDK-Schlüssel von Laufzeitschlüsseln trennen.

Unterstützt IronBarcode alle Barcode-Formate, die Aspose.BarCode for .NET unterstützt?

IronBarcode unterstützt über 30 Barcode-Symbologien, darunter QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 und viele mehr. Die automatische Formaterkennung bedeutet, dass keine explizite Formataufzählung erforderlich ist.

Unterstützt IronBarcode das native Lesen von PDF-Barcodes?

Ja, IronBarcode liest Barcodes direkt aus PDF-Dateien mit BarcodeReader.Read("document.pdf"), ohne dass eine separate PDF-Rendering-Bibliothek erforderlich ist. Die seitenweisen Ergebnisse umfassen Seitenzahl, Barcodeformat, Wert und Konfidenzwert.

Wie handhabt IronBarcode die Stapelverarbeitung im Vergleich zu Aspose.BarCode for .NET?

Die statischen Methoden von IronBarcode sind zustandslos und natürlich thread-sicher, was die direkte Verwendung von Parallel.ForEach ohne Instanzverwaltung pro Thread ermöglicht. Es gibt auf keiner Preisstufe eine Obergrenze für den Durchsatz.

Welche .NET Versionen werden von IronBarcode unterstützt?

IronBarcode unterstützt .NET Framework 4.6.2+, .NET Core 3.1 und .NET 5, 6, 7, 8 und 9 in einem einzigen NuGet-Paket. Zu den Zielplattformen gehören Windows x64/x86, Linux x64 und macOS x64/ARM.

Wie installiere ich IronBarcode in einem .NET-Projekt?

Installieren Sie IronBarcode über NuGet: Führen Sie "Install-Package IronBarCode" in der Paketmanager-Konsole oder "dotnet add package IronBarCode" in der CLI aus. Es sind keine zusätzlichen SDK-Installationsprogramme oder Laufzeitdateien erforderlich.

Kann ich IronBarcode vor dem Kauf testen, im Gegensatz zu Aspose.BarCode?

Ja, der Testmodus von IronBarcode liefert vollständige dekodierte Barcodewerte - nur die erzeugten Ausgabebilder erhalten ein Wasserzeichen. Sie können die Lesegenauigkeit an Ihren eigenen Dokumenten testen, bevor Sie sich zum Kauf verpflichten.

Was ist der Preisunterschied zwischen Aspose.BarCode for .NET und IronBarcode?

Die Preise für IronBarcode beginnen bei 749 US-Dollar für eine unbefristete Einzelentwicklerlizenz für Entwicklung und Produktion. Preisdetails und Volumenoptionen sind auf der IronBarcode-Lizenzierungsseite verfügbar. Es ist keine separate Runtime-Lizenz erforderlich.

Ist es einfach, von Aspose.BarCode for .NET zu IronBarcode zu migrieren?

Bei der Migration von Aspose.BarCode for .NET zu IronBarcode geht es in erster Linie darum, instanzbasierte API-Aufrufe durch die statischen Methoden von IronBarcode zu ersetzen, Lizenzierungsvorlagen zu entfernen und die Namen von Ergebniseigenschaften zu aktualisieren. Bei den meisten Migrationen wird eher Code reduziert als hinzugefügt.

Kann IronBarcode QR-Codes mit Logos generieren?

Ja. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") bettet ein Markenbild nativ in einen QR-Code mit konfigurierbarer Fehlerkorrektur ein. Farbige QR-Codes werden auch über ChangeBarCodeColor() unterstützt.

Jordi Bardia
Software Ingenieur
Jordi ist am besten in Python, C# und C++ versiert. Wenn er nicht bei Iron Software seine Fähigkeiten einsetzt, programmiert er Spiele. Mit Verantwortung für Produkttests, Produktentwicklung und -forschung trägt Jordi mit immensem Wert zur kontinuierlichen Produktverbesserung bei. Die abwechslungsreiche Erfahrung hält ihn gefordert und engagiert, ...
Weiterlesen

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an