Syncfusion Barcode vs IronBarcode: C# Barcode Bibliothek Vergleich
ZXing.Net vs IronBarcode: Wahl einer .NET Barcode-Bibliothek in 2026
ZXing.Net's BarcodeReader ist nicht threadsicher. Jeder gleichzeitige Leseprozess in Ihrer Anwendung — jeder parallele ForEach, jede asynchrone Controller-Aktion, die gleichzeitige Anfragen verarbeitet — erfordert eine eigene Leserinstanz. Das bedeutet, dass die Formatkonfiguration pro Instanz wiederholt wird, Bitmap beim Laden und Freigeben pro Aufruf sowie Leserallokation bei jeder Anfrage. Die statische Methode von IronBarcode erledigt die gleiche Arbeit ohne pro Anfrage Allokation. Thread-Sicherheit ist nur ein Punkt auf der Liste: fehlende native PDF-Unterstützung, Fragmentierung des Bindungspakets unter Windows und Linux sowie die Notwendigkeit, jedes Barcode-Format, das gescannt werden soll, anzugeben – dies sind die Merkmale, die dazu führen, dass sich bei ZXing .NET -Projekten im Laufe der Zeit Workarounds ansammeln.
ZXing .NET verstehen
ZXing .NET ist eine Open-Source-Portierung der Java-Bibliothek ZXing ("Zebra Crossing") von Google, die unter der Apache-2.0-Lizenz veröffentlicht und von Michael Jahn auf GitHub gepflegt wird. Es handelt sich um die am häufigsten heruntergeladene Open-Source-Barcode-Bibliothek für .NET mit einer langen Erfolgsgeschichte, die sich über mehr als ein Jahrzehnt erstreckt. Die Bibliothek deckt sowohl das Lesen als auch das Schreiben einer breiten Palette von Barcode-Formaten ab, und ihre kostenlose Lizenz macht sie für Projekte jeder Größe zugänglich, einschließlich Open-Source-Produkte, die Apache-kompatible Abhängigkeiten benötigen.
Die Architektur von ZXing.Net spiegelt seine Ursprünge als Java-Portierung wider. Die BarcodeReader-Klasse ist ein zustandsbehaftetes Objekt: Der Aufruf von Decode schreibt den internen Zustand, was die Instanzen unsicher macht, um sie über Threads hinweg zu teilen. Die korrekte gleichzeitige Nutzung erfordert entweder einen neuen Leser pro Thread oder einen ThreadLocal<BarcodeReader>-Pool — beide legen die Verantwortung für die Threadsicherheit beim Aufrufer. Das Laden von Bildern ist ebenfalls nicht im Kernpaket enthalten; Stattdessen bietet ZXing .NET plattformspezifische Binding-Pakete an, die jeweils eine andere API-Oberfläche bereitstellen.
Zu den wichtigsten architektonischen Merkmalen gehören:
- Apache 2.0 Lizenz: Kostenlos für kommerzielle und Open-Source-Nutzung, ohne Kosten und ohne Vertriebsverpflichtung.
- Zustandsbehafteter BarcodeReader: Die
BarcodeReader-Instanz ist nicht threadsicher; Für jeden Thread bzw. jede parallele Operation muss eine neue Instanz erstellt werden. - Manuelle Formatspezifikation: Aufrufer müssen
reader.Options.PossibleFormatsvor jedem Dekodieren setzen; Nicht aufgeführte Formate werden stillschweigend ohne Fehlermeldung oder Warnung übersprungen. - Keine native PDF-Unterstützung: Die Bibliothek liest nur Bilder; Für die PDF-Eingabe wird eine separate PDF-Rendering-Bibliothek wie beispielsweise PdfiumViewer benötigt, um die Seiten vor der Dekodierung in Bitmaps umzuwandeln.
- Plattformbindungsfragmentierung: Das Kernpaket bietet keine Bildladefunktion; Separate Bindungspakete (
ZXing.Net.Bindings.Windows.CompatibilitymitSystem.Drawing,ZXing.Net.Bindings.ImageSharp/.V2/.V3mit SixLabors.ImageSharp, plusZXing.Net.Bindings.SkiaSharpundZXing.Net.Bindings.Magick) bieten unterschiedliche APIs für verschiedene Bereitstellungsziele. - Aktive Community: Probleme, Pull-Anfragen und Diskussionen finden aktiv auf GitHub statt und bieten kostenlosen Support auf Community-Ebene.
- Breites Formatspektrum: Unterstützt QR-Code, Code 128, Code 39, EAN-13, EAN-8, UPC-A, Data Matrix, PDF 417, Aztec und andere weit verbreitete Symbologien.
Die Stateful Reader Architektur
ZXing.Net's BarcodeReader erfordert eine neue Instanz für jeden Thread oder parallele Operation. Das folgende Muster zeigt die minimale korrekte Konfiguration für die gleichzeitige Verarbeitung:
// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
};
using var bitmap = new Bitmap(path);
var result = reader.Decode(bitmap);
if (result != null)
results[path] = result.Text;
});
// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
};
using var bitmap = new Bitmap(path);
var result = reader.Decode(bitmap);
if (result != null)
results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing
Parallel.ForEach(imagePaths, Sub(path)
Dim reader = New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
}
Using bitmap As New Bitmap(path)
Dim result = reader.Decode(bitmap)
If result IsNot Nothing Then
results(path) = result.Text
End If
End Using
End Sub)
Das ThreadLocal<BarcodeReader>-Muster verringert die Allokation pro Aufruf, indem eine Instanz pro Thread wiederverwendet wird, fügt jedoch Komplexität bei der Freigabe hinzu. So oder so, Thread-Sicherheit ist die Verantwortung des Anrufers in ZXing.Net.
IronBarcode verstehen
IronBarcode ist eine kommerzielle .NET Barcode-Bibliothek, die von Iron Software entwickelt wurde. Es bietet Barcode-Lesen und -Erzeugung über eine zustandslose statische API: BarcodeReader.Read und BarcodeWriter.CreateBarcode sind die Haupteinstiegspunkte und erfordern keine Instanzerstellung oder Konfiguration vor der Nutzung. Die Bibliothek wird als einzelnes NuGet Paket ausgeliefert, das auf Windows, Linux, macOSund in Docker-Containern identisch läuft, ohne dass plattformspezifische Bindungspakete erforderlich sind.
Die Leseengine von IronBarcode führt eine automatische Formaterkennung für mehr als 50 Barcode-Symbologien durch. Die Anrufer geben nicht an, nach welchen Formaten gesucht werden soll; Die Engine wertet jedes Bild anhand aller unterstützten Formate aus und gibt alle gefundenen Barcodes zurück. Für Anwendungen, die Geschwindigkeit des Scannens gegen Gründlichkeit ausbalancieren müssen, bietet ein ReadingSpeed-Enum (Faster, Balanced, Detailed, ExtremeDetail) Kontrolle ohne Format-Aufzählung erfordern. Die Bibliothek beinhaltet außerdem native PDF-Unterstützung und liest Barcodes direkt aus PDF-Dokumenten auf allen Seiten, ohne dass eine separate PDF-Rendering-Bibliothek erforderlich ist.
Zu den wichtigsten Merkmalen gehören:
- Kommerzielle Lizenz: Erfordert einen kostenpflichtigen Lizenzschlüssel; Ein Testmodus steht zur Verfügung.
- Zustandslose statische API:
BarcodeReader.ReadundBarcodeWriter.CreateBarcodesind threadsichere statische Methoden; Es ist keine Instanzverwaltung erforderlich. - Automatische Formaterkennung: Alle über 50 unterstützten Barcode-Formate werden ohne Formatliste erkannt; der Benutzer kann die Geschwindigkeit anstatt des Formatumfangs anpassen.
- Nativer PDF-Support:
BarcodeReader.Readakzeptiert direkt PDF-Dateipfade und verarbeitet alle Seiten ohne externe PDF-Bibliothek. - Einzelnes plattformübergreifendes Paket: Ein NuGet Paket, das unter Windows, Linux, macOSund Docker mit derselben API-Oberfläche läuft.
- Fluent Erzeugungs-API:
BarcodeWriter.CreateBarcodegibt einGeneratedBarcode-Objekt mit eingebauten Ausgabe-Methoden zurück, einschließlichSaveAsPng,SaveAsPdf,ToPngBinaryDataundToStream. - Kommerzieller Support: Bezahlte Lizenzen beinhalten den Zugang zum Support-Team von Iron Software mit Service-Level-Vereinbarungen.
Funktionsvergleich
Die folgende Tabelle verdeutlicht die grundlegenden Unterschiede zwischen ZXing .NET und IronBarcode:
| Feature | ZXing.Net | IronBarcode |
|---|---|---|
| Lizenz | Apache 2.0(kostenlos) | Kommerziell |
| Thread-Sicherheit | Nicht threadsicher – für jeden Thread ist eine neue Instanz erforderlich. | Threadsichere statische API |
| Formaterkennung | Manuell — PossibleFormats-Liste erforderlich |
Automatisch – über 50 Formate |
| PDF-Lesen | Nein – benötigt PdfiumViewer oder ein ähnliches Programm. | Native — einzelner Methodenaufruf |
| Windows, Linux, macOS, Docker, Azure, AWS. | Separate Bindungspakete pro Plattform | Einzelpaket, alle Plattformen |
| Barcode-Generierung | Gibt Bitmap zurück, erfordert manuelles Speichern |
Fluent API mit integrierter Ausgabe |
| Preisgestaltung | Kostenlos | Ab $749 (Lite) / $1.499 (Plus) |
Detaillierter Funktionsvergleich
| Feature | ZXing.Net | IronBarcode |
|---|---|---|
| Lektüre | ||
| Thread-sicheres Lesen | Nein – Instanzen pro Thread erforderlich | Ja – statische, zustandslose API |
| Automatische Formaterkennung | Nein — PossibleFormats erforderlich |
Ja – alle Formate wurden automatisch erkannt. |
| Mehrere Barcodes pro Bild | Ja — DecodeMultiple |
Ja – Standardverhalten |
| PDF-Barcode-Lesen | Nein – externe Bibliothek erforderlich | Ja – einheimische |
| Wiederherstellung beschädigter Barcodes | TryHarder-Flagge |
ML-gestützte Bildkorrektur |
| Geschwindigkeits-/Genauigkeitsabstimmung | Formatlistenreduzierung | ReadingSpeed-Enum |
| Generation | ||
| Code 128 / Code 39 | Ja | Ja |
| QR-Code | Ja | Ja |
| QR-Code mit Logo | Nein | Ja |
| Farbanpassung des QR-Codes | Nein | Ja |
| Ausgabe in PNG/JPEG/PDF | Manuell über System.Drawing |
Eingebaute Ausgabemethoden |
| Fluent-Generationenkette | Nein | Ja |
| Plattform und Bereitstellung | ||
| Windows (System.Zeichnen) | Ja — ZXing.Net.Bindings.Windows.Compatibility |
Ja |
| Linux / Docker | Ja —ZXing.Net.Bindings.ImageSharp / .V2 / .V3(verschiedene API) |
Ja – dieselbe API. |
| macOS | Ja — ZXing.Net.Bindings.ImageSharp / .V2 / .V3 |
Ja |
| Docker zusätzliche Abhängigkeiten | Kann libgdiplus erfordern |
None |
| Einzelnes NuGet-Paket | Nein – Kern + Bindung + optionales ImageSharp | Ja |
| Lizenzierung und Support | ||
| Lizenztyp | Apache 2.0 | Kommerziell |
| Kosten | Kostenlos | Von $749 |
| Unterstützung durch die Gemeinschaft | GitHub Probleme, aktive Community | Ja |
| Unterstützung für kommerzielle SLAs | Nein | Ja |
| Open-Source-freundlich | Ja | Nein |
Thread-Sicherheit und gleichzeitige Verarbeitung
Die Thread-Sicherheit ist der wichtigste operative Unterschied zwischen den beiden Bibliotheken und betrifft mehr Projekte, als die Warnungen in der Dokumentation vermuten lassen.
ZXing .NET -Ansatz
ZXing.Net's BarcodeReader ist ein zustandsbehaftetes Objekt. Wenn Decode aufgerufen wird, wird der interne Zustand geschrieben. Wenn zwei Threads dieselbe Instanz verwenden, kommt es zu einem Wettlauf um die Schreibvorgänge. Die Ergebnisse sind nicht deterministisch: Sie können ein Ergebnis von einem anderen Bild erhalten, ein Nullwert, wo ein Barcode vorhanden ist, oder eine Ausnahme. Der korrekte Ansatz besteht darin, pro Thread einen Reader zu erstellen – das heißt, jeder parallele oder asynchrone Pfad allokiert einen Reader, konfiguriert ihn, verwendet ihn einmal und verwirft ihn anschließend:
// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
};
using var bitmap = new Bitmap(path);
var result = reader.Decode(bitmap);
if (result != null)
results[path] = result.Text;
});
// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
};
using var bitmap = new Bitmap(path);
var result = reader.Decode(bitmap);
if (result != null)
results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing
Parallel.ForEach(imagePaths, Sub(path)
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
}
Using bitmap As New Bitmap(path)
Dim result = reader.Decode(bitmap)
If result IsNot Nothing Then
results(path) = result.Text
End If
End Using
End Sub)
Das ThreadLocal<BarcodeReader>-Muster verringert die Allokation pro Aufruf, indem ein Leser pro Thread wiederverwendet wird, fügt jedoch Komplexität bei der Freigabe hinzu und erfordert weiterhin die Formatkonfiguration bei jeder Instanz.
IronBarcode Ansatz
IronBarcode's BarcodeReader.Read ist eine zustandslose statische Methode. Es gibt keine Instanz zum Teilen, keine Instanz zum Isolieren und keinen Konfigurationsstatus zum Schützen. Derselbe Aufruf kann von beliebig vielen gleichzeitig laufenden Threads sicher ausgeführt werden:
// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
Parallel.ForEach(imagePaths, path =>
{
var result = BarcodeReader.Read(path, options).FirstOrDefault();
if (result != null)
results[path] = result.Value;
});
// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
Parallel.ForEach(imagePaths, path =>
{
var result = BarcodeReader.Read(path, options).FirstOrDefault();
if (result != null)
results[path] = result.Value;
});
Imports IronBarcode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Parallel.ForEach(imagePaths, Sub(path)
Dim result = BarcodeReader.Read(path, options).FirstOrDefault()
If result IsNot Nothing Then
results(path) = result.Value
End If
End Sub)
Die Dokumentation von IronBarcode zum asynchronen und multithreadfähigen Barcode-Lesen erläutert das interne Thread-Pooling-Modell. Die MaxParallelThreads-Eigenschaft steuert den Grad der Parallelisierung ohne externe Koordination.
Formaterkennung
Die Formaterkennungsrichtlinie ist der zweite wesentliche operative Unterschied zwischen den beiden Bibliotheken.
ZXing .NET -Ansatz
ZXing.Net erfordert, dass reader.Options.PossibleFormats vor jedem Dekodieren befüllt wird. Wenn ein Barcode-Format nicht aufgeführt ist, wird es nicht erkannt – ohne Fehlermeldung, Warnung oder Teilergebnis:
// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.UPC_A,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;
using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.UPC_A,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;
using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
Imports ZXing
Imports ZXing.Common
' ZXing.Net: PossibleFormats list controls which symbologies are decoded
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.UPC_A,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.PDF_417
}
reader.Options.TryHarder = True
Using bitmap As New Bitmap(imagePath)
Dim results = reader.DecodeMultiple(bitmap)
End Using
Wenn jedes Format aufgelistet wird, um Fehler zu vermeiden, verschlechtert sich die Leistung. Werden nur die erwarteten Formate aufgeführt, besteht die Gefahr, dass Bilder aus externen Quellen unbemerkt fehlen. Für ZXing .NET gibt es keinen Mechanismus, um zu melden, dass ein Barcode in einem nicht aufgeführten Format gefunden wurde.
IronBarcode Ansatz
IronBarcode erkennt alle über 50 unterstützten Formate automatisch. Es ist keine Formatliste erforderlich oder akzeptiert:
// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
Imports IronBarcode
' IronBarcode: automatic detection across all supported formats
Dim results = BarcodeReader.Read(imagePath)
For Each barcode In results
Console.WriteLine($"{barcode.Value} ({barcode.Format})")
Next
Für Anwendungen, die die Lesegeschwindigkeit gegen die Erkennungsgründlichkeit anpassen, bietet IronBarcode ein ReadingSpeed-Enum — Faster, Balanced, Detailed, ExtremeDetail — ohne Format-Aufzählung. Die Geschwindigkeitsabstimmung beeinflusst, wie aggressiv die Engine jedes Bild verarbeitet, nicht, welche Formate sie berücksichtigt.
PDF-Dokumentunterstützung
Das Lesen von PDFs stellt in ZXing .NET eine strikte Grenze dar: Die Bibliothek bietet keinerlei PDF-Unterstützung.
ZXing .NET -Ansatz
Wenn ein Barcode in eine PDF-Datei eingebettet ist, benötigt ZXing .NET eine externe PDF-Rendering-Bibliothek. Die gebräuchlichste Umgehungslösung verwendet PdfiumViewer, was etwa 20 MB an nativen Binärdateien und eine Seitenrendering-Schleife hinzufügt, die Aufrufer implementieren und warten müssen:
// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.PDF_417
};
for (int i = 0; i < pdfDocument.PageCount; i++)
{
string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
try
{
using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
pageImage.Save(tempPath, ImageFormat.Png);
using var bitmap = new Bitmap(tempPath);
var decoded = reader.DecodeMultiple(bitmap);
if (decoded != null)
results.AddRange(decoded.Select(d => d.Text));
}
finally
{
File.Delete(tempPath);
}
}
// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.PDF_417
};
for (int i = 0; i < pdfDocument.PageCount; i++)
{
string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
try
{
using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
pageImage.Save(tempPath, ImageFormat.Png);
using var bitmap = new Bitmap(tempPath);
var decoded = reader.DecodeMultiple(bitmap);
if (decoded != null)
results.AddRange(decoded.Select(d => d.Text));
}
finally
{
File.Delete(tempPath);
}
}
Imports System.IO
Imports System.Drawing
Imports PdfiumViewer
Imports ZXing
Imports ZXing.Common
' ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
Using pdfDocument As PdfDocument = PdfDocument.Load(pdfPath)
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.PDF_417
}
For i As Integer = 0 To pdfDocument.PageCount - 1
Dim tempPath As String = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png")
Try
Using pageImage As Image = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi)
pageImage.Save(tempPath, Imaging.ImageFormat.Png)
Using bitmap As New Bitmap(tempPath)
Dim decoded = reader.DecodeMultiple(bitmap)
If decoded IsNot Nothing Then
results.AddRange(decoded.Select(Function(d) d.Text))
End If
End Using
End Using
Finally
File.Delete(tempPath)
End Try
Next
End Using
Dieses Muster birgt echte Fehlerquellen: Fehlkonfigurationen der DPI-Ebene führen zu unbemerkten Fehlern, temporäre Dateiberechtigungen versagen in abgesicherten Umgebungen, die nativen Bibliotheken von PdfiumViewer erfordern ein separates Bereitstellungsmanagement, und die Einrichtung funktioniert unter Linux ohne zusätzliche Konfiguration nicht.
IronBarcode Ansatz
IronBarcode liest Barcodes nativ aus PDFs – alle Seiten, alle Formate, keine externen Abhängigkeiten. Der gleiche BarcodeReader.Read-Aufruf akzeptiert direkt PDF-Pfade:
// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
Imports IronBarcode
' IronBarcode: one call processes every page of the PDF
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}")
Next
Keine Seitenaufzählung, keine DPI-Konfiguration, keine temporären Dateien und keine separate Bibliothek, die zusammen mit der Anwendung bereitgestellt werden muss.
Plattformbindungen und Bereitstellung
Die Bildverarbeitung von ZXing.Net ist auf plattformspezifische Bindungspakete verteilt, von denen jedes über eine eigene API-Oberfläche verfügt.
ZXing .NET -Ansatz
Das Kernpaket ZXing.Net bietet Dekodierungslogik, aber kein Bildladen. Aufrufer müssen eine Bindung basierend auf ihrem Bereitstellungsziel auswählen:
| Umfeld | Paket | Notizen |
|---|---|---|
| Windows-Desktop / WPF | ZXing.Net.Bindings.Windows.Compatibility |
Verwendet System.Drawing — Windows-freundlich; benötigt libgdiplus auf Linux |
| Linux / Docker/plattformübergreifend | ZXing.Net.Bindings.ImageSharp / .V2 / .V3 |
Unterschiedliche API-Oberfläche; fügt SixLabors.ImageSharp-Abhängigkeit hinzu (V2/V3 verfolgt wichtige ImageSharp-Versionen) |
| macOS | ZXing.Net.Bindings.ImageSharp / .V2 / .V3 |
Gleicher Pfad wie unter Linux |
Die praktische Konsequenz ist, dass Windows-Code, der System.Drawing.Bitmap verwendet, auf Linux nicht kompiliert oder ausgeführt wird. Die Containerisierung erfordert den Wechsel der Bindungspakete und das Umschreiben des Codes zum Laden von Bildern:
// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;
var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;
var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
Imports ZXing.Windows.Compatibility
Imports System.Drawing
Dim reader As New BarcodeReader()
Using bitmap As New Bitmap(imagePath)
Dim result = reader.Decode(bitmap)
End Using
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
Imports ZXing.ImageSharp
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Dim reader As New BarcodeReader(Of Rgba32)()
Using image As Image(Of Rgba32) = Image.Load(Of Rgba32)(imagePath)
Dim result = reader.Decode(image)
End Using
Die Verwendung der Windows-Bindung auf einem Linux-Host erfordert auch libgdiplus im Docker-Image und fügt dem Container etwa 50 MB hinzu.
IronBarcode Ansatz
IronBarcode liefert ein Paket für alle Plattformen. Der gleiche BarcodeReader.Read(path)-Aufruf wird identisch auf Windows, Linux, macOSund in Docker-Containern kompiliert und ausgeführt. Es werden keine Bindungspakete, keine Plattformbedingungen und keine zusätzlichen Systemabhängigkeiten benötigt. Für Teams, die .NET Anwendungen containerisieren, beschreibt der IronBarcode Docker- und Linux-Setup-Leitfaden das Single-Package-Deployment-Muster detailliert.
API-Generierung
Beide Bibliotheken generieren Barcodes, aber die APIs spiegeln unterschiedliche Designansätze wider.
ZXing .NET -Ansatz
ZXing.Net's BarcodeWriter-Klasse erstellt ein Schreibobjekt, akzeptiert Kodierungsoptionen, ruft Write auf und gibt ein Bitmap zurück, das vom Aufrufer manuell mithilfe von System.Drawing.Imaging gespeichert werden muss:
// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;
var writer = new BarcodeWriter
{
Format = BarcodeFormat.CODE_128,
Options = new EncodingOptions
{
Width = 300,
Height = 100,
Margin = 10
}
};
using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;
var writer = new BarcodeWriter
{
Format = BarcodeFormat.CODE_128,
Options = new EncodingOptions
{
Width = 300,
Height = 100,
Margin = 10
}
};
using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
Imports ZXing
Imports ZXing.Common
Imports ZXing.Windows.Compatibility
Imports System.Drawing.Imaging
Dim writer As New BarcodeWriter With {
.Format = BarcodeFormat.CODE_128,
.Options = New EncodingOptions With {
.Width = 300,
.Height = 100,
.Margin = 10
}
}
Using bitmap = writer.Write("PRODUCT-001")
bitmap.Save("output.png", ImageFormat.Png)
End Using
Das Speichern in anderen Formaten als PNG oder JPEG, das Speichern in einer PDF-Datei oder das Erzeugen von binärem Ausgabe für eine HTTP-Antwort erfordert zusätzliche System.Drawing-Plumbing, das der Aufrufer implementiert.
IronBarcode Ansatz
IronBarcode's BarcodeWriter.CreateBarcode gibt ein GeneratedBarcode-Objekt zurück, das eingebaute Ausgabemethoden über eine fluente Kette bereitstellt:
// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("output.png");
// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("output.png");
Imports IronBarCode
' IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.SaveAsPng("output.png")
Das GeneratedBarcode-Objekt bietet auch .ToPngBinaryData(), .ToJpegBinaryData(), .ToStream() und .SaveAsPdf() — Ausgabeziele, die ZXing.Net erfordert, dass Aufrufer selbst mit System.Drawing implementieren.
API-Mapping-Referenz
| ZXing.Net | IronBarcode | Notizen |
|---|---|---|
new BarcodeReader() |
Statisch – keine Instanz | BarcodeReader.Read(...) ist ein statischer Aufruf |
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... } |
Nicht erforderlich | Die automatische Erkennung deckt alle Formate ab. |
reader.Options.TryHarder = true |
Speed = ReadingSpeed.Balanced |
Genauigkeitsanpassung über BarcodeReaderOptions |
reader.Decode(bitmap) |
BarcodeReader.Read(imagePath) |
Pfad direkt übergeben — kein Bitmap erforderlich |
reader.DecodeMultiple(bitmap) |
BarcodeReader.Read(imagePath) |
Gibt immer eine Sammlung zurück |
result.Text |
result.Value |
Immobilie umbenannt |
result.BarcodeFormat |
result.Format |
Immobilie umbenannt |
BarcodeFormat.QR_CODE |
BarcodeEncoding.QRCode |
Änderung der Namenskonvention für Enumerationen |
BarcodeFormat.CODE_128 |
BarcodeEncoding.Code128 |
Änderung der Namenskonvention für Enumerationen |
BarcodeFormat.EAN_13 |
BarcodeEncoding.EAN13 |
Änderung der Namenskonvention für Enumerationen |
new BarcodeWriter { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { ... } } |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
Statische Fabrikmethode |
writer.Write(data) gibt Bitmap zurück |
.SaveAsPng(path) / .ToPngBinaryData() |
Eingebaute Ausgabemethoden auf GeneratedBarcode |
| Keine PDF-Unterstützung – PDFViewer erforderlich | BarcodeReader.Read("doc.pdf") |
Native PDF-Unterstützung |
| Nicht gewindesicher | Threadsichere statische API | Keine Instanzverwaltung erforderlich |
Wenn Teams einen Wechsel von ZXing .NET zu IronBarcode erwägen
Mehrere Szenarien veranlassen Entwicklungsteams dazu, IronBarcode als Alternative zu ZXing .NET zu evaluieren.
Gleichzeitige und hocheffiziente Verarbeitung
Eine ZXing .NET Integration, die in einer Single-Thread-Konsolenanwendung korrekt funktioniert, kann nicht-deterministisches Verhalten zeigen, wenn derselbe Code in einen ASP.NET Core Controller verschoben wird, der gleichzeitige Anfragen verarbeitet, oder in einen Hintergrundjob, der Batches parallel verarbeitet. Das von ZXing .NET geforderte Instanzmuster pro Thread bedeutet, dass jede Anfrage oder parallele Aufgabe ein vollständiges Reader-Objekt mit dem zugehörigen konfigurierten Decodersatz zuweist, es einmal verwendet und anschließend verwirft. Mit zunehmendem Anfragevolumen wird dieser Zuteilungsdruck messbar. Teams, die diesen Punkt erreichen – insbesondere solche, die Scan-Pipelines mit hohem Durchsatz in den Bereichen Logistik, Lagerhaltung oder Dokumentenverarbeitung betreiben – suchen oft nach einer Bibliothek, deren Threading-Modell diesen Overhead nicht jedem Aufrufer auferlegt.
Scannen von Dokumenten in gemischten Formaten
Anwendungen, die Dokumente von Dritten akzeptieren, stoßen häufig auf Barcode-Formate, die bei der Konfiguration der Formatliste nicht berücksichtigt wurden. Eine für Code 128 entwickelte Versandintegration empfängt Sendungen von Partnern mittels QR-Codes. Ein medizinisches Dokumentationssystem, das für PDF 417-Begegnungen und Data Matrix-Symbologien eines neuen Geräteherstellers konfiguriert ist. In ZXing .NET führt jeder dieser Fälle zu einem stillen Nullwert anstelle eines Dekodierungsfehlers, was bedeutet, dass der Fehler möglicherweise erst bei einem Fehler in der nachfolgenden Verarbeitung sichtbar wird. Teams, die durch unbemerkte Formatfehler schlechte Erfahrungen gemacht haben – insbesondere in Kontexten, in denen ein übersehener Barcode geschäftliche Konsequenzen hat – beginnen, die Kosten der Formatlistenpflege gegen eine Bibliothek abzuwägen, die Formate automatisch erkennt.
PDF-Barcode-Extraktion
Viele Geschäftsdokumente kommen im PDF-Format an: Rechnungen, Versandmanifeste, Patientenakten, Konformitätsbescheinigungen. ZXing .NET kann diese nicht direkt lesen. Teams, die Barcodes aus PDFs extrahieren müssen, müssen letztendlich eine Rendering-Pipeline auf Basis von ZXing .NET aufbauen und pflegen – sie wählen eine PDF-Bibliothek aus, verwalten deren native Abhängigkeiten, implementieren eine Seitenrender-Schleife, handhaben die DPI-Konfiguration und schreiben eine Bereinigungslogik für temporäre Dateien. Dieser Infrastrukturcode ist keine Barcode-Logik; Es dient einzig und allein dazu, die Lücke zwischen dem, was ZXing .NET akzeptiert (Bitmaps), und dem, was Geschäftsdokumente tatsächlich sind (PDFs), zu schließen. Teams, die diese Brücke pflegen müssen – insbesondere wenn die PDF-Bibliothek selbst Lizenzierungs-, Bereitstellungs- und Plattformüberlegungen mit sich bringt – bevorzugen oft eine einzige Bibliothek, die die gesamte Eingabeoberfläche abdeckt.
Reduzierung der Bindungskomplexität
Projekte, die unter Windows gestartet und später auf Linux oder Docker bereitgestellt werden, stoßen direkt auf die Bindungsfragmentierung von ZXing.Net: Das Windows-Bindungspaket verwendet eine andere API als die plattformübergreifende ImageSharp-Bindung, und der Wechsel zwischen ihnen erfordert die Änderung sowohl der NuGet -Referenzen als auch des Bildladecodes. Teams, die ihre .NET Anwendungen routinemäßig containerisieren oder die gleiche Codebasis auf Entwicklerrechnern (Windows oder macOS) und Produktionsservern (Linux) ausführen, stellen fest, dass die Pflege zweier Codepfade für das Laden von Bildern jede zukünftige Änderung in der Scanschicht erschwert.
Gemeinsame Überlegungen zur Migration
Teams, die von ZXing .NET auf IronBarcode umsteigen, sollten diese spezifischen technischen Änderungen einplanen.
Entfernung der BarcodeReader-Instanziierung
Jeder new BarcodeReader()-Aufruf im Codebasis wird während der Migration entfernt. Das Instanziierungsmuster – Erstellung des Readers, Formatkonfiguration, Laden des Bildes, Dekodierungsaufruf – reduziert sich auf einen einzigen statischen Methodenaufruf. Dateien, die ZXing, ZXing.Common, ZXing.Windows.Compatibility, ZXing.ImageSharp und SixLabors.ImageSharp-Namespaces importieren, haben diese Importe entfernt und durch einen einzigen using IronBarCode; ersetzt.
Entfernung der Konfiguration "Mögliche Formate"
Der reader.Options.PossibleFormats-Zuweisungsblock wird bei jedem Aufrufort gelöscht. IronBarcode führt eine automatische Formaterkennung durch und akzeptiert keine Formatbeschränkungsliste. Das TryHarder-Flag wird durch die ReadingSpeed-Eigenschaft bei BarcodeReaderOptions ersetzt, die den Erkennungsaufwand steuert, ohne den Formatbereich einzuengen.
Bereinigung des Bindungspakets
Die Migration entfernt ZXing.Net, ZXing.Net.Bindings.Windows.Compatibility, alle ZXing.Net.Bindings.ImageSharp-Varianten (.V2 / .V3) und alle PdfiumViewer-Pakete, die hinzugefügt wurden, um das PDF-Lesen zu unterstützen. Wenn libgdiplus zu einem Dockerfile hinzugefügt wurde, um System.Drawing durch die Windows-Bindung auf Linux zu unterstützen, wird auch diese Zeile entfernt. IronBarcode benötigt im Docker-Image keine plattformspezifischen Abhängigkeiten.
Zusätzliche IronBarcode Funktionen
Über die in den obigen Vergleichsabschnitten beschriebenen Funktionen hinaus bietet IronBarcode Folgendes:
- QR-Code mit Logoeinbettung : Generieren Sie QR-Codes mit einem benutzerdefinierten Logobild in der Mitte, mit automatischer Fehlerkorrektur zur Gewährleistung der Scanbarkeit.
- Anpassung der QR-Code-Farben : Legen Sie Vorder- und Hintergrundfarben für generierte QR-Codes fest, um ein markenkonformes Erscheinungsbild zu gewährleisten.
- Barcode-Aufdruck auf PDFs : Barcodes direkt auf bestehende PDF-Seiten an festgelegten Koordinaten schreiben, ohne eine separate PDF-Bibliothek zu benötigen.
- GS1-Barcode-Unterstützung : Lesen und Generieren von GS1-formatierten Barcodes, einschließlich GS1-128 und GS1 DataBar, die in Lieferketten im Einzelhandel und im Gesundheitswesen verwendet werden.
- Multithread-Async-Lesen: Eingebaute asynchrone Methoden zur Integration von Barcode-Lesen in
await-Pipelines ohne Blockieren. - ML-gestützte Bildkorrektur: Automatische Bildverbesserung für beschädigte, verschwommene oder kontrastarme Barcodes, die
TryHardernicht wiederherstellen kann.
.NET-Kompatibilität und Zukunftsfähigkeit
IronBarcode zielt auf .NET Standard 2.0 und höher ab und bietet Kompatibilität mit .NET Framework 4.6.2+, .NET Core 3.1, .NET 5, .NET 6, .NET 7, .NET 8 und .NET 9. Die Bibliothek erhält regelmäßige Updates, die mit Microsofts .NET-Veröffentlichungszyklus übereinstimmen, um sicherzustellen, dass die Kompatibilität mit .NET 10 bei oder nahe der Veröffentlichung verfügbar sein wird. ZXing .NET gewährleistet zudem durch seine NuGet -Paketziele eine breite .NET Kompatibilität, und beide Bibliotheken eignen sich aus dieser Perspektive für moderne .NET Projekte.
Abschluss
ZXing .NET und IronBarcode repräsentieren unterschiedliche Philosophien im Design von Barcode-Bibliotheken. ZXing .NET ist eine zustandsbehaftete, instanzbasierte Bibliothek, die die Thread-Verantwortung, die Formatspezifikation und die PDF-Überbrückung vollständig an den Aufrufer delegiert. IronBarcode ist eine zustandslose Bibliothek mit statischer API, die Threading intern implementiert, Formate automatisch erkennt und PDF-Eingaben nativ verarbeitet. Die praktische Konsequenz dieses Unterschieds ist, dass ZXing .NET Code in Kontexten der Parallelverarbeitung oder Dokumentenverarbeitung dazu neigt, Infrastruktur anzusammeln – pro Thread Instanzmuster, Formatlisten, PDF-Rendering-Pipelines und plattformspezifische Bindungszweige –, während IronBarcode -Code für die gleichen Szenarien keine dieser umgebenden Strukturen benötigt.
ZXing .NET ist eine wirklich gute Wahl für Projekte, die keine Kosten erfordern. Dank der Apache 2.0-Lizenz ist es sowohl mit Open-Source-Projekten als auch mit kommerziellen Produkten kompatibel, die freie Abhängigkeiten bevorzugen. In kontrollierten Umgebungen – bekannten Barcode-Formaten, sauberen Bildern, Single-Thread- oder leicht paralleler Verarbeitung – arbeitet es zuverlässig. Die aktive GitHub Community reagiert zeitnah auf Probleme, und die Bandbreite der abgedeckten Formate ist mit kommerziellen Alternativen vergleichbar. Bei Anwendungen, bei denen diese Bedingungen erfüllt sind, ist der Kostenvorteil von ZXing.Net real und seine technischen Einschränkungen sind beherrschbar.
IronBarcode befasst sich mit Szenarien, in denen die Designbeschränkungen von ZXing.Net zu Betriebskosten führen: gleichzeitige Web-APIs, bei denen die Instanzzuweisung pro Anfrage messbar ist, Dokumentenpipelines, bei denen PDF-Eingabe die Norm und nicht die Ausnahme ist, Scannen in gemischten Formaten, bei dem stillschweigende Fehler ein Geschäftsrisiko darstellen, und plattformübergreifende Bereitstellungen, bei denen zwei Bindungspakete zwei Codepfade bedeuten. Für diese Kontexte erwirbt die kommerzielle Lizenz der Bibliothek ein Threading-Modell, das keine Instanzverwaltung erfordert, eine Formaterkennung, die keine Wartung benötigt, und eine PDF-Unterstützung, die keine zweite Bibliothek erfordert.
Die Entscheidung hängt von den Anforderungen des Projekts ab. Ein Prototyp in einem einzigen Format, ein Open-Source-Scanner oder ein Tool für geringe Stückzahlen, bei dem die Kosten den größten Einfluss haben – in solchen Fällen ist ZXing .NET die richtige Wahl. Eine produktive Web-API, die Dokumente aus externen Quellen über mehrere Threads verarbeitet – hier decken sich die Designannahmen von IronBarcode mit der betrieblichen Realität. Für einen umfassenderen Überblick darüber, wie sich die Bibliotheken hinsichtlich Erkennungsraten und realen Scan-Szenarien vergleichen lassen, bietet der Vergleich der Barcode-Scanner ZXing .NET und IronBarcode zusätzliche Analysen.
Häufig gestellte Fragen
Was ist ZXing.Net?
ZXing.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 for .NET-Projekte in Betracht ziehen.
Was sind die Hauptunterschiede zwischen ZXing.Net und IronBarcode?
IronBarcode verwendet eine statische, zustandslose API, die keine Instanzverwaltung erfordert, während ZXing.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 ZXing.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 ZXing.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 ZXing.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 ZXing.Net?
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 ZXing.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 die Migration von ZXing.Net zu IronBarcode einfach?
Bei der Migration von ZXing.Net zu IronBarcode geht es in erster Linie darum, instanzbasierte API-Aufrufe durch die statischen Methoden von IronBarcode zu ersetzen, Lizenzierungsformulierungen 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.

