Przejdź do treści stopki
FILMY

Jak dostosować i dodać logo do kodów QR w języku C#

Migrating from Accusoft BarcodeXpress to IronBarcode

Większość pracy związanej z tą migracją polega na usuwaniu. System licencjonowania dwukluczowego — SetSolutionName, SetSolutionKey i SetOEMLicenseKey dla pracy w czasie rzeczywistym — zanika całkowicie. Faktyczne operacje na kodach kreskowych (odczytanie obrazu, zapisanie kodu kreskowego do pliku) tłumaczą się na krótsze odpowiedniki IronBarcode. Jeśli baza kodów posiada klasę BarcodeService, która opakowuje BarcodeXpress, kod licencjonowania często stanowi dużą część kodu. Po migracji ta klasa kurczy się.

Dlaczego warto przejść z Accusoft BarcodeXpress

Zespoły migrujące z BarcodeXpress zgłaszają następujące wyzwałącze:

Tryb oceny blokuje dokładne porównania: Bez ważnego klucza OEM/czasu wykonania, BarcodeXpress stemple wyniki zdekodowane ciągiem ' UNLICENSED accusoft.com ' i stosuje ten sam stempel do generowanych kodów 2D. Testowanie dokładności przed zakupem na rzeczywistych dokumentach generuje takie oznaczone wyniki, więc nie można zweryfikować, że biblioteka poprawnie odczytuje Twoje rzeczywiste typy skanów przed zobowiązaniem się do zakupu.

Licencjonowanie dwukluczowe zwiększa obciążenie operacyjne: BarcodeXpress oddziela licencję SDK (SetSolutionName + SetSolutionKey) od licencji OEM/pracy w czasie rzeczywistym (SetOEMLicenseKey). Pipeline'y CI/CD, kontenery Docker oraz orkiestratorzy kontenerów wymagają, aby kluczowe systemy były zarządzane jako oddzielne sekrety. Brakujący lub nieważny klucz czasu wykonania przechodzi na oznaczone wyjście zamiast powodować błąd, tworząc tryb awaryjny, który może przejść automatyczne testy, jeśli asercje sprawdzają tylko wyniki inne niż null.

Co najmniej pięć licencji uruchomieniowych dla każdego wdrożenia produkcyjnego: Nawet wdrożenie na jednym serwerze wymaga zakupu co najmniej pięciu licencji uruchomieniowych. Zespoły korzystające z jednego serwera produkcyjnego i jednego serwera testowego płacą za co najmniej dziesięć licencji uruchomieniowych, niezależnie od faktycznego wykorzystania.

Limit 40 stron na minutę w wersji Standard Edition: Wersja Standard Edition ogranicza prędkość przetwarzania do 40 stron na minutę. Przy tej szybkości przetworzenie partii 100 000 dokumentów zajmuje około 41 godzin. Usunięcie limitu wymaga przejścia na wersję Professional Edition, która wiąże się z wyższym kosztem licencji na programistę, oprócz już zakupionych licencji środowiska uruchomieniowego.

Brak natywnej obsługi plików PDF: Pliki PDF muszą zostać przekształcone na obrazy przy użyciu oddzielnej biblioteki, zanim BarcodeXpress będzie mógł je odczytać. Ta zewnętrzna zależność powoduje dodatkowy koszt licencji, konieczność konwersji oraz dodatkowe obciążenie pamięci związane z przechowywaniem renderowanych obrazów stron.

Bezpieczeństwo wątków wymaga izolacji instancji: Obiekt reader BarcodeXpress jest stanowy i nie jest bezpieczny dla dostępu współbieżnego. Przetwarzanie równoległe partii wymaga jednej w pełni zainicjowanej instancji BarcodeXpress na wątek, z pełną inicjalizacją dwuwarstwowej licencji powtarzaną w każdym kontekście wątku.

Podstawowy problem

BarcodeXpress wymaga wieloetapowej inicjalizacji, ładowania grafiki Bitmap i konfiguracji BarcodeType[] przed odczytem jakiegokolwiek kodu kreskowego:

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
$vbLabelText   $csharpLabel

IronBarcode zastępuje cały ten blok jednym statycznym wywołaniem:

var value = BarcodeReader.Read(imagePath).First().Value;
var value = BarcodeReader.Read(imagePath).First().Value;
Dim value = BarcodeReader.Read(imagePath).First().Value
$vbLabelText   $csharpLabel

IronBarcode a Accusoft BarcodeXpress: porównanie funkcji

Funkcja Accusoft BarcodeXpress IronBarcode
Model licencji klucz SDK + klucz OEM/czasu wykonania (zakupy oddzielnie) Pojedynczy klucz wieczny
Minimalne licencje na środowisko uruchomieniowe 5 (nawet dla 1 serwera) Brak koncepcji licencji na czas działania
Tryb oceny zdekodowane wartości i generowane kody 2D stemplowane " UNLICENSED accusoft.com " Zwracane są pełne wartości; znak wodny tylko na generowanym wyjściu
Limit przepustowości 40 PPM (wersja standardowa) Brak limitów na żadnym poziomie
Automatyczne wykrywanie formatu Ręczny — konieczne jest przypisanie tablicy BarcodeType[] do BarcodeTypes Automatyczne dla wszystkich obsługiwanych formatów
Obsługa plików PDF Wymaga zewnętrznej biblioteki do renderowania stron do Bitmap Rodzimy — BarcodeReader.Read("doc.pdf")
Styl API Na bazie instancji; Wejście Bitmapy; konfiguracja właściwości/metody Statyczne metody fabryczne, płynny interfejs API
Bezpieczeństwo wątków Wymagana liczba instancji na wątek Stateless static methods — bezpieczne dla wątków
Konfiguracja licencji Docker Montowanie pliku licencji lub serwer licencji Pojedyncza zmienna środowiskowa
Wymagane sekrety CI/CD Klucz pary SDK + klucz OEM/runtime Jeden sekret
.NET Framework / .NET Core Oddzielne pakiety: Accusoft.BarcodeXpress.Net i Accusoft.BarcodeXpress.NetCore Single IronBarcode package (.NET Framework 4.6.2+, .NET Core 3.1+, .NET 5–8)
Linux/macOS Tak (przez pakiet .NetCore) Tak — Windows x64/x86, Linux x64, macOS x64/ARM
Kod QR z logo Wymagana ręczna nakładka GDI+ AddBrandLogo("logo.png") wbudowany
Cena początkowa $1,960+ SDK + minimum 5 licencji runtime 749 USD na czas nieokreślony (wersja Lite, 1 programista)
Licencja wieczysta Niestandardowe — skontaktuj się z działem sprzedaży Tak, wszystkie poziomy

Szybki start: Migracja z Accusoft BarcodeXpress do IronBarcode

Krok 1: Zastąp pakiet NuGet

dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
dotnet remove package Accusoft.BarcodeXpress.NetCore
dotnet add package IronBarcode
SHELL

Krok 2: Aktualizacja przestrzeni nazw

// Remove
using Accusoft.BarcodeXpressSdk;

// Add
using IronBarCode;
// Remove
using Accusoft.BarcodeXpressSdk;

// Add
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Krok 3: Inicjalizacja licencji

Dodaj inicjalizację licencji raz podczas uruchamiania aplikacji w Program.cs, Startup.cs, lub w konfiguracji wstrzykiwania zależności:

// 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"
$vbLabelText   $csharpLabel

W środowisku produkcyjnym odczytaj klucz ze zmiennej środowiskowej lub menedżera sekretów:

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

Brak SetSolutionKey, brak SetOEMLicenseKey, brak aktywacji pracy w czasie rzeczywistym na serwerze. To jest kompletna konfiguracja licencji.

Przykłady migracji kodu

Inicjalizacja licencji

Podejście BarcodeXpress:

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
$vbLabelText   $csharpLabel

Podejście IronBarcode:

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
$vbLabelText   $csharpLabel

Konstruktor BarcodeXpress istnieje tylko do zarządzania dwoma systemami kluczy licencyjnych i ścieżką runtime.IronBarcode zastępuje to jednym wierszem przy uruchomieniu aplikacji. Klasa BarcodeService nie wymaga żadnego konstruktora.

Odczytywanie BarCode

Podejście BarcodeXpress:

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
$vbLabelText   $csharpLabel

Podejście IronBarcode:

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
$vbLabelText   $csharpLabel

Zarówno filtr tablicy BarcodeTypes, jak i krok ładowania new Bitmap(...) całkowicie znikają.IronBarcode automatycznie wykrywa format wśród wszystkich obsługiwanych symbologii i akceptuje bezpośrednio ścieżkę do pliku. Jeśli dostawca przejdzie z Code 128 na DataMatrix,IronBarcode będzie nadal działać bez żadnych zmian w kodzie. Nazwy właściwości wyników również się zmieniają: BarcodeValue staje się Value, a BarcodeType staje się Format. Wszelkie zmiany nazw można wprowadzić za pomocą funkcji wyszukiwania i zamiany w całym dokumencie.

Odczytywanie wielu BarCodes z jednego obrazu

Podejście BarcodeXpress:

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
$vbLabelText   $csharpLabel

Podejście IronBarcode:

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
$vbLabelText   $csharpLabel

ExpectMultipleBarcodes mówi IronBarcode, aby kontynuował skanowanie po pierwszym dopasowaniu, co jest przydatne dla dokumentów z kilkoma kodami w różnych regionach. Więcej informacji na temat opcji odczytu można znaleźć w dokumentacji dotyczącej odczytu IronBarcode.

Przetwarzanie wsadowe

BarcodeXpress jest oparty na instancjach, a jego obiekt reader jest stanowy, dlatego przetwarzanie równoległe w partii wymaga jednej instancji na wątek z pełną inicjalizacją dwuwarstwowej licencji powtarzaną na wątek. Statyczne metody IronBarcodesą bezstanowe, dlatego Parallel.ForEach nie wymaga zarządzania instancjami.

Podejście BarcodeXpress:

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
$vbLabelText   $csharpLabel

Podejście IronBarcode:

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
$vbLabelText   $csharpLabel

Jeśli limit 40 stron na minutę w BarcodeXpress Standard Edition spowodował, że dodałeś kod obsługujący ograniczenia szybkości — zawieszanie działania między grupami po 40 stron, śledzenie licznika minutowego lub dodawanie opóźnień — usuń ten kod całkowicie.IronBarcode nie ma ograniczeń przepustowości.

Dodanie obsługi plików PDF

BarcodeXpress nie odczytuje kodów kreskowych bezpośrednio z plików PDF. Typowe obejście polega na dodaniu oddzielnej biblioteki renderującej pliki PDF, renderowaniu każdej strony do obrazu w pamięci, a następnie przekazywaniu tych obrazów do czytnika BarCode pojedynczo.

Podejście BarcodeXpress:

// 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
$vbLabelText   $csharpLabel

Podejście IronBarcode:

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
$vbLabelText   $csharpLabel

Jeśli Aspose.PDF, PdfiumViewer, itext7 lub jakakolwiek inna biblioteka PDF została dodana wyłącznie w celu obsługi przepływu pracy z BarcodeXpress, można ją usunąć po migracji. Zobacz przewodnik po odczycie PDF IronBarcode dla dodatkowych opcji, w tym wyboru zakresu stron.

Generowanie BarCode

Podejście BarcodeXpress:

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
$vbLabelText   $csharpLabel

Podejście IronBarcode:

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
$vbLabelText   $csharpLabel

Spójny łańcuch zastępuje przypisania właściwości, wywołanie CreateBitmap i krok Bitmap.Save. Aby uzyskać kod kreskowy jako dane binarne do przechowywania w bazie danych lub zwracania z API:

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()
$vbLabelText   $csharpLabel

Generowanie kodów QR

Podejście BarcodeXpress:

_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
$vbLabelText   $csharpLabel

Podejście IronBarcode:

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")
$vbLabelText   $csharpLabel

Wbudowane w płynny interfejs API są funkcje osadzania logo, poziomu korekty błędów oraz dostosowywania kolorów. BarcodeXpress wymaga ręcznego rysowania GDI+ po początkowym zapisaniu pliku dla każdej z tych funkcji. Dla innych opcji dla kodów QR, zobacz przewodnik generowania kodu QR.

Dokumentacja API Accusoft BarcodeXpress do IronBarcode

Accusoft BarcodeXpress IronBarcode
new BarcodeXpress(".") Metody statyczne — nie wymagają instancji
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)
Standardowy limit 40 stron na minutę Brak ograniczeń przepustowości na żadnym poziomie

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: Błędy kompilacji nazw właściwości

BarcodeXpress: Obiekty wynikowe udostępniają BarcodeValue i BarcodeType, które nie istnieją w IronBarcode.

Rozwiązanie: Przed kompilacją należy przeprowadzić operację wyszukiwania i zamiany w całym kodzie:

grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
grep -r "\.BarcodeValue" --include="*.cs" .
grep -r "\.BarcodeType" --include="*.cs" .
SHELL

Zastąp result.BarcodeValue przez result.Value i result.BarcodeType przez result.Format we wszystkich znalezionych plikach.

Problem 2: Osierocone wywołania konfiguracji licencji

BarcodeXpress: Wywołania SetSolutionName, SetSolutionKey i SetOEMLicenseKey — plus dowolne niestandardowe asercje, które wykrywają znak wodny " UNLICENSED accusoft.com " w zdekodowanym wyjściu — istnieją w wielu bazach kodów jako zabezpieczenie przed trybem awarii z wyjściem z podpisem wodnym.

Rozwiązanie: Zlokalizuj i usuń wszystkie takie lokalizacje wywołania —IronBarcode nie ma równorzędnego stanu. Klucz licencyjny jest albo ważny, albo nie, a jeśli nie jest, stosowane są limity wersji próbnej w sposób jednolity, zamiast obniżania wartości poszczególnych rozkodowanych wartości:

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" .
SHELL

Wszystkie te miejsca wywołania można usunąć.

Problem 3: Montowanie pliku licencji Docker do zmiennej środowiskowej

BarcodeXpress: Implementacje Docker zazwyczaj montują plik konfiguracyjny licencji BarcodeXpress do kontenera na znanej ścieżce, używając instrukcji COPY lub montowania woluminu.

Rozwiązanie: Usuń kopię pliku konfiguracyjnego i zastąp ją zmienną środowiskową:

# Remove this
COPY accusoft-license.lic /app/license/

# Add this
ENV IRONBARCODE_LICENSE=YOUR-LICENSE-KEY

Podczas uruchamiania aplikacji:

IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE");
Imports System

IronBarCode.License.LicenseKey = Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
$vbLabelText   $csharpLabel

W Kubernetes klucz licencyjny staje się sekretnym odniesieniem w specyfikacji podu:

env:
  - name: IRONBARCODE_LICENSE
    valueFrom:
      secretKeyRef:
        name: ironbarcode-secrets
        key: license-key
env:
  - name: IRONBARCODE_LICENSE
    valueFrom:
      secretKeyRef:
        name: ironbarcode-secrets
        key: license-key
YAML

Problem 4: Kod obsługi limitów szybkości

BarcodeXpress: Zespoły przetwarzające duże partie dokumentów w ramach limitu 40 PPM w wersji Standard Edition często dodawały kod, aby wstrzymywać działanie między grupami dokumentów, śledzić liczniki minutowe lub wprowadzać opóźnienia, aby nie przekroczyć limitu.

Rozwiązanie: Usuń cały kod ograniczający szybkość. Znajdź to za pomocą:

grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
grep -r "40\|PPM\|pagesPerMinute\|minuteStart" --include="*.cs" .
SHELL

IronBarcode nie ma ograniczeń przepustowości — przetwarzaj dane z dowolną prędkością, jaką obsługuje Twoja infrastruktura.

Problem 5: Bezpieczeństwo wątków — usunięcie puli instancji

BarcodeXpress: Bazy kodów, które wspierają przetwarzanie współbieżne, często utrzymują pule instancji BarcodeXpress lub używają wzorca ThreadLocal<BarcodeXpress>, aby izolować czytnik stanowy na wątek.

Rozwiązanie: Całkowicie usunąć logikę grupowania. Statyczne metody IronBarcodeBarcodeReader.Read i BarcodeWriter.CreateBarcode są bezstanowe. Równoczesne wywołania z dowolnej liczby wątków nie zakłócają się nawzajem.

Lista kontrolna migracji Accusoft BarcodeXpress

Zadania przed migracją

Przed wprowadzeniem jakichkolwiek zmian w kodzie należy przeprowadzić audyt kodu źródłowego w celu zidentyfikowania wszystkich miejsc użycia BarcodeXpress:

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" .
SHELL
  • Zauważ, które formaty kodów kreskowych są wyraźnie wymienione w przypisaniach BarcodeTypes — wszystkie te formaty stają się automatycznie wykryte w IronBarcode
  • Zidentyfikuj kod obsługujący ograniczenia szybkości, który można usunąć
  • Zidentyfikuj wszelkie biblioteki renderowania plików PDF dodane wyłącznie w celu obsługi odczytu BarcodeXpress — można je również usunąć
  • Uzyskaj klucz licencyjny IronBarcode i dodaj go do menedżera sekretów

Zadania związane z aktualizacją kodu

  1. Usuń Accusoft.BarcodeXpress.NetCore ze wszystkich plików .csproj
  2. Dodaj IronBarcode do wszystkich plików .csproj, które potrzebują funkcjonalności kodu kreskowego
  3. Zastąp using Accusoft.BarcodeXpressSdk; przez using IronBarCode; we wszystkich plikach
  4. Dodaj IronBarCode.License.LicenseKey = ... do uruchomienia aplikacji
  5. Usuń wszystkie wywołania konstruktorów BarcodeXpress i pola instancji
  6. Usuń wszystkie wywołania SetSolutionName, SetSolutionKey i SetOEMLicenseKey
  7. Usuń wszystkie niestandardowe potwierdzenia, które skanują rozkodowany wynik w poszukiwaniu znaku wodnego " UNLICENSED accusoft.com "
  8. Zastąp new Bitmap(path) + reader.Analyze(bitmap) przez BarcodeReader.Read(path)
  9. Usuń wszystkie przypisania reader.BarcodeTypes = ...
  10. Zastąp result.BarcodeValue przez result.Value
  11. Zastąp result.BarcodeType przez result.Format
  12. Zastąp writer.CreateBitmap() + bitmap.Save(path) przez BarcodeWriter.CreateBarcode(data, encoding).SaveAsPng(path)
  13. Usuń kod ograniczający szybkość
  14. Usuń kod pośredniczący w renderowaniu PDF, jeśli występuje
  15. Usuń wzorce wielokrotnego tworzenia lub ThreadLocal dla instancji BarcodeXpress
  16. Usuń montowanie plików licencji z plików Dockerfile i docker-compose
  17. Dodaj zmienną środowiskową IRONBARCODE_LICENSE do konfiguracji Docker i kontenerów
  18. Aktualizacja sekretów Kubernetes i specyfikacji podów
  19. Zaktualizuj tajne dane w pipeline CI/CD — usuń ACCUSOFT_SOLUTION_KEY i ACCUSOFT_RUNTIME_KEY; dodaj IRONBARCODE_LICENSE

Testy po migracji

  • Zbuduj rozwiązanie — napraw wszelkie pozostałe błędy kompilacji wynikające ze zmiany nazw właściwości
  • Przeprowadź testy jednostkowe wszystkich operacji odczytu BarCode
  • Przeprowadź testy jednostkowe wszystkich operacji generowania BarCodeów
  • W razie potrzeby przetestuj na plikach PDF
  • Przeprowadź test przetwarzania wsadowego, aby potwierdzić brak ograniczeń przepustowości
  • Wdroż w środowisku testowym i sprawdź, czy klucz licencyjny jest poprawnie rozpoznawany na podstawie zmiennej środowiskowej

Kluczowe korzyści wynikające z migracji do IronBarcode

Eliminacja złożoności licencji dwukluczowej: Konfiguracje SetSolutionName, SetSolutionKey i SetOEMLicenseKey znikają całkowicie. Jeden klucz obejmuje każde środowisko od rozwoju do produkcji, a tryb próbny zwraca kompletne rozkodowane wartości (zamiast stemplowania każdej z nich jako " UNLICENSED accusoft.com "), więc benchmarki przed zakupem na rzeczywistych dokumentach są możliwe.

Brak minimalnego zakupu licencji uruchomieniowych: BarcodeXpress wymaga co najmniej pięciu licencji uruchomieniowych dla każdego wdrożenia produkcyjnego.IronBarcode nie stosuje koncepcji licencji na czas działania — pojedynczy klucz wieczny obejmuje dowolną liczbę wdrożeń produkcyjnych w ramach danego poziomu.

Przepustowość bez ograniczeń: Limit 40 PPM w wersji Standard Edition oraz wszelki kod ograniczający szybkość, napisany w celu utrzymania się w jego granicach, można usunąć.IronBarcode przetwarza dane z dowolną prędkością, na jaką pozwala sprzęt i sieć, bez żadnych ograniczeń programowych w żadnym przedziale cenowym.

Natychmiastowe czytanie PDF-ów: BarcodeReader.Read("document.pdf") przetwarza pliki PDF bezpośrednio, zwracając wyniki dla każdej strony z numerem strony, formatem, wartością i współczynnikiem pewności. Wszelkie biblioteki renderowania plików PDF dodane wyłącznie w celu obsługi BarcodeXpress można usunąć, co pozwoli zmniejszyć liczbę zależności i obniżyć koszty licencji.

Bezpieczeństwo wątków bez potrzeby instancji: BarcodeReader.Read i BarcodeWriter.CreateBarcode to bezstanowe statyczne metody. Pule instancji, wzorce ThreadLocal i bloki inicjalizacji per-wątek można usunąć. Przetwarzanie współbieżne z Parallel.ForEach nie wymaga zmian w strukturze poza usunięciem obejść związanych z wątkami.

Uproszczone wdrażanie kontenerów: Wdrożenia Docker i Kubernetes wykorzystują jedną zmienną środowiskową do konfiguracji licencji. Dystrybucja plików licencji, infrastruktura serwerów licencji oraz montowanie plików konfiguracyjnych zostały wyeliminowane.

Często Zadawane Pytania

Dlaczego warto przejść z Accusoft BarcodeXpress na IronBarcode?

Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.

Jak zastąpić wywołania API Accusoft BarcodeXpress za pomocą IronBarcode?

Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.

Jak bardzo zmienia się kod podczas migracji z Accusoft BarcodeXpress do IronBarcode?

Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.

Czy podczas migracji muszę mieć zainstalowane zarówno Accusoft BarcodeXpress, jak i IronBarcode?

Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.

Jaka jest nazwa pakietu NuGet dla IronBarcode?

Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.

W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Accusoft BarcodeXpress?

IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.

Czy IronBarcode automatycznie wykrywa wszystkie formaty kodów kreskowych po migracji z Accusoft BarcodeXpress?

Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.

Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?

Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.

W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?

Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.

Jakie właściwości wyników ulegają zmianie podczas migracji z Accusoft BarcodeXpress do IronBarcode?

Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.

Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?

Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.

Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?

Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie