Wie man QR-Codes anpassbar macht und Logos hinzufügt in C#
Migrating from Accusoft BarcodeXpressto IronBarcode
Der größte Teil der Arbeit bei dieser Migration besteht aus dem Löschen von Dateien. Das Zwei-Schlüssel-Lizenzsystem — SetSolutionName, SetSolutionKey und SetOEMLicenseKey für Runtime — verschwindet vollständig. Die tatsächlichen Barcode-Operationen (ein Bild lesen, einen Barcode in eine Datei schreiben) werden in kürzere IronBarcode-Äquivalente übersetzt. Wenn Ihr Codebase eine BarcodeService-Klasse hat, die BarcodeXpress einbindet, ist der Lizenzcode oft ein großer Anteil davon. Nach der Migration schrumpft diese Klasse.
Warum von Accusoft BarcodeXpressmigrieren?
Teams, die von BarcodeXpress migrieren, berichten von folgenden Auslösern:
Bewertungsmodus blockiert genaues Benchmarking: Ohne gültigen OEM-/Laufzeit-Schlüssel versieht BarcodeXpress dekodierte Ergebnisse mit dem literal String " UNLICENSED accusoft.com " und wendet denselben Stempel auf generierte 2D-Barcodes an. Vor dem Kauf produziertes Genauigkeitstest auf echten Dokumenten ergibt dieses mit Wasserzeichen versehene Ergebnis, sodass Sie nicht überprüfen können, ob die Bibliothek Ihre tatsächlichen Scan-Typen korrekt liest, bevor Sie sich zum Kauf verpflichten.
Zwei-Schlüssel-Lizenzierung erhöht den Betriebsaufwand: BarcodeXpress trennt die SDK-Lizenz (SetSolutionName + SetSolutionKey) von der OEM/Runtime-Lizenz (SetOEMLicenseKey). CI/CD-Pipelines, Docker-Container und Container-Orchestrierungsplattformen benötigen jeweils zwei Schlüsselsysteme, die als separate Geheimnisse verwaltet werden. Ein fehlender oder ungültiger Laufzeitschlüssel fällt auf das mit Wasserzeichen versehene Ergebnis zurück, anstatt einen Fehler anzuzeigen, wodurch ein Fehlerzustand entsteht, der automatisierte Tests bestehen kann, wenn die Überprüfungen nur auf nicht-nulle Ergebnisse prüfen.
Mindestens fünf Laufzeitlizenzen für jede Produktionsumgebung: Selbst für eine Einzelserver-Bereitstellung müssen mindestens fünf Laufzeitlizenzen erworben werden. Teams, die einen Produktionsserver und einen Staging-Server betreiben, zahlen mindestens zehn Laufzeitlizenzen, unabhängig von der tatsächlichen Nutzung.
40 Seiten pro Minute Standard Edition Höchstgeschwindigkeit: Die Standard Edition drosselt die Verarbeitung auf 40 Seiten pro Minute. Bei diesem Tempo dauert die Bearbeitung eines Stapels von 100.000 Dokumenten etwa 41 Stunden. Um die Beschränkung aufzuheben, ist ein Upgrade auf die Professional Edition erforderlich, die zusätzlich zu den bereits erworbenen Laufzeitlizenzen höhere Kosten pro Entwicklerplatz verursacht.
Keine native PDF-Unterstützung: PDF-Dateien müssen mithilfe einer separaten Bibliothek in Bilder umgewandelt werden, bevor BarcodeXpress sie lesen kann. Diese externe Abhängigkeit verursacht zusätzliche Lizenzkosten, einen weiteren Konvertierungsschritt und einen erhöhten Speicherbedarf durch das Speichern der gerenderten Seitenbilder.
Thread-Sicherheit erfordert Instanzisolierung: Das reader-Objekt von BarcodeXpress ist zustandsbehaftet und nicht sicher für parallelen Zugriff. Parallele Batch-Verarbeitung erfordert eine voll initialisierte BarcodeXpress-Instanz pro Thread, wobei die vollständige Zwei-Schicht-Lizenzinitialisierung in jedem Thread-Kontext wiederholt wird.
Das grundsätzliche Problem
BarcodeXpress erfordert eine mehrstufige Initialisierung, ein Bitmap-Laden und eine BarcodeType[]-Konfiguration, bevor ein Barcode gelesen werden kann:
using var bitmap = new Bitmap(imagePath);
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...");
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
var value = results.FirstOrDefault()?.BarcodeValue;
using var bitmap = new Bitmap(imagePath);
var barcodeXpress = new BarcodeXpress(".");
barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...");
barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = barcodeXpress.reader.Analyze(bitmap);
var value = results.FirstOrDefault()?.BarcodeValue;
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Using bitmap As New Bitmap(imagePath)
Dim barcodeXpress = New BarcodeXpress(".")
barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...")
barcodeXpress.Reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = barcodeXpress.Reader.Analyze(bitmap)
Dim value = results.FirstOrDefault()?.BarcodeValue
End Using
IronBarcode ersetzt diesen gesamten Block durch einen einzigen statischen Aufruf:
var value = BarcodeReader.Read(imagePath).First().Value;
var value = BarcodeReader.Read(imagePath).First().Value;
Dim value = BarcodeReader.Read(imagePath).First().Value
IronBarcode vs. Accusoft BarcodeXpress: Funktionsvergleich
| Feature | Accusoft BarcodeXpress | IronBarcode |
|---|---|---|
| Lizenzmodell | SDK-Schlüssel + OEM-/Laufzeit-Schlüssel (separate Einkäufe) | Ein einziger ewiger Schlüssel |
| Mindestlaufzeitlizenzen | 5 (auch für 1 Server) | Konzept ohne Laufzeitlizenz |
| Auswertungsmodus | Dekodierte Werte und generierte 2D-Barcodes mit " UNLICENSED accusoft.com " gestempelt | Vollständige Werte zurückgegeben; wasserzeichen nur auf der generierten Ausgabe |
| Durchsatzgrenze | 40 PPM (Standardausgabe) | Keine Begrenzung auf keiner Stufe |
| automatische Formaterkennung | Handbuch — muss ein BarcodeType[]-Array zu BarcodeTypes zuweisen |
Automatischer Ablauf über alle unterstützten Formate hinweg |
| PDF-Unterstützung | Externe Bibliothek erforderlich, um Seiten in Bitmaps zu rendern | Nativ — BarcodeReader.Read("doc.pdf") |
| API-Stil | Instanzbasiert; Bitmap-Eingabe; Eigenschafts-/Methodenkonfiguration | Statische Factory-Methoden, flüssige API |
| Thread-Sicherheit | Instanz pro Thread erforderlich | Zustandslose statische Methoden — threadsicher |
| Docker-Lizenzkonfiguration | Lizenzdatei einbinden oder Lizenzserver | Einzelne Umgebungsvariable |
| CI/CD-Geheimnisse erforderlich | SDK-Schlüsselpaar + OEM-/Laufzeit-Schlüssel | Ein Geheimnis |
| .NET Framework / .NET Core | Separate Pakete: Accusoft.BarcodeXpress.Net und Accusoft.BarcodeXpress.NetCore |
Single IronBarcode package (.NET Framework 4.6.2+, .NET Core 3.1+, .NET 5–8) |
| Linux/macOS | Ja (über .NetCore-Paket) | Ja – Windows x64/x86, Linux x64, macOS x64/ARM |
| QR-Code mit Logo | Manuelle GDI+-Überlagerung erforderlich | AddBrandLogo("logo.png") eingebaut |
| Einstiegspreis | $1,960+ SDK + mindestens 5 Laufzeitlizenzen | 749 $ (dauerhaft) (Lite, 1 Entwickler) |
| Dauerlizenz | Nicht Standard – bitte kontaktieren Sie den Vertrieb. | Ja, alle Stufen. |
Schnellstart: Migration von Accusoft BarcodeXpresszu IronBarcode
Schritt 1: Ersetzen des NuGet-Pakets
dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
Schritt 2: Namespaces aktualisieren
// Remove
using Accusoft.BarcodeXpressSdk;
// Add
using IronBarCode;
// Remove
using Accusoft.BarcodeXpressSdk;
// Add
using IronBarCode;
Imports IronBarCode
Schritt 3: Lizenz initialisieren
Fügen Sie die Lizenzinitialisierung einmal beim Anwendungsstart in Program.cs, Startup.cs oder Ihrer Dependency Injection-Konfiguration hinzu:
// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add once at application startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Im Produktionsbetrieb lesen Sie den Schlüssel aus einer Umgebungsvariablen oder Ihrem Geheimnismanager:
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"))
Kein SetSolutionKey, kein SetOEMLicenseKey, keine per-Server Runtime-Aktivierung. Das ist die vollständige Lizenzkonfiguration.
Beispiele für die Code-Migration
Lizenzinitialisierung
BarcodeXpress-Ansatz:
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
// Constructor takes the path containing the Barcode Xpress runtime files.
_barcodeXpress = new BarcodeXpress(".");
// SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// OEM/runtime license — separate purchase, minimum 5 licenses required.
// Without this call, decoded values and generated 2D barcodes are
// stamped with " UNLICENSED accusoft.com ".
_barcodeXpress.Licensing.SetOEMLicenseKey(
"2.0.OEMLicenseStringFromAccusoft...");
}
}
using Accusoft.BarcodeXpressSdk;
public class BarcodeService
{
private readonly BarcodeXpress _barcodeXpress;
public BarcodeService()
{
// Constructor takes the path containing the Barcode Xpress runtime files.
_barcodeXpress = new BarcodeXpress(".");
// SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp");
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4);
// OEM/runtime license — separate purchase, minimum 5 licenses required.
// Without this call, decoded values and generated 2D barcodes are
// stamped with " UNLICENSED accusoft.com ".
_barcodeXpress.Licensing.SetOEMLicenseKey(
"2.0.OEMLicenseStringFromAccusoft...");
}
}
Imports Accusoft.BarcodeXpressSdk
Public Class BarcodeService
Private ReadOnly _barcodeXpress As BarcodeXpress
Public Sub New()
' Constructor takes the path containing the Barcode Xpress runtime files.
_barcodeXpress = New BarcodeXpress(".")
' SDK license
_barcodeXpress.Licensing.SetSolutionName("AcmeCorp")
_barcodeXpress.Licensing.SetSolutionKey(1, 2, 3, 4)
' OEM/runtime license — separate purchase, minimum 5 licenses required.
' Without this call, decoded values and generated 2D barcodes are
' stamped with " UNLICENSED accusoft.com ".
_barcodeXpress.Licensing.SetOEMLicenseKey("2.0.OEMLicenseStringFromAccusoft...")
End Sub
End Class
IronBarcode -Ansatz:
using IronBarCode;
// In Program.cs
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// BarcodeService no longer needs a constructor or any license management
public class BarcodeService
{
// Ready to use — no initialization needed
}
using IronBarCode;
// In Program.cs
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
// BarcodeService no longer needs a constructor or any license management
public class BarcodeService
{
// Ready to use — no initialization needed
}
Imports IronBarCode
' In Program.vb
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
' BarcodeService no longer needs a constructor or any license management
Public Class BarcodeService
' Ready to use — no initialization needed
End Class
Der BarcodeXpress-Konstruktor existiert ausschließlich, um zwei Lizenzschlüsselsysteme und den Laufzeitpfad zu verwalten. IronBarcode ersetzt es mit einer einzigen Zeile beim Anwendungsstart. Die BarcodeService-Klasse benötigt überhaupt keinen Konstruktor.
BarCode lesen
BarcodeXpress-Ansatz:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public string ReadFirstBarcode(string imagePath)
{
// Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.FirstOrDefault()?.BarcodeValue;
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public string ReadFirstBarcode(string imagePath)
{
// Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.FirstOrDefault()?.BarcodeValue;
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Function ReadFirstBarcode(imagePath As String) As String
' Analyze takes a System.Drawing.Bitmap; the SDK does not read PDFs directly.
Using bitmap As New Bitmap(imagePath)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.DataMatrixBarcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = _barcodeXpress.reader.Analyze(bitmap)
Return results.FirstOrDefault()?.BarcodeValue
End Using
End Function
IronBarcode -Ansatz:
using IronBarCode;
public string ReadFirstBarcode(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.First().Value;
}
using IronBarCode;
public string ReadFirstBarcode(string imagePath)
{
var results = BarcodeReader.Read(imagePath);
return results.First().Value;
}
Imports IronBarCode
Public Function ReadFirstBarcode(imagePath As String) As String
Dim results = BarcodeReader.Read(imagePath)
Return results.First().Value
End Function
Der BarcodeTypes Array-Filter und der new Bitmap(...) Lade-Schritt verschwinden beide. IronBarcode erkennt automatisch das Format in allen unterstützten Symbologien und akzeptiert direkt einen Dateipfad. Wenn ein Lieferant von Code 128 auf DataMatrix umstellt, funktioniert IronBarcode weiterhin ohne Codeänderung. Auch Ergebnisattribute ändern sich: BarcodeValue wird zu Value, und BarcodeType wird zu Format. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt beide Umbenennungen.
Lesen mehrerer Barcodes aus einem Bild
BarcodeXpress-Ansatz:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue).ToList();
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
using var bitmap = new Bitmap(imagePath);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
Result[] results = _barcodeXpress.reader.Analyze(bitmap);
return results.Select(r => r.BarcodeValue).ToList();
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Function ReadAllBarcodes(imagePath As String) As IReadOnlyList(Of String)
Using bitmap As New Bitmap(imagePath)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
}
Dim results As Result() = _barcodeXpress.reader.Analyze(bitmap)
Return results.Select(Function(r) r.BarcodeValue).ToList()
End Using
End Function
IronBarcode -Ansatz:
using IronBarCode;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
var options = new BarcodeReaderOptions { ExpectMultipleBarcodes = true };
var results = BarcodeReader.Read(imagePath, options);
return results.Select(r => r.Value).ToList();
}
using IronBarCode;
public IReadOnlyList<string> ReadAllBarcodes(string imagePath)
{
var options = new BarcodeReaderOptions { ExpectMultipleBarcodes = true };
var results = BarcodeReader.Read(imagePath, options);
return results.Select(r => r.Value).ToList();
}
Imports IronBarCode
Public Function ReadAllBarcodes(imagePath As String) As IReadOnlyList(Of String)
Dim options As New BarcodeReaderOptions With {.ExpectMultipleBarcodes = True}
Dim results = BarcodeReader.Read(imagePath, options)
Return results.Select(Function(r) r.Value).ToList()
End Function
ExpectMultipleBarcodes sagt IronBarcode, nach dem ersten Treffer weiter zu scannen, was bei Dokumenten mit mehreren Codes in verschiedenen Regionen nützlich ist. Weitere Details zu den Leseoptionen finden Sie in der IronBarcode -Lesedokumentation .
Batch-Verarbeitung
BarcodeXpress ist instanzbasiert und sein reader-Objekt ist zustandsbehaftet, daher erfordert parallele Batch-Verarbeitung eine Instanz pro Thread mit der vollständigen Zwei-Schicht-Lizenzinitialisierung pro Thread. Die statischen Methoden von IronBarcode sind zustandslos, daher erfordert Parallel.ForEach keine Instanzverwaltung.
BarcodeXpress-Ansatz:
using System.Collections.Generic;
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
Result[] barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
using System.Collections.Generic;
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public Dictionary<string, string> ProcessBatch(IEnumerable<string> imagePaths)
{
var results = new Dictionary<string, string>();
foreach (var path in imagePaths)
{
using var bitmap = new Bitmap(path);
_barcodeXpress.reader.BarcodeTypes = new[]
{
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
};
Result[] barcodes = _barcodeXpress.reader.Analyze(bitmap);
if (barcodes.Length > 0)
results[path] = barcodes[0].BarcodeValue;
}
return results;
}
Imports System.Collections.Generic
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Function ProcessBatch(imagePaths As IEnumerable(Of String)) As Dictionary(Of String, String)
Dim results As New Dictionary(Of String, String)()
For Each path In imagePaths
Using bitmap As New Bitmap(path)
_barcodeXpress.reader.BarcodeTypes = New BarcodeType() {
BarcodeType.Code128Barcode,
BarcodeType.QRCodeBarcode
}
Dim barcodes As Result() = _barcodeXpress.reader.Analyze(bitmap)
If barcodes.Length > 0 Then
results(path) = barcodes(0).BarcodeValue
End If
End Using
Next
Return results
End Function
IronBarcode -Ansatz:
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public Dictionary<string, string> ProcessBatch(string[] imagePaths)
{
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, file =>
{
var r = BarcodeReader.Read(file);
var first = r.FirstOrDefault();
if (first != null)
results[file] = first.Value;
});
return new Dictionary<string, string>(results);
}
using IronBarCode;
using System.Collections.Concurrent;
using System.Threading.Tasks;
public Dictionary<string, string> ProcessBatch(string[] imagePaths)
{
var results = new ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, file =>
{
var r = BarcodeReader.Read(file);
var first = r.FirstOrDefault();
if (first != null)
results[file] = first.Value;
});
return new Dictionary<string, string>(results);
}
Imports IronBarCode
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Public Function ProcessBatch(imagePaths As String()) As Dictionary(Of String, String)
Dim results = New ConcurrentDictionary(Of String, String)()
Parallel.ForEach(imagePaths, Sub(file)
Dim r = BarcodeReader.Read(file)
Dim first = r.FirstOrDefault()
If first IsNot Nothing Then
results(file) = first.Value
End If
End Sub)
Return New Dictionary(Of String, String)(results)
End Function
Falls die Begrenzung von 40 Seiten pro Minute in der BarcodeXpress Standard Edition Sie dazu veranlasst hat, Code zur Behandlung der Ratenbegrenzung hinzuzufügen – z. B. Wartezeiten zwischen 40er-Gruppen, einen Minutenzähler oder Verzögerungen –, entfernen Sie diesen Code vollständig. IronBarcode hat keine Durchsatzbegrenzung.
PDF-Unterstützung hinzufügen
BarcodeXpress liest Barcodes nicht direkt aus PDF-Dateien. Die übliche Lösung besteht darin, eine separate PDF-Rendering-Bibliothek hinzuzufügen, jede Seite als Bild im Speicher zu rendern und diese Bilder dann nacheinander an den Barcode-Leser zu übergeben.
BarcodeXpress-Ansatz:
// Requires a separate PDF library (not shown — varies by team choice)
// Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
foreach (Bitmap pageBitmap in pdfRenderer.RenderPages("document.pdf"))
{
using (pageBitmap)
{
_barcodeXpress.reader.BarcodeTypes = Enum.GetValues(typeof(BarcodeType));
Result[] barcodes = _barcodeXpress.reader.Analyze(pageBitmap);
// ... collect results
}
}
// Requires a separate PDF library (not shown — varies by team choice)
// Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
foreach (Bitmap pageBitmap in pdfRenderer.RenderPages("document.pdf"))
{
using (pageBitmap)
{
_barcodeXpress.reader.BarcodeTypes = Enum.GetValues(typeof(BarcodeType));
Result[] barcodes = _barcodeXpress.reader.Analyze(pageBitmap);
// ... collect results
}
}
Imports System
Imports System.Drawing
' Requires a separate PDF library (not shown — varies by team choice)
' Pattern: render each PDF page to a Bitmap, then pass it to Analyze.
For Each pageBitmap As Bitmap In pdfRenderer.RenderPages("document.pdf")
Using pageBitmap
_barcodeXpress.reader.BarcodeTypes = [Enum].GetValues(GetType(BarcodeType))
Dim barcodes As Result() = _barcodeXpress.reader.Analyze(pageBitmap)
' ... collect results
End Using
Next
IronBarcode -Ansatz:
using IronBarCode;
// One call — no rendering step, no external dependency
var results = BarcodeReader.Read("document.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
using IronBarCode;
// One call — no rendering step, no external dependency
var results = BarcodeReader.Read("document.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports IronBarCode
' One call — no rendering step, no external dependency
Dim results = BarcodeReader.Read("document.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
Wenn Aspose.PDF, PdfiumViewer, itext7 oder irgendeine andere PDF-Bibliothek allein hinzugefügt wurde, um den BarcodeXpress-Leseworkflow zu unterstützen, kann sie nach der Migration entfernt werden. Weitere Optionen, einschließlich der Auswahl eines Seitenbereichs, finden Sie im IronBarcode PDF-Leseguide.
Barcode-Erzeugung
BarcodeXpress-Ansatz:
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public void GenerateBarcode(string data, string outputPath)
{
_barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode;
_barcodeXpress.writer.BarcodeValue = data;
// CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save(outputPath);
}
using System.Drawing;
using Accusoft.BarcodeXpressSdk;
public void GenerateBarcode(string data, string outputPath)
{
_barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode;
_barcodeXpress.writer.BarcodeValue = data;
// CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save(outputPath);
}
Imports System.Drawing
Imports Accusoft.BarcodeXpressSdk
Public Sub GenerateBarcode(data As String, outputPath As String)
_barcodeXpress.writer.BarcodeType = BarcodeType.Code128Barcode
_barcodeXpress.writer.BarcodeValue = data
' CreateBitmap returns a System.Drawing.Bitmap; persist via Bitmap.Save.
Using bitmap As Bitmap = _barcodeXpress.writer.CreateBitmap()
bitmap.Save(outputPath)
End Using
End Sub
IronBarcode -Ansatz:
using IronBarCode;
public void GenerateBarcode(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
}
using IronBarCode;
public void GenerateBarcode(string data, string outputPath)
{
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ResizeTo(400, 100)
.SaveAsPng(outputPath);
}
Imports IronBarCode
Public Sub GenerateBarcode(data As String, outputPath As String)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) _
.ResizeTo(400, 100) _
.SaveAsPng(outputPath)
End Sub
Die fließende Kette ersetzt die Eigenschaftenzuweisungen, den CreateBitmap-Aufruf und den Bitmap.Save-Schritt. Um den Barcode als Binärdaten für die Speicherung in einer Datenbank oder den Abruf von einer API zu erhalten:
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ToPngBinaryData();
byte[] pngBytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)
.ToPngBinaryData();
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128).ToPngBinaryData()
QR-Code-Generierung
BarcodeXpress-Ansatz:
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode;
_barcodeXpress.writer.BarcodeValue = data;
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save("qr.png");
// Logo overlay required manual GDI+ drawing on the returned Bitmap
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode;
_barcodeXpress.writer.BarcodeValue = data;
using Bitmap bitmap = _barcodeXpress.writer.CreateBitmap();
bitmap.Save("qr.png");
// Logo overlay required manual GDI+ drawing on the returned Bitmap
Imports System.Drawing
_barcodeXpress.writer.BarcodeType = BarcodeType.QRCodeBarcode
_barcodeXpress.writer.BarcodeValue = data
Using bitmap As Bitmap = _barcodeXpress.writer.CreateBitmap()
bitmap.Save("qr.png")
' Logo overlay required manual GDI+ drawing on the returned Bitmap
End Using
IronBarcode -Ansatz:
using IronBarCode;
using IronSoftware.Drawing;
// Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (for logo overlays)
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;
// Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500)
.SaveAsPng("qr.png");
// With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500)
.AddBrandLogo("logo.png")
.SaveAsPng("qr-branded.png");
// With high error correction (for logo overlays)
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
' Simple QR
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.SaveAsPng("qr.png")
' With branded logo
QRCodeWriter.CreateQrCode("https://example.com", 500) _
.AddBrandLogo("logo.png") _
.SaveAsPng("qr-branded.png")
' With high error correction (for logo overlays)
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")
Logoeinbettung, Fehlerkorrekturstufe und Farbanpassung sind allesamt in die Fluent API integriert. BarcodeXpress erfordert für jede dieser Funktionen ein manuelles GDI+-Zeichnen nach dem ersten Schreiben der Datei. Für mehr QR-Code-Optionen lesen Sie den QR-Code-Erstellungsguide.
Accusoft BarcodeXpressAPI zu IronBarcode Mapping-Referenz
| Accusoft BarcodeXpress | IronBarcode |
|---|---|
new BarcodeXpress(".") |
Statische Methoden – keine Instanz erforderlich |
Licensing.SetSolutionName("...") |
IronBarCode.License.LicenseKey = "key" |
Licensing.SetSolutionKey(a, b, c, d) |
(removed — not needed) |
Licensing.SetOEMLicenseKey(string) |
(removed — no OEM/runtime key concept) |
new Bitmap(path) + reader.Analyze(bitmap) |
BarcodeReader.Read(path) |
reader.BarcodeTypes = new[] { BarcodeType.Code128Barcode, ... } |
(removed — auto-detection handles all formats) |
result.BarcodeValue |
result.Value |
result.BarcodeType |
result.Format |
writer.BarcodeType = BarcodeType.Code128Barcode |
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) |
writer.BarcodeValue = "data" |
(first argument to CreateBarcode) |
writer.CreateBitmap() + bitmap.Save(path) |
.SaveAsPng(path) |
writer.BarcodeType = BarcodeType.QRCodeBarcode |
QRCodeWriter.CreateQrCode(data, size) |
| 40 ppm Standardgrenzwert | Keine Durchsatzbegrenzung auf keiner Ebene |
Gängige Migrationsprobleme und Lösungen
Problem 1: Kompilierungsfehler bei Eigenschaftsnamen
BarcodeXpress: Ergebnisobjekte bieten BarcodeValue und BarcodeType, die in IronBarcode nicht existieren.
Lösung: Führen Sie vor dem Erstellen eine Suchen-und-Ersetzen-Operation in der gesamten Lösung durch:
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
Ersetzen Sie result.BarcodeValue mit result.Value und result.BarcodeType mit result.Format in allen gefundenen Dateien.
Problem 2: Verwaiste Lizenzkonfigurationsaufrufe
BarcodeXpress: SetSolutionName, SetSolutionKey und SetOEMLicenseKey-Aufrufe — plus alle benutzerdefinierten Assertions, die das " UNLICENSED accusoft.com "-Wasserzeichen im entschlüsselten Ergebnis erkennen — existieren in vielen Codebasen als Schutzmechanismen gegen den wasserzeichenbehafteten Ausfallmodus.
Lösung: Lokalisieren und löschen Sie alle derartigen Aufrufstellen — IronBarcode hat keinen entsprechenden Zustand. Der Lizenzschlüssel ist entweder gültig oder nicht, und wenn nicht, gelten die Testbeschränkungen einheitlich, anstatt einzelne dekodierte Werte abzuwerten:
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "UNLICENSED accusoft" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "UNLICENSED accusoft" --include="*.cs" .
Alle diese Anrufseiten können gelöscht werden.
Problem 3: Docker-Lizenzdatei in Umgebungsvariable einbinden
BarcodeXpress: Docker-Deployments binden typischerweise eine BarcodeXpress-Lizenzkonfigurationsdatei an einen bekannten Pfad im Container ein, mithilfe einer COPY- oder Volume-Mount-Anweisung.
Lösung: Entfernen Sie die Konfigurationsdateikopie und ersetzen Sie sie durch eine Umgebungsvariable:
# Remove this
COPY accusoft-license.lic /app/license/
# Add this
ENV IRONBARCODE_LICENSE=YOUR-LICENSE-KEY
Beim Anwendungsstart:
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey =
Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System
IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
In Kubernetes wird der Lizenzschlüssel zu einer geheimen Referenz in der Pod-Spezifikation:
env:
- name: IRONBARCODE_LICENSE
valueFrom:
secretKeyRef:
name: ironbarcode-secrets
key: license-key
env:
- name: IRONBARCODE_LICENSE
valueFrom:
secretKeyRef:
name: ironbarcode-secrets
key: license-key
Problem 4: Code zur Behandlung von Ratenbegrenzungen
BarcodeXpress: Teams, die große Stapel unterhalb der Obergrenze von 40 PPM der Standard Edition verarbeiten, fügen oft Code hinzu, um zwischen Dokumentengruppen zu pausieren, Minutenzähler zu verfolgen oder Verzögerungen einzuführen, um innerhalb des Limits zu bleiben.
Lösung: Entfernen Sie den gesamten Code zur Ratenbegrenzung. Finden Sie es mit:
grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
IronBarcode hat keine Durchsatzbegrenzung – die Verarbeitung erfolgt mit der Geschwindigkeit, die Ihre Infrastruktur zulässt.
Ausgabe 5: Thread-Sicherheit – Entfernung von Instanzpools
BarcodeXpress: Codebasen, die gleichzeitige Verarbeitung unterstützen, verwalten häufig einen Pool von BarcodeXpress-Instanzen oder verwenden ein ThreadLocal<BarcodeXpress>-Muster, um den zustandsbehafteten Leser pro Thread zu isolieren.
Lösung: Die Pooling-Logik vollständig entfernen. IronBarcode's BarcodeReader.Read und BarcodeWriter.CreateBarcode sind zustandslose statische Methoden. Gleichzeitige Aufrufe von beliebig vielen Threads beeinträchtigen sich nicht gegenseitig.
Accusoft BarcodeXpressMigrations-Checkliste
Vor der Migration anfallende Aufgaben
Prüfen Sie den Quellcode, um alle BarcodeXpress-Verwendungen zu identifizieren, bevor Sie Codeänderungen vornehmen:
grep -r "BarcodeXpress" --include="*.cs" .
grep -r "Accusoft" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "reader\.Analyze" --include="*.cs" .
grep -r "writer\.CreateBitmap" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "BarcodeType\." --include="*.cs" .
grep -r "BarcodeXpress" --include="*.cs" .
grep -r "Accusoft" --include="*.cs" .
grep -r "SetSolutionName" --include="*.cs" .
grep -r "SetSolutionKey" --include="*.cs" .
grep -r "SetOEMLicenseKey" --include="*.cs" .
grep -r "reader\.Analyze" --include="*.cs" .
grep -r "writer\.CreateBitmap" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "BarcodeType\." --include="*.cs" .
- Notieren Sie sich, welche Barcode-Formate explizit in
BarcodeTypes-Zuweisungen aufgeführt sind — diese werden alle in IronBarcode automatisch erkannt - Identifizieren Sie jeglichen Code zur Ratenbegrenzungsbehandlung, der entfernt werden kann.
- Identifizieren Sie alle PDF-Rendering-Bibliotheken, die ausschließlich zur Unterstützung des BarcodeXpress-Lesens hinzugefügt wurden – diese können ebenfalls entfernt werden.
- Besorgen Sie sich Ihren IronBarcode -Lizenzschlüssel und fügen Sie ihn Ihrem Geheimnismanager hinzu.
Aufgaben der Code-Aktualisierung
- Entfernen Sie
Accusoft.BarcodeXpress.NetCoreaus allen.csproj-Dateien - Fügen Sie
IronBarcodein alle.csproj-Dateien ein, die Barcode-Funktionalität benötigen - Ersetzen Sie
using Accusoft.BarcodeXpressSdk;mitusing IronBarCode;in allen Dateien - Fügen Sie
IronBarCode.License.LicenseKey = ...zum Anwendungsstart hinzu - Löschen Sie alle
BarcodeXpress-Konstruktoraufrufe und Instanzfelder - Löschen Sie alle
SetSolutionName,SetSolutionKeyundSetOEMLicenseKey-Aufrufe - Löschen Sie benutzerdefinierte Assertions, die dekodierte Ausgaben auf das Wasserzeichen " UNLIZENZIERT accusoft.com " überprüfen
- Ersetzen Sie
new Bitmap(path)+reader.Analyze(bitmap)mitBarcodeReader.Read(path) - Entfernen Sie alle
reader.BarcodeTypes = ...-Zuweisungen - Ersetzen Sie
result.BarcodeValuemitresult.Value - Ersetzen Sie
result.BarcodeTypemitresult.Format - Ersetzen Sie
writer.CreateBitmap()+bitmap.Save(path)mitBarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path) - Entfernen Sie den Code zur Drosselung der Datenrate.
- Entfernen Sie gegebenenfalls den Zwischencode für die PDF-Darstellung.
- Entfernen Sie Instanzen-Pooling oder
ThreadLocal-Muster für BarcodeXpress-Instanzen - Entfernen Sie die Lizenzdateieinbindungen aus den Dockerfile- und docker-compose-Dateien.
- Fügen Sie die
IRONBARCODE_LICENSE-Umgebungsvariable den Docker- und Containerkonfigurationen hinzu - Kubernetes-Secrets und Pod-Spezifikationen aktualisieren
- Aktualisieren Sie die CI/CD-Pipeline-Geheimnisse — entfernen Sie
ACCUSOFT_SOLUTION_KEYundACCUSOFT_RUNTIME_KEY; fügen SieIRONBARCODE_LICENSEhinzu
Post-Migrationstests
- Erstellen Sie die Lösung – beheben Sie alle verbleibenden Kompilierungsfehler aufgrund umbenannter Eigenschaften.
- Führen Sie Unit-Tests für alle Barcode-Lesevorgänge durch.
- Führen Sie Unit-Tests für alle Barcode-Generierungsvorgänge durch.
- Gegebenenfalls mit PDF-Eingaben testen
- Führen Sie einen Stapelverarbeitungstest durch, um zu bestätigen, dass keine Durchsatzdrosselung auftritt.
- In einer Testumgebung bereitstellen und überprüfen, ob der Lizenzschlüssel korrekt aus der Umgebungsvariablen aufgelöst wird.
Wichtigste Vorteile der Migration zu IronBarcode
Beseitigung der Komplexität der Zwei-Schlüssel-Lizenz: Die SetSolutionName, SetSolutionKey und SetOEMLicenseKey-Einrichtung verschwindet vollständig. Ein Schlüssel deckt jede Umgebung von der Entwicklung bis zur Produktion ab, und der Testmodus liefert vollständige dekodierte Werte (anstatt jeden mit " UNLIZENZIERT accusoft.com " zu stempeln), sodass eine Vorkauf-Benchmarking auf realen Dokumenten möglich ist.
Keine Mindestabnahmemenge für Laufzeitlizenzen: BarcodeXpress benötigt für jede Produktionsbereitstellung mindestens fünf Laufzeitlizenzen. IronBarcode kennt kein Laufzeitlizenzkonzept – der einzelne unbefristete Schlüssel deckt eine beliebige Anzahl von Produktionsinstallationen innerhalb seiner Stufe ab.
Durchsatz ohne Obergrenze: Die Standard Edition beschränkt den Durchsatz auf 40 ppm, und jeglicher Code zur Ratenbegrenzung, der geschrieben wurde, um innerhalb dieser Grenze zu bleiben, kann entfernt werden. IronBarcode verarbeitet Anfragen mit der Geschwindigkeit, die von der zugrunde liegenden Hardware und dem Netzwerk unterstützt wird, ohne softwareseitige Begrenzung in irgendeiner Preisstufe.
Natives PDF-Lesen: BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien direkt und gibt seitenweise Ergebnisse mit Seitenzahl, Format, Wert und Zuversichtswert zurück. Jede PDF-Rendering-Bibliothek, die ausschließlich zur Unterstützung von BarcodeXpress hinzugefügt wurde, kann entfernt werden, wodurch Abhängigkeiten und Lizenzkosten reduziert werden.
Zustandslose Thread-Sicherheit: BarcodeReader.Read und BarcodeWriter.CreateBarcode sind zustandslose statische Methoden. Instanzen-Pools, ThreadLocal-Muster und pro-Thread-Initialisierungsblöcke können alle entfernt werden. Die gleichzeitige Verarbeitung mit Parallel.ForEach erfordert keine strukturellen Änderungen, außer dass die Threading-Umgehungen entfernt werden.
Vereinfachte Containerbereitstellung: Docker- und Kubernetes-Bereitstellungen verwenden eine einzige Umgebungsvariable zur Lizenzkonfiguration. Die Verteilung von Lizenzdateien, die Infrastruktur des Lizenzservers und die Einbindung von Konfigurationsdateien entfallen vollständig.
Häufig gestellte Fragen
Warum sollte ich von Accusoft BarcodeXpress auf IronBarcode umsteigen?
Zu den häufigsten Gründen gehören die Vereinfachung der Lizenzierung (Beseitigung der Komplexität von SDK und Laufzeitschlüsseln), die Beseitigung von Durchsatzbeschränkungen, die Verbesserung der nativen PDF-Unterstützung, die Verbesserung der Docker/CI/CD-Bereitstellung und die Verringerung von API-Boilerplate im Produktionscode.
Wie kann ich Accusoft BarcodeXpress API-Aufrufe durch IronBarcode ersetzen?
Ersetzen Sie Instanzerstellung und Lizenzierung durch IronBarCode.License.LicenseKey = "key". Ersetzen Sie die Leseaufrufe durch BarcodeReader.Read(path) und die Schreibaufrufe durch BarcodeWriter.CreateBarcode(data, encoding). Statische Methoden erfordern keine Instanzverwaltung.
Wie viel Code ändert sich bei der Migration von Accusoft BarcodeXpress zu IronBarcode?
Die meisten Migrationen führen zu weniger Codezeilen. Lizenzierungs-Boilerplate, Instanzkonstruktoren und explizite Formatkonfiguration werden entfernt. Zentrale Lese-/Schreibvorgänge werden auf kürzere IronBarcode-Äquivalente mit saubereren Ergebnisobjekten abgebildet.
Müssen während der Migration sowohl Accusoft BarcodeXpress als auch IronBarcode installiert bleiben?
Nein. Die meisten Migrationen sind direkte Ersetzungen und keine Paralleloperationen. Migrieren Sie eine Serviceklasse nach der anderen, ersetzen Sie die NuGet-Referenz und aktualisieren Sie die Instanzierungs- und API-Aufrufmuster, bevor Sie zur nächsten Klasse übergehen.
Wie lautet der NuGet-Paketname für IronBarcode?
Das Paket ist 'IronBarCode' (mit großem B und C). Installieren Sie es mit 'Install-Package IronBarCode' oder 'dotnet add package IronBarCode'. Die using-Anweisung im Code lautet 'using IronBarCode;'.
Wie vereinfacht IronBarcode die Docker-Bereitstellung im Vergleich zu Accusoft BarcodeXpress?
IronBarcode ist ein NuGet-Paket, für das keine externen SDK-Dateien oder Lizenzkonfigurationen erforderlich sind. In Docker setzen Sie die Umgebungsvariable IRONBARCODE_LICENSE_KEY und das Paket übernimmt die Lizenzvalidierung beim Start.
Erkennt IronBarcode nach der Migration von Accusoft BarcodeXpress automatisch alle Barcodeformate?
Ja, IronBarcode erkennt automatisch die Symbologie aller unterstützten Formate. Eine explizite Aufzählung von BarcodeTypes ist nicht erforderlich. Wenn das Format bereits bekannt ist und die Leistung eine Rolle spielt, ermöglicht BarcodeReaderOptions die Einschränkung des Suchraums als eine Optimierung.
Kann IronBarcode Barcodes aus PDFs ohne eine separate Bibliothek lesen?
Ja, BarcodeReader.Read("document.pdf") verarbeitet PDF-Dateien nativ. Die Ergebnisse enthalten PageNumber, Format, Value und Confidence für jeden gefundenen Barcode. Es ist kein externer PDF-Rendering-Schritt erforderlich.
Wie handhabt IronBarcode die parallele Verarbeitung von Barcodes?
Die statischen Methoden von IronBarcode sind zustandslos und thread-sicher. Verwenden Sie Parallel.ForEach direkt über Dateilisten ohne Instanzmanagement pro Thread. BarcodeReaderOptions.MaxParallelThreads steuert das interne Thread-Budget.
Welche Ergebniseigenschaften ändern sich bei der Migration von Accusoft BarcodeXpress zu IronBarcode?
Übliche Umbenennungen: BarcodeValue wird zu Value, BarcodeType wird zu Format. IronBarcode-Ergebnisse fügen auch Confidence und PageNumber hinzu. Eine lösungsweite Such- und Ersetzungsfunktion übernimmt die Umbenennungen im bestehenden Ergebnisverarbeitungscode.
Wie kann ich die IronBarcode-Lizenzierung in einer CI/CD-Pipeline einrichten?
Speichern Sie IRONBARCODE_LICENSE_KEY als Pipeline-Geheimnis und weisen Sie IronBarCode.License.LicenseKey im Startup-Code der Anwendung zu. Ein Geheimnis deckt alle Umgebungen ab, einschließlich Entwicklung, Test, Staging und Produktion.
Unterstützt IronBarcode die Generierung von QR-Codes mit benutzerdefiniertem Styling?
Ja. QRCodeWriter.CreateQrCode() unterstützt benutzerdefinierte Farben über ChangeBarCodeColor(), das Einbetten von Logos über AddBrandLogo(), konfigurierbare Fehlerkorrekturstufen und mehrere Ausgabeformate einschließlich PNG, JPG, PDF und Stream.

