Przejdź do treści stopki
PORóWNAJ Z INNYMI KOMPONENTAMI

Spire.Barcode vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

ZXing.Net.MAUI vs IronBarcode: Porównanie Kodów Kreskowych MAUI w C# 2026

ZXing.Net.Maui.Controls v0.7.4. Stabilny na NuGet, ale wciąż przed wersją 1.0. Skanowanie MAUI na Windows nie jest wspierane (tylko generacja). Zarejestrowano, że auto-focus iPhone 15 Pro jest dotknięty (problem #260). Wycieki zasobów aparatu bez Dispose() (problem #164). Jest to biblioteka, po którą najczęściej sięgają programiści .NET MAUI — i ta, która najczęściej budzi obawy dotyczące produkcji przed wydaniem projektu.

Zrozumienie ZXing.Net.MAUI

ZXing.Net.MAUI to utrzymywana przez społeczność wersja biblioteki BARCODE ZXing.Net dla platformy .NET MAUI, opracowana i opublikowana przez Jona Dicka (GitHub: Redth) na licencji MIT. Udostępnia kontrolkę aparatu XAML, CameraBarcodeReaderView, która osadza wizjer skanujący kody kreskowe na żywo w stronach MAUI. Deweloperzy podłączają zdarzenie BarcodesDetected, aby otrzymywać wyniki skanowania, gdy aparat przechwytuje klatki. Biblioteka dziedziczy pełny silnik formatu kodu kreskowego z ZXing.Net, w tym jego enum BarcodeFormats i model konfiguracji BarcodeReaderOptions.

Pakiet ZXing.Net.Maui.Controls jest zarejestrowany w MauiProgram.cs za pomocą builder.UseBarcodeReader() i jest projektowany wokół potoku aparatu mobilnego dla iOS i Androida. Biblioteka nie jest wspierana przez organizację komercyjną, nie obejmuje umowy SLA i nie oferuje płatnego wsparcia technicznego. Jego wersja v0.7.4 to stabilne wydanie NuGet, ale pozostaje przed wersją 1.0 w ramach wersjonowania semantycznego.

Kluczowe cechy architektury ZXing.Net.MAUI:

  • Status Przed wersją 1.0: Pakiet NuGet jest w wersji v0.7.4 — stabilny, ale wciąż przed 1.0. Możliwe są zmiany API w mniejszych wersjach przed 1.0, częstotliwość poprawek błędów zależy od społeczności zarządzającej, a brak umowy o wsparcie komercyjne.
  • Skanowanie w iOS i Android: Biblioteka oparta jest na API kamer platformowych dla iOS i Android.Windows MAUIobsługuje tylko generację — skanowanie kamery nie jest zaimplementowane. Mac Catalyst jest uwzględniony na liście frameworków docelowych, ale skanowanie nie jest oficjalnie udokumentowane.
  • Ciągły Wizjer Aparatu: CameraBarcodeReaderView to kontrolka aparatu na żywo, która działa ciągle, gdy strona jest widoczna. Zajmuje miejsce na ekranie i wymaga zarządzania cyklem życia strony.
  • Brak Implementacji Dispose(): Kontrolka nie implementuje IDisposable. Zasoby aparatu nie są formalnie zwalniane przy nawigacji stroną, co wymaga ręcznego obejścia IsDetecting = false w OnDisappearing() (problem GitHub nr 164).
  • Problem z Automatycznym Ostrzeniem iPhone 15 Pro: Problem GitHub nr 260 dokumentuje, że urządzenia iPhone 15 Pro i Pro Max (identyfikatory sprzętowe iPhone16,1 i iPhone16,2) nie uzyskują niezawodnego ostrzenia do wykrywania kodów kreskowych. Obecnie nie jest dostępna żadna programowa poprawka.
  • Problem Zgodności Aparatu na Android: Problem GitHub nr 275 śledzi błędy kompilacji wynikające z konfliktów zgodności z AndroidX Camera 1.5.0, z obejściem polegającym na przypinaniu pakietów aparatu do 1.4.x lub podnoszeniu projektu minSdkVersion.
  • Dziedziczenie Specyfikacji Formatu ZXing.Net: Każda sesja skanowania wymaga wyraźnego zadeklarowania, które wartości BarcodeFormats mają być skanowane. Formaty niewymienione w BarcodeReaderOptions.Formats są cicho ignorowane, nawet jeśli są widoczne w kadrze aparatu.
  • Architektura oparta wyłącznie na kamerze: biblioteka nie posiada interfejsu API do wprowadzania plików, interfejsu API do odczytu strumieniowego ani funkcji wyodrębniania BarCode'ów z plików PDF. Wszystkie operacje skanowania muszą odbywać się za pośrednictwem podglądu na żywo z kamery.

Architektura CameraBarcodeReaderView

Kontrolka CameraBarcodeReaderView jest centralnym komponentem ZXing.Net.MAUI. Została zadeklarowana w XAML i skonfigurowana poprzez wiązanie BarcodeReaderOptions. Każda strona, która jej używa, musi implementować OnAppearing i nadpisania OnDisappearing do zarządzania stanem IsDetecting:


<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
    <zxing:CameraBarcodeReaderView
        x:Name="CameraView"
        Options="{Binding ReaderOptions}"
        BarcodesDetected="OnBarcodesDetected" />
</ContentPage>

<ContentPage xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;assembly=ZXing.Net.MAUI.Controls">
    <zxing:CameraBarcodeReaderView
        x:Name="CameraView"
        Options="{Binding ReaderOptions}"
        BarcodesDetected="OnBarcodesDetected" />
</ContentPage>
XML
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (CameraView != null)
        CameraView.IsDetecting = false;  // Nie IDisposable on the control
}

protected override void OnAppearing()
{
    base.OnAppearing();
    if (CameraView != null)
        CameraView.IsDetecting = true;
}
// Toggling IsDetecting in lifecycle overrides is the documented pattern
protected override void OnDisappearing()
{
    base.OnDisappearing();
    if (CameraView != null)
        CameraView.IsDetecting = false;  // Nie IDisposable on the control
}

protected override void OnAppearing()
{
    base.OnAppearing();
    if (CameraView != null)
        CameraView.IsDetecting = true;
}
' Toggling IsDetecting in lifecycle overrides is the documented pattern
Protected Overrides Sub OnDisappearing()
    MyBase.OnDisappearing()
    If CameraView IsNot Nothing Then
        CameraView.IsDetecting = False ' Nie IDisposable on the control
    End If
End Sub

Protected Overrides Sub OnAppearing()
    MyBase.OnAppearing()
    If CameraView IsNot Nothing Then
        CameraView.IsDetecting = True
    End If
End Sub
$vbLabelText   $csharpLabel

Każda strona skanowania w aplikacji ZXing.Net.MAUI zawiera ten standardowy fragment dotyczący cyklu życia. Brak IDisposable oznacza, że stan aparatu musi być zarządzany ręcznie przez flagę IsDetecting zamiast standardowego wzorca Dispose.

Zrozumienie IronBarcode

IronBarcode to komercyjna biblioteka kodów kreskowych .NET opracowana przez firmę Iron Software. Udostępnia zarówno odczytywanie, jak i generowanie kodów kreskowych poprzez statyczne API, BarcodeReader.Read(), które przyjmuje bajty obrazu, ścieżki plików, strumienie i dokumenty PDF. W kontekście MAUI,IronBarcodełączy się z wbudowanym MediaPicker MAUI, aby przechwytywać zdjęcia za pomocą kamery systemowej, a następnie przetwarza wynikowy obraz po przechwyceniu zamiast przetwarzać ciągły strumień z aparatu.

Biblioteka jest przeznaczona dla wszystkich platform MAUI — iOS, Android, Windows i macOS — i korzysta z tego samego pakietu oraz tych samych ścieżek kodu. Nie jest wymagana rejestracja specyficzna dla platformy w MauiProgram.cs, żadna kontrolka widoku aparatu nie jest osadzona w XAML, a zarządzanie cyklem życia nie jest potrzebne, ponieważIronBarcode nie utrzymuje stanu uruchomionego aparatu.

Kluczowe cechy IronBarcode:

  • Stabilna wersja komercyjna: opublikowana jako gotowy do użycia w środowisku produkcyjnym pakiet NuGet z komercyjnym wsparciem, umową SLA i regularnym harmonogramem wydawania aktualizacji.
  • Wszystkie platformy MAUI: Obsługuje cele MAUI dla systemów iOS, Android, Windows i macOS z poziomu jednego pakietu i jednego wzorca kodu.
  • Stateless API: BarcodeReader.Read() to statyczne wywołanie metody. Pomiędzy skanami nie są uruchamiane żadne procesy w tle, nie są wymagane żadne haki cyklu życia, a podczas nawigacji po stronach nie gromadzą się żadne zasoby kamery.
  • Automatyczne wykrywanie wszystkich formatów: Automatycznie wykrywa ponad 50 formatów BarCode bez listy specyfikacji formatów. Skanowanie nieznanego formatu nie wymaga żadnej konfiguracji.
  • Odczytywanie plików i dokumentów PDF: Odczytuje kody kreskowe z ścieżek plików, tablic bajtów, strumieni i dokumentów PDF w sposób natywny, obsługując scenariusze, których nie są w stanie obsłużyć biblioteki wykorzystujące obraz z kamery na żywo.
  • Odzyskiwanie uszkodzonych BarCodes oparte na uczeniu maszynowym: Wykorzystuje modele uczenia maszynowego do odzyskiwania BarCodes z uszkodzonych, częściowo zasłoniętych lub niskiej jakości obrazów, wykraczając poza możliwości algorytmów progowych.
  • Generowanie kodów BARCODE: Generuje wszystkie główne formaty kodów BARCODE 1D i 2D jako obrazy z możliwością konfiguracji rozmiaru, koloru i marginesu.
  • Wdrażanie wielopłatformowe: ten sam pakiet działa w ASP.NET Core, WPF, WinForms, aplikacjach konsolowych, Azure Functions i kontenerach Docker, a także w MAUI.

Porównanie funkcji

Poniższa tabela przedstawia główne różnice między ZXing.Net.MAUI a IronBarcode:

Funkcja ZXing.Net.MAUI IronBarcode
Status wydania Stabilny, ale przed wersją 1.0 (v0.7.4) Stabilna, komercyjna wersja
Obsługa platform iOS, Android — skanowanie (tylko generowanie w Windows) iOS, Android, Windows, macOS, serwer
Wymagana specyfikacja formatu Tak Nie (automatyczne wykrywanie)
Zarządzanie zasobami kamery Ręczny (IsDetecting) Nie dotyczy — bezstanowe
Ekstrakcja BarCodes z plików PDF Niedostępne Tak
Licencja MIT (bezpłatne, społecznościowe) Komercjalne
Wsparcie komercyjne None Tak

Szczegółowe porównanie funkcji

Funkcja ZXing.Net.MAUI IronBarcode
Platforma
iOS MAUI Tak (problem z ogniskowaniem iPhone 15 Pro #260) Tak
Android MAUI Tak (problem z kompilacją Camera 1.5.0 #275) Tak
Windows MAUI Tylko generowanie — skanowanie nie zostało zaimplementowane Tak
macOS MAUI Ukierunkowany na Mac Catalyst; skanowanie nie jest oficjalnie udokumentowane Tak
ASP.NET Core / Serwer Nie Tak
WPF / WinForms Nie Tak
Azure Functions / Docker Nie Tak
.NET Framework 4.6.2+ Nie Tak
Czytanie
Automatyczne wykrywanie formatu Nie — należy określić formaty Tak (ponad 50 formatów)
Wprowadzenie ścieżki do pliku Tylko przez ZXing.NET Core Tak
Dane wejściowe strumienia Tylko przez ZXing.NET Core Tak
Pobieranie kodów kreskowych z plików PDF Nie Tak
Odzyskiwanie uszkodzonych kodów kreskowych TryHarder tylko Tak (oparte na ML)
Integracja z kamerą
Sterowanie podglądem na żywo Tak Nie (interfejs użytkownika systemu MediaPicker)
Wymagane zarządzanie cyklem życia Tak (IsDetecting) Nie
Implementacja metody Dispose() Nie Nie dotyczy
Autofokus w iPhone 15 Pro Dotknięty (GitHub issue #260) Nie dotyczy
Generacja
Generowanie BarCode'ów Tak (za pośrednictwem ZXing.Net) Tak
Konserwacja
Status wydania Stabilny, ale przed wersją 1.0 (v0.7.4) Gotowe do produkcji
Wsparcie komercyjne None Tak
Gwarancja stabilności API Pre-1.0 — możliwe zmiany w wersji minor Tak
Licencja MIT (bezpłatne) Komercjalne

Obsługa platform

Obsługa platform stanowi różnicę strukturalną między ZXing.Net.MAUI a IronBarcode, ponieważ obie biblioteki opierają się na zasadniczo różnych założeniach dotyczących miejsca działania aplikacji .NET MAUI.

Podejście ZXing.Net.MAUI

ZXing.Net.MAUI jest zaprojektowany wokół platformowych API kamery dla iOS i Android.Windows MAUIobsługuje tylko generowanie kodów kreskowych — skanowanie kamery nie zostało zaimplementowane i nie jest na publicznej mapie drogowej. Odzwierciedla to architektoniczny wybór, aby zbudować bibliotekę wokół kontroli celownika kamery na żywo, których implementacje platformowe zostały napisane tylko dla mobilnych systemów operacyjnych.

Projekt MAUI celujący w net8.0-windows10.0.19041.0 nie uzyska funkcjonalności skanowania kodu kreskowego z ZXing.Net.MAUI. Mac Catalyst jest obecny na liście docelowych frameworków, ale skanowanie na tym docelowym nie jest oficjalnie udokumentowane. Zespoły, które rozpoczynają projekt z celami tylko mobilnymi i później dodają wymaganie dla Windows lub macOS, odkryją, że ZXing.Net.MAUI nie może pokryć skanowania na tych docelowych. Wsparcie dla iOS samo w sobie niesie zastrzeżenie: GitHub issue #260 dokumentuje, że urządzenia iPhone 15 Pro i Pro Max są dotknięte problemem z autofokusem, który uniemożliwia niezawodne wykrywanie.

Podejście IronBarcode

IronBarcode obsługuje wszystkie docelowe frameworki MAUI — iOS, Android, Windows i macOS — z tego samego pakietu i przy użyciu tego samego wzorca kodu. Podejście MediaPicker + BarcodeReader.Read() w naturalny sposób mapuje się na każdą platformę: na urządzeniach mobilnych MediaPicker.CapturePhotoAsync() wywołuje aparata w urządzeniu; W systemie Windows odpowiada to okienku wyboru plików, co jest właściwym zachowaniem w środowisku desktopowym. Nie jest wymagany żaden kod specyficzny dla platformy, kompilacja warunkowa ani rejestracja usług platformy.

Wzór kodu BARCODE MAUI na komputery stacjonarne z systemem Windows i macOS jest obsługiwany przez ten sam pakiet, który obsługuje skanowanie mobilne. To samo wywołanie BarcodeReader.Read(), które działa na urządzeniu z Androidem, działa również w punkcie końcowym ASP.NET Core, aplikacji desktopowej WinForms lub funkcji Azure — cel wdrożenia nie wpływa na API.

Integracja kamery i cykl życia

Te dwie biblioteki reprezentują przeciwstawne podejścia architektoniczne do sposobu działania dostępu do kamery w aplikacji MAUI.

Podejście ZXing.Net.MAUI

CameraBarcodeReaderView to uporczywa kontrolka aparatu osadzona na stronie XAML. Zaczyna przetwarzać klatki kamery, gdy IsDetecting jest ustawione na true i zatrzymuje się, gdy jest ustawione na false. Brak implementacji Dispose() oznacza, że zasoby aparatu nie są zwalniane przez standardowy wzorzec IDisposable, gdy użytkownik opuszcza stronę. Dokumentowane obejście polega na ustawieniu IsDetecting = false w OnDisappearing() i przywróceniu go w OnAppearing():

// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
    base.OnDisappearing();
    CameraView.IsDetecting = false;
}

protected override void OnAppearing()
{
    base.OnAppearing();
    CameraView.IsDetecting = true;
}
// ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
protected override void OnDisappearing()
{
    base.OnDisappearing();
    CameraView.IsDetecting = false;
}

protected override void OnAppearing()
{
    base.OnAppearing();
    CameraView.IsDetecting = true;
}
' ZXing.Net.MAUI: toggle IsDetecting in page lifecycle overrides
Protected Overrides Sub OnDisappearing()
    MyBase.OnDisappearing()
    CameraView.IsDetecting = False
End Sub

Protected Overrides Sub OnAppearing()
    MyBase.OnAppearing()
    CameraView.IsDetecting = True
End Sub
$vbLabelText   $csharpLabel

Ten wzór musi być powtórzony na każdej stronie, na której znajduje się skaner. Aplikacje, które często nawigują do strony skanowania i z powrotem, mogą akumulować zasoby kamery, które nie zostały w pełni zwolnione, co jest śledzone w GitHub issue #164 obok raportów o wzroście pamięci i przerywanym inicjowaniu kamery przy powrocie. Problem z automatycznym ostrzeniem iPhone 15 Pro (problem GitHub nr 260) to osobna kwestia w warstwie integracji aparatu: podgląd aparatu renderuje kod kreskowy wyraźnie, ale system autofokusa nie blokuje wystarczająco ostro, aby wykrywanie na sprzęcie iPhone16,1 i iPhone16,2 było możliwe. Udokumentowane obejście polega na poinstruowaniu użytkownika, aby ręcznie dostosował odległość między urządzeniem a kodem kreskowym.

Podejście IronBarcode

IronBarcode nie osadza elementu sterującego kamerą w układzie XAML. Zamiast tego, wywołanie MediaPicker.CapturePhotoAsync() otwiera interfejs użytkownika aparatu systemowego, gdy użytkownik naciska przycisk. Aparat systemowy samodzielnie zarządza ostrością, ekspozycją i autofokusem. Gdy użytkownik potwierdza przechwycenie, wynikowy obraz jest przekazywany do BarcodeReader.Read() jako tablica bajtów:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var barcode in results)
        Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}

// Nie OnAppearing or OnDisappearing needed — no camera state to manage
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var barcode in results)
        Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}

// Nie OnAppearing or OnDisappearing needed — no camera state to manage
Imports IronBarCode
Imports System.IO

Private Async Sub ScanButton_Clicked(sender As Object, e As EventArgs)
    Dim photo = Await MediaPicker.CapturePhotoAsync()
    If photo Is Nothing Then Return

    Using stream = Await photo.OpenReadAsync()
        Using ms As New MemoryStream()
            Await stream.CopyToAsync(ms)

            Dim results = BarcodeReader.Read(ms.ToArray())
            For Each barcode In results
                Console.WriteLine($"{barcode.Format}: {barcode.Value}")
            Next
        End Using
    End Using
End Sub

' Nie OnAppearing or OnDisappearing needed — no camera state to manage
$vbLabelText   $csharpLabel

Samouczek dotyczący skanera BARCODE .NET MAUI obejmuje pełną konfigurację projektu dla tego wzorca, w tym konfigurację uprawnień zarówno dla systemu iOS, jak i Android. Ponieważ nie ma stałego widoku kamery, nie ma zasobów do zwolnienia, stanu do przełączania ani szablonu cyklu życia do utrzymania na różnych stronach.

Specyfikacja formatu

Sposób, w jaki biblioteka radzi sobie z wykrywaniem formatów kodów kreskowych BarCode, ma bezpośredni wpływ na niezawodność skanowania w rzeczywistych wdrożeniach.

Podejście ZXing.Net.MAUI

ZXing.Net.MAUI dziedziczy wymagania specyfikacji formatu ZXing.Net. Przed rozpoczęciem skanowania, programista musi wypełnić BarcodeReaderOptions.Formats maską bitową wartości enum BarcodeFormats, które powinny zostać wykryte. Formaty nieujęte w tej liście nie będą wykrywane — w sposób cichy, bez błędów ani ostrzeżeń:

// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
    Formats = BarcodeFormats.QRCode |
              BarcodeFormats.Code128 |
              BarcodeFormats.Ean13 |
              BarcodeFormats.UpcA,
    TryHarder = true,
    AutoRotate = true
};
// ZXing.Net.MAUI: formats must be declared explicitly
// Formats not listed here are not detected
ReaderOptions = new BarcodeReaderOptions
{
    Formats = BarcodeFormats.QRCode |
              BarcodeFormats.Code128 |
              BarcodeFormats.Ean13 |
              BarcodeFormats.UpcA,
    TryHarder = true,
    AutoRotate = true
};
' ZXing.Net.MAUI: formats must be declared explicitly
' Formats not listed here are not detected
ReaderOptions = New BarcodeReaderOptions With {
    .Formats = BarcodeFormats.QRCode Or
               BarcodeFormats.Code128 Or
               BarcodeFormats.Ean13 Or
               BarcodeFormats.UpcA,
    .TryHarder = True,
    .AutoRotate = True
}
$vbLabelText   $csharpLabel

Jeśli użytkownik skieruje kamerę na GS1 DataBar, kod Aztec, MaxiCode lub dowolny format, który nie został zadeklarowany w opcjach, skanowanie nie zwróci wyniku bez podniesienia błędu. Kamera wyświetla kod kreskowy, a aplikacja nie otrzymuje wyniku. W kontrolowanym środowisku — magazynie, w którym każdy produkt ma etykietę Code128 — jest to wykonalne. W wdrożeniach, w których formaty kodów kreskowych są określane przez zewnętrznych dostawców, klientów lub systemy zewnętrzne, brak ścieżki alternatywnej staje się nawracającym problemem wsparcia.

Podejście IronBarcode

IronBarcode automatycznie wykrywa format we wszystkich obsługiwanych formatach bez konieczności wcześniejszej konfiguracji. BarcodeReader.Read() analizuje obraz i zwraca wyniki dla każdego zidentyfikowanego kodu kreskowego, niezależnie od formatu. Nie jest wymagana lista BarcodeReaderOptions:

// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
    Console.WriteLine($"{barcode.Format}: {barcode.Value}");
// IronBarcode: no format specification needed
// All 50+ formats detected automatically
var results = BarcodeReader.Read(imageBytes);
foreach (var barcode in results)
    Console.WriteLine($"{barcode.Format}: {barcode.Value}");
Imports IronBarcode

' IronBarcode: no format specification needed
' All 50+ formats detected automatically
Dim results = BarcodeReader.Read(imageBytes)
For Each barcode In results
    Console.WriteLine($"{barcode.Format}: {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Jeśli konieczne jest dostrojenie wydajności w kontrolowanym scenariuszu, w którym oczekiwany jest tylko jeden format, wskazówki dotyczące formatu mogą być przekazywane opcjonalnie — ale nigdy nie są one wymagane do prawidłowego wykrywania. BarCode w formacie, którego programista nie przewidział, nadal zostanie wykryty i zwrócony.

Przetwarzanie plików i plików PDF

Oprócz skanowania na żywo z kamery wiele procesów związanych z BARCODE w produkcji obejmuje odczytywanie z przechowywanych dokumentów — faktur wysyłkowych, biletów cyfrowych, przesłanych obrazów i załączników PDF.

Podejście ZXing.Net.MAUI

ZXing.Net.MAUI to biblioteka do sterowania kamerą. Nie posiada API do odczytu kodów kreskowych ze ścieżek plików, tablic bajtów przekazywanych bezpośrednio z pamięci lub dokumentów PDF. Kontrolka CameraBarcodeReaderView wymaga żywego strumienia z aparatu; Nie ma metody statycznej, która przyjmuje ścieżkę do pliku i zwraca wyniki BARCODE. Zespoły, które muszą odczytywać BARCODES z przesłanych plików PDF, systemów zarządzania dokumentami lub kolejek przetwarzania obrazów w trybie wsadowym, nie mogą używać ZXing.Net.MAUI w tych scenariuszach i muszą wprowadzić oddzielną bibliotekę.

Podejście IronBarcode

IronBarcode odczytuje kody kreskowe z dowolnego źródła poprzez tę samą metodę BarcodeReader.Read(). Obsługuje ścieżki plików, tablice bajtów, strumienie i dokumenty PDF. Analiza plików PDF odbywa się natywnie —IronBarcode przetwarza strony PDF bezpośrednio, bez pośredniego etapu rasteryzacji:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");

// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
    var fileResults = BarcodeReader.Read(file.FullPath);
    foreach (var result in fileResults)
        ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
// NuGet: dotnet add package IronBarcode
using IronBarCode;

// Read barcodes from a PDF file
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}");

// Read from a user-selected file using MAUI FilePicker
var file = await FilePicker.PickAsync();
if (file != null)
{
    var fileResults = BarcodeReader.Read(file.FullPath);
    foreach (var result in fileResults)
        ResultLabel.Text += $"\n{result.Format}: {result.Value}";
}
Imports IronBarCode
Imports Microsoft.Maui.Storage

' Read barcodes from a PDF file
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
Next

' Read from a user-selected file using MAUI FilePicker
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
    Dim fileResults = BarcodeReader.Read(file.FullPath)
    For Each result In fileResults
        ResultLabel.Text &= $"\n{result.Format}: {result.Value}"
    Next
End If
$vbLabelText   $csharpLabel

Pełny proces odczytu kodów kreskowych z plików PDF, w tym dokumentów wielostronicowych i mieszanych formatów kodów kreskowych na różnych stronach, został opisany w przewodniku odczytu kodów kreskowych z plików PDF. Obejmuje to faktury wysyłkowe, bilety cyfrowe, przepływy pracy związane z zarządzaniem dokumentami oraz scenariusze przetwarzania wsadowego, których nie jest w stanie obsłużyć architektura oparta wyłącznie na kamerze, jaką jest ZXing.Net.MAUI.

Przewodnik po mapowaniu API

ZXing.Net.MAUI IronBarcode Uwagi
builder.UseBarcodeReader() Nie jest wymagane Usuń z MauiProgram.cs
xmlns:zxing="clr-namespace:ZXing.Net.Maui.Controls;..." Nie jest wymagane Usuń deklarację przestrzeni nazw XAML
<zxing:CameraBarcodeReaderView> Zamień z <Button> + MediaPicker Zmiana architektury
Options="{Binding ReaderOptions}" Nie jest wymagane Nie jest wymagany obiekt options
BarcodesDetected="OnBarcodesDetected" BarcodeReader.Read() wartość zwracana Wydarzenie → zwracana wartość metody
new BarcodeReaderOptions { Formats = BarcodeFormats.X \| ... } Nie jest wymagane Automatyczne wykrywanie zastępuje to
BarcodeDetectionEventArgs e IEnumerable<BarcodeResult> Różne modele dostarczania wyników
e.Results Wartość zwracana BarcodeReader.Read()
barcode.Value result.Value Ta sama nazwa właściwości
barcode.Format result.Format Ta sama nazwa właściwości
BarcodeFormats.QRCode BarcodeEncoding.QRCode Zmiana nazwy enum
BarcodeFormats.Code128 BarcodeEncoding.Code128 Zmiana nazwy enum
BarcodeFormats.Ean13 BarcodeEncoding.EAN13 Zmiana nazwy enum
CameraView.IsDetecting = false (OnDisappearing) Nie jest wymagane — usuń tę metodę IronBarcode jest bezstanowy
CameraView.IsDetecting = true (OnAppearing) Nie jest wymagane — usuń tę metodę IronBarcode jest bezstanowy
Brak API do wprowadzania plików BarcodeReader.Read("path/to/file.png") Nowa funkcja
Brak API PDF BarcodeReader.Read("document.pdf") Nowa funkcja

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

Kilka konkretnych scenariuszy skłania do rozważenia IronBarcode jako zamiennika ZXing.Net.MAUI. Są to warunki dotyczące poziomu projektu i produktu, a nie preferencje dotyczące wdrożenia.

Wymagania dotyczące Windows MAUI

Najczęstszym powodem ponownej oceny jest dodanie środowiska docelowegoWindows MAUIdo projektu, który początkowo był przeznaczony wyłącznie dla systemów iOS i Android. Zespoły MAUI często zaczynają od tworzenia aplikacji z priorytetem na urządzenia mobilne, a wraz z ewolucją wymagań rozszerzają się na platformy stacjonarne. Gdy dojdzie do tego rozszerzenia, ZXing.Net.MAUI nie zapewni dalszego rozwoju — platforma Windows nie jest zaimplementowana i nie znajduje się w publicznym planie rozwoju. Zespół musi albo zaakceptować fakt, że skanowanie BarCode nie będzie dostępne w systemie Windows, albo zastąpić bibliotekę. Ponieważ wymiana wiąże się z zmianą struktury wzorca skanowania, zespoły zazwyczaj wprowadzają tę zmianę jednocześnie na wszystkich platformach.

Kompatybilność ze sprzętem obecnej generacji

Problem z autofokusem iPhone 15 Pro (GitHub issue #260) to realne rozważenie dla każdego zespołu dostarczającego produkcyjny skaner kodów kreskowych dla użytkowników iOS. iPhone 15 Pro i Pro Max są powszechne w segmencie konsumenckim, który oczekuje wyrafinowanego doświadczenia aplikacji, a obejście, które wymaga od użytkowników dostosowanie ich odległości od kodu kreskowego, to zauważalny regres w UX w porównaniu z starszym sprzętem iPhone. Zespoły, które napotykają ten problem w QA lub otrzymują raporty wsparcia od użytkowników iPhone 15 Pro, stoją przed dylematem między pozostaniem przy bibliotece, gdzie nie ma obecnie dostępnego rozwiązania, a migracją do podejścia, które nie jest dotknięte modelem skupienia widoku kamery.

Przetwarzanie plików i dokumentów

Wymagania dotyczące skanowania BarCODE rzadko ograniczają się do przechwytywania obrazu na żywo z kamery. Aplikacje, które zaczynają jako skanery zapasów, często rozszerzają się o odczytywanie BARCODE-ów z przesłanych plików PDF, przetwarzanie faktur wysyłkowych lub obsługę biletów cyfrowych z załączników e-mailowych. ZXing.Net.MAUI nie posiada API dla żadnego z tych scenariuszy. Gdy w backlogu pojawia się wymaganie dotyczące odczytu BARCODE z pliku lub dokumentu, zespoły korzystające z ZXing.Net.MAUI muszą wprowadzić oddzielną bibliotekę, aby sobie z tym poradzić. Jeśli zespół już korzysta z IronBarcode w którymkolwiek z tych scenariuszy opartych na plikach, naturalnym kolejnym krokiem będzie konsolidacja skanowania kamerą MAUI w tej samej bibliotece IronBarcode.

Wymagania dotyczące stabilności produkcji

Oznaczenie przed wersją 1.0 w v0.7.4 - podczas gdy sam pakiet jest stabilnym wydaniem NuGet - niesie konsekwencje dla zespołów podlegających analizie kompozycji oprogramowania, audytom zależności lub wewnętrznym procesom zatwierdzania. Niektóre środowiska przedsiębiorstw wymagają, aby zależności produkcyjne miały stabilne wydanie 1.0+, komercyjną umowę wsparcia lub oba. ZXing.Net.MAUI jest utrzymywany przez społeczność i przed wersją 1.0, co pasuje do wewnętrznych narzędzi i prototypów, ale dodaje kroki przeglądu w aplikacjach skierowanych do klienta, gdzie skaner kodów kreskowych jest podstawowym przepływem pracy. Brak płatnego poziomu wsparcia oznacza, że każdy krytyczny błąd zależy od dostępności utrzymywacza społeczności.

Typowe kwestie związane z migracją

Zmiana strukturalna z ZXing.Net.MAUI na IronBarcode obejmuje trzy konkretne zamiany techniczne, które mają wpływ na każdy plik w kodzie źródłowym uczestniczący w skanowaniu kodów kreskowych.

Wzorzec CameraBarcodeReaderView do MediaPicker

Kontrolka XAML CameraBarcodeReaderView i jej deklaracja przestrzeni nazw xmlns:zxing są całkowicie usunięte. W każdym pliku XAML zawierającym widok skanera zastąpieniem jest kontrolka Button, która wywołuje MediaPicker.CapturePhotoAsync() w swoim obsłudze Clicked. Model oparty na zdarzeniach — gdzie wyniki trafiają przez BarcodesDetected — zostaje zastąpiony przez bezpośrednie odczytanie wartości zwracanej BarcodeReader.Read() w obsłudze async.

Wykrywanie usunięcia z cyklu życia

Każde nadpisanie OnAppearing i OnDisappearing służące wyłącznie do przełączania CameraView.IsDetecting można usunąć. Jeśli tamte nadpisania zawierają inną logikę cyklu życia strony, linie IsDetecting są usunięte, a pozostała logika jest zachowana. Nie ma ekwiwalentu IronBarcode do IsDetecting, ponieważ nie ma trwałego stanu aparatu do zarządzania między nawigacjami stroną.

Usunięcie rejestracji UseBarcodeReader()

ZXing.Net.MAUI wymaga jednokrotnego wywołania builder.UseBarcodeReader() w MauiProgram.cs, aby zarejestrować swoje usługi aparatów platformowych.IronBarcode nie wymaga żadnej rejestracji MauiProgram.cs. Linia UseBarcodeReader() jest usunięta, a import przestrzeni nazw using ZXing.Net.Maui;, który ją wspiera, jest usunięty wraz z odinstalowaniem pakietu.

Dodatkowe możliwości IronBarcode

Poza scenariuszami omówionymi w tym porównaniu,IronBarcode zapewnia funkcjonalność kodów kreskowych, która znacznie wykracza poza to, co może zaoferować oparty na kamerze element sterujący MAUI:

  • Skanowanie kodów kreskowych na iOS: Pełne wsparcie MAUI na iOS korzystające z tego samego wzorca MediaPicker + BarcodeReader.Read() — brak zarządzania aparatem specyficznego dla platformy, brak list formatów, brak szablonów cyklu życia.
  • Skanowanie BarCode na Androidzie: skanowanie MAUI na Androidzie za pośrednictwem tego samego ujednoliconego interfejsu API, bez problemów z przypisaniem zależności Camera 1.5.0 występujących w ZXing.Net.MAUI.
  • Generowanie kodów kreskowych: Generuje kody QR, Code128, EAN-13, PDF417, Data Matrix oraz wszystkie główne formaty w postaci obrazów z możliwością konfiguracji rozmiaru, koloru, strefy ciszy i poziomu korekcji błędów.
  • Przetwarzanie wsadowe: odczytuje wszystkie kody kreskowe ze wszystkich stron wielostronicowego pliku PDF lub katalogu obrazów w ramach jednego wywołania, zwracając metadane dotyczące numeru strony wraz z każdym wynikiem.
  • Wdrożenie po stronie serwera: Ten sam pakiet NuGet i to samo wywołanie BarcodeReader.Read() działa w punktach końcowych ASP.NET Core, funkcjach Azure i kontenerach Docker — jeden pakiet obejmuje zarówno klienta mobilnego, jak i zaplecze serwera.
  • Odzyskiwanie uszkodzonych kodów kreskowych: Modele uczenia maszynowego odzyskują kody kreskowe z fizycznie uszkodzonych etykiet, wydruków o niskim kontraście oraz obrazów zarejestrowanych pod niekorzystnym kątem, których standardowe dekodery oparte na progach nie są w stanie przetworzyć.
  • Generowanie stylizowanych BarCodes: Generuje BarCodes z niestandardowymi kolorami, osadzonymi logo, zaokrąglonymi narożnikami i tekstem adnotacji — wykraczając poza zwykły monochromatyczny wynik dostępny za pośrednictwem ZXing.Net.

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

IronBarcode jest aktywnie rozwijany i regularnie aktualizowany pod kątem najnowszych wersji .NET. Biblioteka obsługuje .NET 8, .NET 9 i śledzi kolejne wydania .NET. Obsługuje również .NET Framework 4.6.2 i nowsze dla środowisk aplikacyjnych starszych. ZXing.Net.MAUI, jako pakiet przed wersją 1.0 zarządzany przez społeczność, nie ma formalnych zobowiązań dotyczących harmonogramów wsparcia dla wersji .NET. W przypadku projektów MAUI — które są powiązane z cyklem wydawniczym platformy .NET — dostępność aktywnie utrzymywanej biblioteki z komercyjnym wsparciem, która śledzi każdą wersję .NET, ma znaczenie dla długoterminowego planowania.

Wnioski

ZXing.Net.MAUI i IronBarcode to różne rozwiązania tego samego problemu — odczytu kodów kreskowych w aplikacji .NET MAUI — ale opierają się na różnych założeniach architektonicznych. ZXing.Net.MAUI osadza podgląd z kamery na żywo bezpośrednio na stronie XAML, działając jako stały element sterujący kamerą, który wyzwala zdarzenia w miarę analizowania klatek.IronBarcode traktuje aparat jako urządzenie przechwytujące dostępne przez system MediaPicker, przetwarzanie statycznego obrazu po przechwyceniu zamiast strumienia ciągłego. Ta różnica w podejściu determinuje niemal wszystko inne: zasięg platformy, złożoność cyklu życia, obsługę formatów oraz zakres wdrożenia.

ZXing.Net.MAUI jest naprawdę odpowiednie dla określonych profili projektowych: aplikacje iOS i Android, prototypy i narzędzia wewnętrzne, zespoły, które znają swoje formaty kodów kreskowych z góry, projekty bez wymogu skanowaniaWindows MAUIi sytuacje, w których decydującym czynnikiem jest bezpłatna licencja MIT. W przypadku skanera magazynowego na stałym zestawie urządzeń z systemem Android, skanującego etykiety Code128, ZXing.Net.MAUI będzie działać poprawnie. Status przed wersją 1.0, problem iPhone 15 Pro i szablony cyklu życia są rzeczywistymi kompromisami, które są warte zaakceptowania w odpowiednim kontekście.

IronBarcode jest odpowiednim rozwiązaniem, gdy zakres projektu jest szerszy: cele MAUI w systemach Windows lub macOS, nieznane lub zmienne formaty kodów kreskowych z systemów zewnętrznych, wymagania obejmujące odczyt kodów kreskowych z plików PDF lub przesłanych plików, potrzeby w zakresie stabilności na poziomie produkcyjnym lub przetwarzanie kodów kreskowych po stronie serwera oprócz skanowania mobilnego. Licencja komercyjna to inwestycja, która obejmuje wsparcie techniczne, konserwację i aktualizacje zapewniające zgodność z różnymi wersjami .NET. Bezstanowe API eliminuje kategorię błędów — wycieki zasobów kamery, błędy stanu cyklu życia — które w ZXing.Net.MAUI programiści muszą zapobiegać ręcznie.

Szczera ocena jest taka, że żadna z bibliotek nie jest uniwersalnie poprawna. ZXing.Net.MAUI zasługuje na miano pierwszej biblioteki, z której korzysta większość programistów MAUI, ponieważ jest bezpłatna, znana i szybka w integracji. Problemy, które się z tym wiążą, są realne, ale mają znaczenie tylko w określonych warunkach projektowych. Gdy występują takie warunki — wymagania systemu Windows, sprzęt iPhone'a obecnej generacji, skanowanie oparte na plikach lub standardy stabilności produkcji —IronBarcode spełnia je wszystkie. Wybór zależy od tego, czy konkretne ograniczenia projektu plasują go w ramach scenariuszy, w których znane ograniczenia ZXing.Net.MAUI stają się przeszkodami, czy też poza nimi.

Często Zadawane Pytania

Czym jest ZXing.Net.MAUI?

ZXing.Net.MAUI jest biblioteką kodów kreskowych .NET do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest to jedna z kilku alternatyw, które developery rozważają przy wyborze rozwiązania kodów kreskowych dla projektów .NET.

Jakie są główne różnice między ZXing.Net.MAUI a IronBarcode?

IronBarcode używa statycznego, bezstanowego API, które nie wymaga zarządzania instancjami, podczas gdy ZXing.Net.MAUI zazwyczaj wymaga stworzenia i konfiguracji instancji przed użyciem. IronBarcode zapewnia także natywne wsparcie PDF, automatyczne wykrywanie formatu i licencjonowanie jednego klucza we wszystkich środowiskach.

Czy IronBarcode jest łatwiejszy do licencjonowania niż ZXing.Net.MAUI?

IronBarcode wykorzystuje pojedynczy klucz licencyjny obejmujący zarówno wdrożenia deweloperskie, jak i produkcyjne. Upraszcza to procesy CI/CD oraz konfiguracje Docker w porównaniu z systemami licencyjnymi, które oddzielają klucze SDK od kluczy środowiska uruchomieniowego.

Czy IronBarcode obsługuje wszystkie formaty kodów kreskowych, które obsługuje ZXing.Net.MAUI?

IronBarcode obsługuje ponad 30 symboli kodów kreskowych, w tym QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 i wiele innych. Automatyczne wykrywanie formatu oznacza, że nie jest wymagane jawne wyliczanie formatów.

Czy IronBarcode obsługuje natywne odczytywanie kodów kreskowych z plików PDF?

Tak. IronBarcode odczytuje kody kreskowe bezpośrednio z plików PDF za pomocą BarcodeReader.Read("document.pdf") bez konieczności korzystania z oddzielnej biblioteki do renderowania plików PDF. Wyniki dla każdej strony obejmują numer strony, format kodu kreskowego, wartość oraz wskaźnik pewności.

Jak IronBarcode porównuje się z ZXing.Net.MAUI w zakresie przetwarzania wsadowego?

Metody statyczne IronBarcode są bezstanowe i z natury bezpieczne dla wątków, co umożliwia bezpośrednie użycie Parallel.ForEach bez zarządzania instancjami dla poszczególnych wątków. Nie ma ograniczeń przepustowości w żadnym przedziale cenowym.

Jakie wersje .NET obsługuje IronBarcode?

IronBarcode obsługuje .NET Framework 4.6.2+, .NET Core 3.1 oraz .NET 5, 6, 7, 8 i 9 w jednym pakiecie NuGet. Obsługiwane platformy to Windows x64/x86, Linux x64 oraz macOS x64/ARM.

Jak zainstalować IronBarcode w projekcie .NET?

Zainstaluj IronBarcode za pomocą NuGet: uruchom polecenie „Install-Package IronBarCode” w konsoli menedżera pakietów lub „dotnet add package IronBarCode” w interfejsie CLI. Nie są wymagane żadne dodatkowe instalatory SDK ani pliki uruchomieniowe.

Czy mogę ocenić IronBarcode przed zakupem, w przeciwieństwie do ZXing.Net.MAUI?

Tak. Tryb próbny IronBarcode zwraca pełne, zdekodowane wartości BarCode — tylko wygenerowane obrazy wyjściowe są opatrzone znakiem wodnym. Przed podjęciem decyzji o zakupie można sprawdzić dokładność odczytu na własnych dokumentach.

Jaka jest różnica w cenie między ZXing.Net.MAUI a IronBarcode?

Cena IronBarcode zaczyna się od 749 USD za Licencję wieczystą dla jednego programisty, obejmującą etapy rozwoju i produkcji. Szczegóły dotyczące cen i opcji zakupu hurtowego są dostępne na stronie licencyjnej IronBarcode. Nie ma wymogu posiadania oddzielnej licencji na środowisko uruchomieniowe.

Czy migracja z ZXing.Net.MAUI do IronBarcode jest prosta?

Migracja z ZXing.Net.MAUI do IronBarcode polega głównie na zastąpieniu wywołań API opartych na instancjach metodami statycznymi IronBarcode, usunięciu szablonów licencyjnych i aktualizacji nazw własności wyników. Większość migracji polega na redukcji kodu, zamiast jego zwiększania.

Czy IronBarcode generuje kody QR z logo?

Tak. Funkcja QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") osadza obraz marki w kodzie QR w sposób natywny z konfigurowalną korekcją błędów. Kolorowe kody QR są również obsługiwane za pomocą funkcji ChangeBarCodeColor().

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