IRONSOFTWAREHOME
PORÓWNAJ Z INNYMI KOMPONENTAMI

ZXing.Net vs IronBarcode: Wybór biblioteki kodów kreskowych .NET w 2026 roku

Curtis Chau
Curtis Chau
Updated: 1 sierpnia 2026

ZXing.Net's BarcodeReader nie jest bezpieczny w wielowątkowości. Każda równoległa ścieżka odczytu w Twojej aplikacji — każdy równoległy ForEach, każda asynchroniczna akcja kontrolera obsługująca jednoczesne żądania — wymaga własnej instancji czytnika. To oznacza konfigurację formatu dla każdej instancji, Bitmap ładowanie i usuwanie przy każdym wywołaniu oraz alokację czytnika przy każdym żądaniu. Statyczna metoda IronBarcode obsługuje tę samą pracę bez alokacji dla każdego żądania. Bezpieczeństwo wątków to tylko jedna z pozycji na liście: brak natywnej obsługi plików PDF, fragmentacja pakietów wiążących w systemach Windows i Linux oraz wymóg określenia każdego formatu BARCODE, który zamierzasz skanować — to cechy, które powodują, że projekty ZXing.Net z czasem gromadzą obejścia.

Zrozumienie ZXing.Net

ZXing.Net to otwarta wersja biblioteki Java ZXing ("Zebra Crossing") firmy Google, udostępniona na licencjiApache 2.0i utrzymywana przez Michaela Jahna na GitHubie. Jest to najczęściej pobierana biblioteka open source do obsługi kodów kreskowych dla platformy .NET, z wieloletnim doświadczeniem sięgającym ponad dziesięciu lat. Biblioteka obsługuje zarówno odczyt, jak i zapis szerokiego zestawu formatów BarCode, a jej bezpłatna licencja sprawia, że jest dostępna dla projektów każdej wielkości, w tym produktów open source wymagających zależności zgodnych z Apache.

Architektura ZXing.Net odzwierciedla jego pochodzenie jako portu z języka Java. Klasa BarcodeReader to obiekt ze stanem: wywołanie Decode zapisuje stan wewnętrzny, co czyni instancje niebezpiecznymi do dzielenia między wątkami. Prawidłowe użycie równoczesne wymaga nowego czytnika na wątek lub puli ThreadLocal<BarcodeReader> — obie opcje przekładają odpowiedzialność za bezpieczeństwo wątków na wywołującego. Ładowanie obrazów również nie jest zawarte w pakiecie podstawowym; Zamiast tego ZXing.Net udostępnia pakiety powiązań specyficzne dla platformy, z których każdy udostępnia inną powierzchnię API.

Kluczowe cechy architektury obejmują:

  • Licencja Apache 2.0: Bezpłatna do użytku komercyjnego i open source, bez żadnych kosztów i wymogu kontaktu ze sprzedawcą.
  • Czytnik kodów kreskowych ze stanem: Instancja BarcodeReader nie jest bezpieczna w wielowątkowości; Należy utworzyć nową instancję dla każdego wątku lub każdej operacji równoległej.
  • Ręczne określenie formatu: Wywołujący muszą ustawić reader.Options.PossibleFormats przed każdym dekodowaniem; Formaty, które nie zostały wymienione, są pomijane bez wyświetlania błędu ani ostrzeżenia.
  • Brak natywnej obsługi plików PDF: biblioteka odczytuje wyłącznie obrazy; Wprowadzanie plików PDF wymaga oddzielnej biblioteki do renderowania plików PDF, takiej jak PdfiumViewer, w celu konwersji stron na mapy bitowe przed dekodowaniem.
  • Fragmentacja powiązań platformy: Pakiet podstawowy nie zapewnia ładowania obrazów; oddzielne pakiety powiązań (ZXing.Net.Bindings.Windows.Compatibility używając System.Drawing,ZXing.Net.Bindings.ImageSharp / .V2 / .V3używając SixLabors.ImageSharp, plus ZXing.Net.Bindings.SkiaSharp i ZXing.Net.Bindings.Magick) udostępniają różne API dla różnych celów wdrożeniowych.
  • Aktywna społeczność: na GitHubie prowadzone są zgłoszenia, pull requesty i dyskusje, zapewniając bezpłatne wsparcie na poziomie społeczności.
  • Obsługa szerokiej gamy formatów: Obsługuje kody QR, Code 128, Code 39, EAN-13, EAN-8, UPC-A, Data Matrix, PDF 417, Aztec i inne powszechnie stosowane symbole.

Architektura Stateful Reader

ZXing.Net's BarcodeReader wymaga nowej instancji dla każdego wątku lub operacji równoległej. Poniższy wzorzec przedstawia minimalną poprawną konfigurację przetwarzania współbieżnego:

// 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;
});

Wzorzec ThreadLocal<BarcodeReader> redukuje alokację dla każdego wywołania poprzez ponowne użycie jednej instancji na wątek, ale dodaje złożoność związaną z usuwaniem. W każdym przypadku, odpowiedzialność za bezpieczeństwo wątkowe spoczywa na wywołującym w ZXing.Net.

Zrozumienie IronBarcode

IronBarcode to komercyjna biblioteka IronBarcode opracowana przez firmę Iron Software. Zapewnia odczytywanie i generowanie kodów kreskowych przez bezstanowe statyczne API: BarcodeReader.Read i BarcodeWriter.CreateBarcode to główne punkty wejścia, i żadna z nich nie wymaga tworzenia instancji czy konfiguracji przed użyciem. Biblioteka jest dostarczana jako pojedynczy pakiet NuGet, który działa identycznie w systemach Windows, Linux,macOSoraz w kontenerach Docker bez pakietów powiązanych specyficznych dla danej platformy.

Silnik odczytu IronBarcode automatycznie wykrywa format w ponad 50 symbolikach kodów kreskowych. Dzwoniący nie określają, jakich formatów należy szukać; silnik porównuje każdy obraz ze wszystkimi obsługiwanymi formatami i zwraca każdy znaleziony BARCODE. Dla aplikacji, które muszą balansować między prędkością skanowania a dokładnością, element wyliczenia ReadingSpeed (Faster, Balanced, Detailed, ExtremeDetail) zapewnia kontrolę bez potrzeby wyliczania formatu. Biblioteka zawiera również natywną obsługę plików PDF, umożliwiającą odczytywanie BarCode'ów bezpośrednio z dokumentów PDF na wszystkich stronach bez konieczności stosowania oddzielnej biblioteki do renderowania plików PDF.

Kluczowe cechy obejmują:

  • Licencja komercyjna: Wymaga płatnego klucza licencyjnego; Dostępny jest tryb próbny do oceny.
  • Bezstanowe statyczne API: BarcodeReader.Read i BarcodeWriter.CreateBarcode to bezpieczne wątkowo statyczne metody; Nie jest wymagane zarządzanie instancjami.
  • Automatyczne wykrywanie formatu: Wszystkie ponad 50 obsługiwanych formatów BARCODE jest wykrywanych bez listy formatów; użytkownicy dostosowują prędkość, a nie zakres formatów.
  • Natywna obsługa PDF: BarcodeReader.Read przyjmuje bezpośrednio ścieżki do plików PDF, przetwarzając wszystkie strony bez zewnętrznej biblioteki PDF.
  • Pojedynczy pakiet wielopłatformowy: jeden pakiet NuGet działa na systemach Windows, Linux,macOSi Docker z tym samym interfejsem API.
  • Płynna generacja API: BarcodeWriter.CreateBarcode zwraca obiekt GeneratedBarcode z wbudowanymi metodami wyjścia, w tym SaveAsPng, SaveAsPdf, ToPngBinaryData i ToStream.
  • Wsparcie komercyjne: Licencje płatne obejmują dostęp do zespołu wsparcia Iron Software z gwarancjami poziomu usług.

Porównanie funkcji

Poniższa tabela przedstawia podstawowe różnice między ZXing.Net a IronBarcode:

FunkcjaZXing.NetIronBarcode
LicencjaApache 2.0(bezpłatna)Komercjalne
Bezpieczeństwo wątkówNie jest bezpieczne dla wątków — wymagana nowa instancja na wątekBezpieczne dla wątków statyczne API
Wykrywanie formatuRęczne — lista PossibleFormats wymaganaAutomatyczne — ponad 50 formatów
Odczytywanie plików PDFNie — wymaga PdfiumViewer lub podobnego oprogramowaniaNatywny — pojedyncze wywołanie metody
Obsługa platformOddzielne pakiety wiązania dla każdej platformyPojedynczy pakiet, wszystkie platformy
Generowanie kodów kreskowychZwraca Bitmap, wymaga ręcznego zapisuFluent API z wbudowanym wyjściem
CenyBezpłatneOd 749 USD (Lite) / $1,499 (Plus)

Szczegółowe porównanie funkcji

FunkcjaZXing.NetIronBarcode
Czytanie
Odczyt bezpieczny dla wątkówNie — wymagane są instancje na wątekTak — statyczne bezstanowe API
Automatyczne wykrywanie formatuNie — wymagane PossibleFormatsTak — wszystkie formaty auto-wykrywane
Wiele kodów kreskowych na obrazTak — DecodeMultipleTak — domyślne zachowanie
Odczytywanie BarCodes z plików PDFNie — wymagana biblioteka zewnętrznaTak — native
Odzyskiwanie uszkodzonych kodów kreskowychflaga TryHarderKorekcja obrazu wspierana przez ML
Strojenie szybkości / dokładnościRedukcja listy formatówenum ReadingSpeed
Generacja
Kod 128 / Kod 39TakTak
Kod QRTakTak
QR Code z logoNieTak
Dostosowanie koloru QR CodeNieTak
Wyjście do PNG/JPEG/PDFRęcznie przez System.DrawingWbudowane metody wyjściowe
Łańcuch generacji FluentNieTak
Platforma i wdrożenie
Windows (System.Drawing)Tak — ZXing.Net.Bindings.Windows.CompatibilityTak
Linux / DockerTak —ZXing.Net.Bindings.ImageSharp / .V2 / .V3(inne API)Tak — takie samo API
macOSTak — ZXing.Net.Bindings.ImageSharp / .V2 / .V3Tak
Dodatkowe zależności dla DockerMoże wymagać libgdiplusNone
Pojedynczy pakiet NuGetNie — rdzeń + powiązanie + opcjonalny ImageSharpTak
Licencjonowanie i wsparcie
Rodzaj licencjiApache 2.0Komercjalne
KosztBezpłatneOd 749 USD
Wsparcie społecznościProblemy na GitHubie, aktywna społecznośćTak
Komercyjne wsparcie SLANieTak
Przyjazny open-sourceTakNie

Bezpieczeństwo wątkowe i przetwarzanie współbieżne

Bezpieczeństwo wątkowe jest najważniejszą operacyjną różnicą między obiema bibliotekami i ma wpływ na więcej projektów, niż sugerują ostrzeżenia w dokumentacji.

ZXing.Net Podejście

ZXing.Net's BarcodeReader to obiekt ze stanem. Po wywołaniu Decode zostaje zapisany stan wewnętrzny. Jeśli dwa wątki dzielą tę samą instancję, te zapisy rywalizują. Rezultaty są niedeterministyczne: można otrzymać wynik z innego obrazu, null tam, gdzie istnieje kod kreskowy, lub wyjątek. Prawidłowe podejście to stworzenie jednego czytnika na wątek — co oznacza, że każda równoległa lub asynchroniczna ścieżka przydziela czytnik, konfiguruje go, używa raz i wyrzuca:

// 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;
});

Wzorzec ThreadLocal<BarcodeReader> redukuje alokację dla każdego wywołania poprzez ponowne użycie jednego czytnika na wątek, ale dodaje złożoność związaną z usuwaniem i nadal wymaga konfiguracji formatu dla każdej instancji.

Podejście IronBarcode

BarcodeReader.ReadIronBarcode to bezstanowa statyczna metoda. Nie ma instancji do dzielenia, nie ma instancji do izolowania i nie ma stanu konfiguracji do ochrony. To samo wywołanie działa bezpiecznie z dowolnej liczby współbieżnych wątków:

// 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;
});

Dokumentacja IronBarcode'a asynchroniczne i wielowątkowe czytanie kodów kreskowych wyjaśnia wewnętrzny model puli wątków. Właściwość MaxParallelThreads kontroluje stopień równoległości bez potrzeby zewnętrznej koordynacji.

Detekcja formatu

Polityka wykrywania formatu to druga znacząca różnica operacyjna między obiema bibliotekami.

ZXing.Net Podejście

ZXing.Net wymaga, aby reader.Options.PossibleFormats było wypełniane przed każdym dekodowaniem. Jeśli format kodu kreskowego nie jest wymieniony, nie zostanie wykryty — bez błędu, ostrzeżenia i częściowego wyniku:

// 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);

Jeśli wszystkie formaty są wymienione, aby uniknąć pominięć, wydajność ulega pogorszeniu. Jeśli umieszczone są tylko oczekiwane formaty, ciche pominięcia stają się ryzykiem, gdy obrazy pochodzą z zewnętrznych źródeł. Nie ma mechanizmu, aby ZXing.Net zgłaszał, że znalazł kod kreskowy w nieznanym formacie.

Podejście IronBarcode

IronBarcode automatycznie wykrywa wszystkie 50+ obsługiwanych formatów. Nie jest wymagana lub akceptowana lista formatów:

// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
    Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}

Dla aplikacji, które dostosowują prędkość odczytu do dokładności wykrywania,IronBarcode udostępnia enum ReadingSpeedFaster, Balanced, Detailed, ExtremeDetail — bez potrzeby wyliczania formatu. Strojenie szybkości wpływa na to, jak agresywnie silnik przetwarza każdy obraz, a nie które formaty rozważa.

Wsparcie dla dokumentów PDF

Czytanie PDF to twarda granica w ZXing.Net: biblioteka nie ma żadnego wsparcia dla PDF.

ZXing.Net Podejście

Gdy kod kreskowy przychodzi osadzony w PDF, ZXing.Net wymaga zewnętrznej biblioteki renderującej PDF. Najczęstsze obejście używa PdfiumViewer, który dodaje około 20 MB natywnych binariów i pętlę renderowania stron, którą wywołujący musi zaimplementować i utrzymywać:

// 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);
    }
}

Ten wzorzec ma rzeczywiste tryby awarii: błędna konfiguracja DPI powoduje ciche pominięcia, uprawnienia do plików tymczasowych zawodzą w izolowanych środowiskach, natywne biblioteki PdfiumViewer wymagają odrębnego zarządzania wdrożeniem, a konfiguracja nie działa na Linuxie bez dodatkowej konfiguracji.

Podejście IronBarcode

IronBarcode czyta kody kreskowe z PDF-ów natywnie — wszystkie strony, wszystkie formaty, bez zewnętrznych zależności. To samo wywołanie BarcodeReader.Read przyjmuje bezpośrednio ścieżki PDF:

// 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}");

Brak enumeracji stron, brak konfiguracji DPI, brak plików tymczasowych, brak oddzielnej biblioteki do wdrożenia razem z aplikacją.

Wiązania Platformowe i Wdrożenie

Obsługa obrazu w ZXing.Net jest rozproszona wśród specyficznych dla platform pakietów wiążących, z których każdy ma inną powierzchnię API.

ZXing.Net Podejście

Podstawowy pakiet ZXing.Net zapewnia logikę dekodowania, ale nie ładowanie obrazów. Wywołujący musi wybrać wiązanie w oparciu o swój docelowy cel wdrożenia:

ŚrodowiskoPakietUwagi
Pulpit Windows / WPFZXing.Net.Bindings.Windows.CompatibilityUżywa System.Drawing — przyjazne dla Windows; wymaga libgdiplus na Linux
Linux / Docker / międzyplatformowyZXing.Net.Bindings.ImageSharp / .V2 / .V3Inna powierzchnia API; dodaje zależność SixLabors.ImageSharp (V2/V3 śledzą główne wersje ImageSharp)
macOSZXing.Net.Bindings.ImageSharp / .V2 / .V3Taki sam ścieżkę jak Linux

Praktyczną konsekwencją jest to, że kod Windows używający System.Drawing.Bitmap nie kompiluje się ani nie działa na Linux. Konteneryzacja wymaga zmiany pakietów wiążących i przepisania kodu ładowania obrazów:

// 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);
// 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);

Użycie powiązań Windows na hoście Linux również wymaga libgdiplus w obrazie Docker, co dodaje około 50 MB do kontenera.

Podejście IronBarcode

IronBarcode dostarcza jeden pakiet dla wszystkich platform. To samo wywołanie BarcodeReader.Read(path) kompiluje i działa identycznie na Windows, Linux,macOSi wewnątrz kontenerów Docker. Nie są wymagane pakiety wiążące, warunki dla platform i dodatkowe zależności systemowe. Dla zespołów konteneryzujących aplikacje .NET, przewodnik setup IronBarcode dla Docker i Linux obejmuje wzorzec wdrożenia pakietu pojedynczego w szczegółach.

Generowanie API

Obie biblioteki generują kody kreskowe, ale API odzwierciedla różne podejścia projektowe.

ZXing.Net Podejście

Klasa BarcodeWriter ZXing.Net tworzy obiekt pisarza, przyjmuje opcje kodowania, wywołuje Write, i zwraca Bitmap, który wywołujący muszą zapisać ręcznie używając System.Drawing.Imaging:

// 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);

Zapis do formatów innych niż PNG lub JPEG, zapis do PDF lub tworzenie wyjścia binarnego dla odpowiedzi HTTP wymaga dodatkowych System.Drawing, które implementuje wywołujący.

Podejście IronBarcode

BarcodeWriter.CreateBarcodeIronBarcode zwraca obiekt GeneratedBarcode, który zapewnia wbudowane metody wyjścia przez łańcuch płynny:

// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("output.png");

Obiekt GeneratedBarcode również udostępnia .ToPngBinaryData(), .ToJpegBinaryData(), .ToStream() i .SaveAsPdf() — cele wyjścia, które ZXing.Net wymaga, aby wywołujący samodzielnie zaimplementowali przy użyciu System.Drawing.

Przewodnik po mapowaniu API

ZXing.NetIronBarcodeUwagi
new BarcodeReader()Statyczne — brak instancjiBarcodeReader.Read(...) to wywołanie statyczne
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... }Nie jest potrzebneAutomatyczne wykrywanie obejmuje wszystkie formaty
reader.Options.TryHarder = trueSpeed = ReadingSpeed.BalancedDostrajanie dokładności przez BarcodeReaderOptions
reader.Decode(bitmap)BarcodeReader.Read(imagePath)Przekaż ścieżkę bezpośrednio — nie potrzebne Bitmap
reader.DecodeMultiple(bitmap)BarcodeReader.Read(imagePath)Zawsze zwraca kolekcję
result.Textresult.ValueZmieniono nazwę właściwości
result.BarcodeFormatresult.FormatZmieniono nazwę właściwości
BarcodeFormat.QR_CODEBarcodeEncoding.QRCodeZmiana konwencji nazewnictwa enumów
BarcodeFormat.CODE_128BarcodeEncoding.Code128Zmiana konwencji nazewnictwa enumów
BarcodeFormat.EAN_13BarcodeEncoding.EAN13Zmiana konwencji nazewnictwa enumów
new BarcodeWriter { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { ... } }BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128)Statyczna metoda fabryczna
writer.Write(data) zwraca Bitmap.SaveAsPng(path) / .ToPngBinaryData()Wbudowane metody wyjścia na GeneratedBarcode
Brak obsługi plików PDF — wymagany jest PdfiumViewerBarcodeReader.Read("doc.pdf")Natywna obsługa plików PDF
Nie jest bezpieczne dla wątkówBezpieczne dla wątków statyczne APINie jest wymagane zarządzanie instancjami

Kiedy zespoły rozważają przejście z ZXing.Net na IronBarcode

Istnieje kilka scenariuszy, w których zespoły programistów rozważająIronBarcode jako alternatywę dla ZXing.Net.

Przetwarzanie równoległe i o wysokiej przepustowości

Integracja ZXing.Net, która działa poprawnie w jednowątkowej aplikacji konsolowej, może wykazywać zachowanie niedeterministyczne, gdy ten sam kod zostanie przeniesiony do kontrolera ASP.NET Core obsługującego równoczesne żądania lub do zadania w tle, które przetwarza partie danych równolegle. Wymagany przez ZXing.Net wzorzec instancji na wątek oznacza, że każde żądanie lub zadanie równoległe przydziela pełny obiekt czytnika z skonfigurowanym zestawem dekoderów, używa go raz, a następnie odrzuca. Wraz ze wzrostem liczby zgłoszeń presja związana z alokacją zasobów staje się wymierna. Zespoły, które osiągają ten etap — zwłaszcza te korzystające z wysokowydajnych potoków skanowania w logistyce, magazynowaniu lub przetwarzaniu dokumentów — często poszukują biblioteki, której model wątków nie nakłada tego obciążenia na każdego wywołującego.

Skanowanie dokumentów o mieszanym formacie

Aplikacje, które akceptują dokumenty od stron trzecich, często napotykają formaty BARCODE, których nie przewidziano podczas konfiguracji listy formatów. Integracja wysyłkowa stworzona dla Code 128 odbiera przesyłkę od partnera za pomocą kodów QR. System dokumentacji medycznej skonfigurowany dla formatu PDF 417 napotyka symbole Data Matrix od nowego dostawcy sprzętu. W ZXing.Net każdy z tych przypadków powoduje cichą wartość null zamiast błędu dekodowania, co oznacza, że pominięcie może nie ujawnić się, dopóki nie zawiedzie dalsze przetwarzanie. Zespoły, które poniosły straty z powodu niezauważonych błędów formatowania — szczególnie w sytuacjach, gdzie brak BarCODE'a ma konsekwencje biznesowe — zaczynają rozważać koszty utrzymania listy formatów w porównaniu z biblioteką, która automatycznie wykrywa formaty.

Ekstrakcja BarCodes z plików PDF

Wiele dokumentów biznesowych przychodzi w formacie PDF: faktury, listy przewozowe, dokumentacja pacjentów, certyfikaty zgodności. ZXing.Net nie może odczytać tych plików bezpośrednio. Zespoły, które muszą wyodrębniać kody kreskowe z plików PDF, w końcu budują i utrzymują potok renderowania oparty na ZXing.Net — wybierając bibliotekę PDF, zarządzając jej natywnymi zależnościami, wdrażając pętlę renderowania stron, obsługując konfigurację DPI i pisząc logikę czyszczenia plików tymczasowych. Ten kod infrastruktury nie jest logiką BarCode; istnieje wyłącznie po to, aby wypełnić lukę między tym, co akceptuje ZXing.Net (mapy bitowe), a tym, czym faktycznie są dokumenty biznesowe (pliki PDF). Zespoły, które muszą utrzymywać ten pomost — zwłaszcza gdy sama biblioteka PDF ma własne wymagania dotyczące licencji, wdrażania i platformy — często preferują jedną bibliotekę, która obsługuje cały zakres danych wejściowych.

Zmniejszenie złożoności powiązań

Projekty, które rozpoczynają się w systemie Windows, a następnie są wdrażane w systemie Linux lub Docker, bezpośrednio napotykają problem fragmentacji powiązań ZXing.Net: pakiet powiązań dla systemu Windows wykorzystuje inne API niż wielopłatformowe powiązanie ImageSharp, a przełączanie się między nimi wymaga zmiany zarówno odwołań NuGet, jak i kodu ładującego obrazy. Zespoły, które rutynowo konteneryzują swoje aplikacje .NET lub które uruchamiają ten sam kod na komputerach programistów (Windows lub macOS) i serwerach produkcyjnych (Linux), zauważają, że utrzymywanie dwóch ścieżek kodu do ładowania obrazów utrudnia każdą przyszłą zmianę w warstwie skanującej.

Typowe kwestie związane z migracją

Zespoły przechodzące z ZXing.Net na IronBarcode powinny zaplanować te konkretne zmiany techniczne.

Usunięcie instancji BarcodeReader

Każde wywołanie new BarcodeReader() w kodzie jest usuwane podczas migracji. Wzorzec instancjonowania — utworzenie czytnika, konfiguracja formatu, ładowanie obrazu, wywołanie dekodowania — sprowadza się do jednego wywołania metody statycznej. Pliki, które importują przestrzenie nazw ZXing, ZXing.Common, ZXing.Windows.Compatibility, ZXing.ImageSharp i SixLabors.ImageSharp, mają te importy usunięte i zastąpione jednym using IronBarCode;.

Usunięcie konfiguracji PossibleFormats

Blok przypisania reader.Options.PossibleFormats jest usuwany w każdym miejscu wywołania.IronBarcode wykonuje automatyczne wykrywanie formatu i nie akceptuje listy ograniczeń formatu. Flaga TryHarder jest zastępowana właściwością ReadingSpeed na BarcodeReaderOptions, która kontroluje wysiłek wykrywania bez zawężania zakresu formatu.

Porządkowanie pakietów wiązanych

Migracja usuwa ZXing.Net, ZXing.Net.Bindings.Windows.Compatibility, dowolny wariant ZXing.Net.Bindings.ImageSharp (.V2 / .V3), oraz dowolne pakiety PdfiumViewer, które zostały dodane do wsparcia odczytu PDF. Jeśli libgdiplus zostało dodane do pliku Dockerfile, aby wspierać System.Drawing poprzez powiązanie Windows na Linux, ta linia jest również usuwana.IronBarcode nie wymaga żadnych zależności specyficznych dla platformy w obrazie Docker.

Dodatkowe możliwości IronBarcode

Oprócz funkcji omówionych w powyższych sekcjach porównawczych,IronBarcode oferuje:

  • Kod QR z osadzonym logo: Generuj kody QR z niestandardowym obrazem logo umieszczonym w centrum, z automatyczną korekcją błędów, aby zapewnić możliwość skanowania.
  • Dostosowanie kolorów kodów QR: Ustawianie kolorów pierwszego planu i tła na generowanych kodach QR w celu uzyskania wyników zgodnych z wizerunkiem marki.
  • Umieszczanie BarCode'ów w plikach PDF: Umieszczaj BarCode'y bezpośrednio na istniejących stronach PDF w określonych współrzędnych bez konieczności korzystania z oddzielnej biblioteki PDF.
  • Obsługa BarCode'ów GS1: Odczyt i generowanie BarCode'ów w formacie GS1, w tym GS1-128 i GS1 DataBar, stosowanych w łańcuchach dostaw w handlu detalicznym i służbie zdrowia.
  • Równoległe async czytanie: Wbudowane metody asynchroniczne do integracji czytania kodów kreskowych w rurociągach await bez blokowania.
  • Korekcja obrazów oparta na ML: Automatyczne ulepszanie obrazu dla uszkodzonych, rozmazanych lub niskokontrastowych kodów kreskowych, których TryHarder nie może odzyskać.

Zgodność z platformą .NET i gotowość na przyszłość

IronBarcode jest zgodny ze standardem .NET 2.0 i nowszymi, zapewniając kompatybilność z .NET Framework 4.6.2+, .NET Core 3.1, .NET 5, .NET 6, .NET 7, .NET 8 i .NET 9. Biblioteka jest regularnie aktualizowana zgodnie z cyklem wydawniczym .NET Microsoftu, co zapewnia dostępność kompatybilności z .NET 10 w momencie lub blisko daty wydania. ZXing.Net zapewnia również szeroką kompatybilność z platformą .NET dzięki pakietom NuGet, a z tego punktu widzenia obie biblioteki nadają się do nowoczesnych projektów .NET.

Wnioski

ZXing.Net i IronBarcode reprezentują różne filozofie projektowania bibliotek kodów kreskowych. ZXing.Net to biblioteka stanowa, oparta na instancjach, która całkowicie przekazuje odpowiedzialność za wątki, specyfikację formatu i mostkowanie PDF na stronę wywołującego. Biblioteka IronBarcode to bezstanowa biblioteka ze statycznym interfejsem API, która internalizuje wielowątkowość, automatycznie wykrywa formaty i natywnie obsługuje dane wejściowe w formacie PDF. Praktyczną konsekwencją tej różnicy jest to, że kod ZXing.Net w kontekstach współbieżnych lub przetwarzania dokumentów ma tendencję do gromadzenia infrastruktury — wzorców instancji na wątek, list formatów, potoków renderowania PDF oraz gałęzi powiązań specyficznych dla platformy — podczas gdy kod IronBarcode dla tych samych scenariuszy nie wymaga żadnej z tych struktur otaczających.

ZXing.Net to naprawdę dobry wybór dla projektów, w których wymagany jest zerowy koszt. LicencjaApache 2.0sprawia, że jest on kompatybilny z projektami open source oraz z produktami komercyjnymi, które preferują darmowe zależności. W kontrolowanych środowiskach — znanych formatach BARCODE, czystych obrazach, przetwarzaniu jednowątkowym lub lekko współbieżnym — działa niezawodnie. Aktywna społeczność GitHub zapewnia szybkie odpowiedzi na zgłoszenia, a zakres obsługiwanych formatów jest porównywalny z komercyjnymi alternatywami. W zastosowaniach, w których spełnione są te warunki, przewaga kosztowa ZXing.Net jest realna, a jego ograniczenia techniczne są możliwe do opanowania.

IronBarcode rozwiązuje problemy, w których ograniczenia projektowe ZXing.Net przekładają się na koszty operacyjne: współbieżne interfejsy API, gdzie przydział instancji na żądanie jest mierzalny; potoki dokumentów, gdzie dane wejściowe w formacie PDF są normą, a nie wyjątkiem; skanowanie w różnych formatach, gdzie niezauważone pominięcia niosą ze sobą ryzyko biznesowe; oraz wdrożenia wielopłatformowe, gdzie dwa pakiety wiązania oznaczają dwie ścieżki kodu. W tych kontekstach komercyjna licencja biblioteki zapewnia model wątków, który nie narzuca zarządzania instancjami, wykrywanie formatów, które nie wymaga konserwacji, oraz obsługę plików PDF, która nie wymaga drugiej biblioteki.

Decyzja zależy od wymagań projektu. Prototyp w jednym formacie, skaner typu open source lub narzędzie o niewielkiej wydajności, w przypadku którego koszt stanowi wiążące ograniczenie — to sytuacje, w których ZXing.Net jest właściwym wyborem. Produkcyjne API internetowe przetwarzające dokumenty z zewnętrznych źródeł w wielu wątkach — to właśnie tam założenia projektowe IronBarcode pokrywają się z rzeczywistością operacyjną. Aby uzyskać szerszy obraz porównania bibliotek pod kątem wskaźników wykrywalności i rzeczywistych scenariuszy skanowania, dodatkową analizę zapewnia porównanie skanerów kodów kreskowych ZXing.Net i IronBarcode.

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ęczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta