Jak zbudować skaner kodów kreskowych MAUI w C#?
IronBarcode pozwala skanować kody kreskowe bezpośrednio z plików graficznych w aplikacji .NET MAUI — bez strumienia z kamery, bez konfiguracji sterowników i bez pętli uprawnień specyficznych dla platformy.
Możesz skanować BARCODES z plików JPEG, PNG, GIF, TIFF i BMP za pomocą jednego wywołania metody. Ten sam kod działa na systemach Windows, Android i iOS bez konieczności modyfikacji. Zacznij od bezpłatnej wersji próbnej, aby śledzić poniższe przykłady kodu.
Jak utworzyć projekt .NET MAUI do skanowania BarCodeów?
Konfiguracja projektu .NET MAUI w Visual Studio jest prosta. Uruchom program Visual Studio 2022 lub nowszą wersję, wybierz opcję Utwórz nowy projekt, wybierz szablon aplikacji .NET MAUI, wprowadź nazwę projektu i wybierz platformy docelowe. Ten sam projekt działa na systemach Android i iOS, jednak niniejszy samouczek skupia się na wdrożeniu w systemie Windows. .NET MAUI to wielopłatformowy framework firmy Microsoft służący do tworzenia natywnych aplikacji mobilnych i desktopowych w językach C# i XAML na podstawie jednej wspólnej bazy kodu.
W przeciwieństwie do rozwiązań opartych na kamerach, takich jak ZXing.Net.MAUI, które wymagają CameraView konfiguracji sterowania i MauiProgram.cs rejestracji, IronBarcode nie wymaga żadnej specjalnej konfiguracji. Twój MauiProgram.cs pozostaje w domyślnym stanie szablonu. Dzięki temu kod Twojego startupu będzie wolny od rejestracji handlerów stron trzecich i zmniejszy się obszar podatny na błędy inicjalizacji w momencie uruchomienia.
Aby zainstalować IronBarcode, uruchom to polecenie w konsoli menedżera pakietów:
Install-Package BarCode
Install-Package BarCode
Ten pojedynczy pakiet zapewnia skanowanie kodów kreskowych, rozpoznawanie kodów QR, wykrywanie wielu kodów kreskowych oraz generowanie kodów kreskowych. Nie są wymagańe żadne dodatkowe zależności.
Aby aktywować IronBarcode w środowisku produkcyjnym, ustaw swój klucz licencyjny w App.xaml.cs lub MauiProgram.cs:
IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY";
IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY"
Klucz można uzyskać na stronie licencyjnej IronBarcode lub rozpocząć korzystanie z bezpłatnej licencji próbnej.
Czym różnią się uprawnienia w przypadku skanowania opartego na obrazach?
Tradycyjne skanery BarCode oparte na kamerach wymagają wyraźnych uprawnień w manifestach platformy. W systemie Android dodajesz do AndroidManifest.xml:
<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
W systemie iOS deklaruje się NSCameraUsageDescription w Info.plist. Obsługa odmowy uprawnień w czasie wykonywania powoduje dodanie ścieżek błędów, które łatwo przeoczyć.
Ponieważ IronBarcode odczytuje dane ze strumienia plików, a nie z podglądu kamery, potrzebny jest jedynie dostęp do systemu plików. W systemie Windows jest to zapewnione automatycznie. W systemach Android i iOS FilePicker obsługuje zgodę użytkownika, gdy wybiera on obraz — nie są wymagańe ręczne prośby o pozwolenie.
Który interfejs XAML najlepiej sprawdza się w skanerze BarCode MAUI?
Minimalny interfejs — przycisk wyboru obrazu, obszar wyświetlania obrazu i etykieta wyników — obejmuje większość scenariuszy skanowania kodów kreskowych. Poniższy kod XAML tworzy ten układ dla .NET MAUI ContentPage:
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="BarcodeScanner.MainPage">
<ScrollView>
<VerticalStackLayout Spacing="20" Padding="30">
<Label Text="MAUI Barcode Scanner"
FontSize="24"
HorizontalOptions="Center" />
<Button x:Name="SelectImageBtn"
Text="Select Image File"
Clicked="OnSelectImage" />
<Image x:Name="SelectedImageDisplay"
HeightRequest="250" />
<Label x:Name="ResultsLabel"
Text="Barcode results will appear here" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="BarcodeScanner.MainPage">
<ScrollView>
<VerticalStackLayout Spacing="20" Padding="30">
<Label Text="MAUI Barcode Scanner"
FontSize="24"
HorizontalOptions="Center" />
<Button x:Name="SelectImageBtn"
Text="Select Image File"
Clicked="OnSelectImage" />
<Image x:Name="SelectedImageDisplay"
HeightRequest="250" />
<Label x:Name="ResultsLabel"
Text="Barcode results will appear here" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
Układ zawiera przycisk uruchamiający selektor plików, obszar wyświetlania wybranego obrazu oraz etykietę z odkodowanymi wartościami BarCode. Wyświetla się poprawnie na wszystkich platformach docelowych .NET MAUI bez konieczności dostosowywania do konkretnej platformy.
W przypadku aplikacji produkcyjnych warto rozważyć zastąpienie ResultsLabel przez CollectionView, aby wyświetlać wiele wyników skanowania BARCODE na przewijanej liście, zwłaszcza podczas skanowania dokumentów zawierających więcej niż jeden BARCODE.
Jak skanować BarCodes z plików graficznych w .NET MAUI?
Kod źródłowy w MainPage.xaml.cs obsługuje wybór obrazów i odczyt BARCODE-ów. BarcodeReader.Read przyjmuje ścieżkę do pliku i zwraca kolekcję BarcodeResults. Każdy element w kolekcji zawiera BARCODE Value, BarcodeType oraz współrzędne pozycji.
Oto pełna implementacja:
using IronBarCode;
namespace BarcodeScanner;
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private async void OnSelectImage(object sender, EventArgs e)
{
try
{
// Open the system file picker filtered to image types
var result = await FilePicker.PickAsync(new PickOptions
{
FileTypes = FilePickerFileType.Images,
PickerTitle = "Select a barcode image"
});
if (result != null)
{
// Display the selected image in the UI
var stream = await result.OpenReadAsync();
SelectedImageDisplay.Source = ImageSource.FromStream(() => stream);
// Decode all barcodes found in the image
var barcodes = BarcodeReader.Read(result.FullPath);
if (barcodes.Count > 0)
{
// Build a display string listing each barcode type and value
string output = string.Join("\n",
barcodes.Select(b => $"{b.BarcodeType}: {b.Value}"));
ResultsLabel.Text = output;
}
else
{
ResultsLabel.Text = "No barcodes detected in image";
}
}
}
catch (Exception ex)
{
ResultsLabel.Text = $"Error: {ex.Message}";
}
}
}
using IronBarCode;
namespace BarcodeScanner;
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private async void OnSelectImage(object sender, EventArgs e)
{
try
{
// Open the system file picker filtered to image types
var result = await FilePicker.PickAsync(new PickOptions
{
FileTypes = FilePickerFileType.Images,
PickerTitle = "Select a barcode image"
});
if (result != null)
{
// Display the selected image in the UI
var stream = await result.OpenReadAsync();
SelectedImageDisplay.Source = ImageSource.FromStream(() => stream);
// Decode all barcodes found in the image
var barcodes = BarcodeReader.Read(result.FullPath);
if (barcodes.Count > 0)
{
// Build a display string listing each barcode type and value
string output = string.Join("\n",
barcodes.Select(b => $"{b.BarcodeType}: {b.Value}"));
ResultsLabel.Text = output;
}
else
{
ResultsLabel.Text = "No barcodes detected in image";
}
}
}
catch (Exception ex)
{
ResultsLabel.Text = $"Error: {ex.Message}";
}
}
}
Imports IronBarCode
Namespace BarcodeScanner
Public Partial Class MainPage
Inherits ContentPage
Public Sub New()
InitializeComponent()
End Sub
Private Async Sub OnSelectImage(sender As Object, e As EventArgs)
Try
' Open the system file picker filtered to image types
Dim result = Await FilePicker.PickAsync(New PickOptions With {
.FileTypes = FilePickerFileType.Images,
.PickerTitle = "Select a barcode image"
})
If result IsNot Nothing Then
' Display the selected image in the UI
Dim stream = Await result.OpenReadAsync()
SelectedImageDisplay.Source = ImageSource.FromStream(Function() stream)
' Decode all barcodes found in the image
Dim barcodes = BarcodeReader.Read(result.FullPath)
If barcodes.Count > 0 Then
' Build a display string listing each barcode type and value
Dim output As String = String.Join(vbCrLf, barcodes.Select(Function(b) $"{b.BarcodeType}: {b.Value}"))
ResultsLabel.Text = output
Else
ResultsLabel.Text = "No barcodes detected in image"
End If
End If
Catch ex As Exception
ResultsLabel.Text = $"Error: {ex.Message}"
End Try
End Sub
End Class
End Namespace
BarcodeReader.Read przetwarza plik znajdujący się w podanej ścieżce, automatycznie wykrywa wszystkie obecne symbole BarCode i natychmiast zwraca wyniki. Metoda obsługuje wszystkie główne formaty BARCODE 1D i 2D, w tym Code 128, Code 39, QR Code, Data Matrix, PDF417 i EAN-13.

Wywołanie FilePicker.PickAsync ogranicza wybór do typów obrazów, dzięki czemu użytkownicy nie mogą przypadkowo wybrać plików innych niż obrazy. Jeśli result jest null, użytkownik anulował — strażnik if (result != null) obsługuje to w sposób cichy.
Jak wyświetlić wyniki skanowania w oknie dialogowym?
W przypadku krótkich komunikatów potwierdzających DisplayAlert udostępnia okno dialogowe modalne bez konieczności stosowania dodatkowych elementów interfejsu użytkownika:
private async void ShowScanSummary(BarcodeResults barcodes)
{
if (barcodes.Count > 0)
{
// Inform the user how many barcodes were detected
string message = $"Found {barcodes.Count} barcode(s) in the image.";
await DisplayAlert("Scan Complete", message, "OK");
}
else
{
await DisplayAlert("No Results", "No barcodes were found in the image.", "OK");
}
}
private async void ShowScanSummary(BarcodeResults barcodes)
{
if (barcodes.Count > 0)
{
// Inform the user how many barcodes were detected
string message = $"Found {barcodes.Count} barcode(s) in the image.";
await DisplayAlert("Scan Complete", message, "OK");
}
else
{
await DisplayAlert("No Results", "No barcodes were found in the image.", "OK");
}
}
Private Async Sub ShowScanSummary(barcodes As BarcodeResults)
If barcodes.Count > 0 Then
' Inform the user how many barcodes were detected
Dim message As String = $"Found {barcodes.Count} barcode(s) in the image."
Await DisplayAlert("Scan Complete", message, "OK")
Else
Await DisplayAlert("No Results", "No barcodes were found in the image.", "OK")
End If
End Sub
Ten wzorzec sprawdza się dobrze w przypadku prostych procesów potwierdzania. W przypadku aplikacji, które muszą działać na odkodowanych wartościach — na przykład wyszukiwanie produktu na podstawie kodu BarCode w systemie zarządzania zapasami opartym na kodach BarCode — należy przekazać kolekcję barcodes do warstwy logiki biznesowej bezpośrednio z obsługi OnSelectImage.
Jak skanować wiele BarCodes i dostosować szybkość wykrywania?
Gdy obraz zawiera kilka kodów kreskowych, IronBarcode domyślnie wykrywa je wszystkie. Aby uzyskać lepszą wydajność, gdy znasz oczekiwane formaty, skonfiguruj BarcodeReaderOptions przed wywołaniem BarcodeReader.Read:
using IronBarCode;
// Target only QR codes and Code 128 for faster detection
var options = new BarcodeReaderOptions
{
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
Speed = ReadingSpeed.Balanced
};
var barcodes = BarcodeReader.Read(imagePath, options);
foreach (var barcode in barcodes)
{
Console.WriteLine($"Type: {barcode.BarcodeType} | Value: {barcode.Value}");
}
using IronBarCode;
// Target only QR codes and Code 128 for faster detection
var options = new BarcodeReaderOptions
{
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
Speed = ReadingSpeed.Balanced
};
var barcodes = BarcodeReader.Read(imagePath, options);
foreach (var barcode in barcodes)
{
Console.WriteLine($"Type: {barcode.BarcodeType} | Value: {barcode.Value}");
}
Imports IronBarCode
' Target only QR codes and Code 128 for faster detection
Dim options As New BarcodeReaderOptions With {
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128,
.Speed = ReadingSpeed.Balanced
}
Dim barcodes = BarcodeReader.Read(imagePath, options)
For Each barcode In barcodes
Console.WriteLine($"Type: {barcode.BarcodeType} | Value: {barcode.Value}")
Next

Właściwość ExpectBarcodeTypes ogranicza działanie silnika wykrywania do określonych symboli. Ustawienie Speed na ReadingSpeed.Faster nadaje się do obrazów o wysokim kontraście i bez zniekształceń. ReadingSpeed.Detailed stosuje dodatkowe etapy korekcji obrazu i obsługuje obrót, przekrzywienie oraz dane wejściowe o niskiej rozdzielczości kosztem dodatkowego czasu przetwarzania.
ExpectMultipleBarcodes = true informuje czytelnika, aby kontynuował skanowanie po pierwszym dopasowaniu, zamiast kończyć przedwcześnie. W scenariuszach z jednym kodem BarCode pominięcie tej opcji skraca czas każdego skanowania o kilka milisekund.
Taka konfiguracja sprawia, że skaner nadaje się do szerokiego zakresu zastosowań: aplikacji detalicznej odczytującej kody BarCode produktów, narzędzia magazynowego przetwarzającego wydrukowane etykiety z kodami BarCode na zdjęciach przesyłek lub systemu obiegu dokumentów wyodrębniającego kody QR z przesłanych faktur.
Jak radzisz sobie z trudnymi lub niskiej jakości obrazami?
Obrazy produkcyjne rzadko są idealne. Zdjęcia magazynowe wykonane w ostrym świetle, zrzuty ekranu z klientów poczty elektronicznej i zeskanowane dokumenty zawierają szumy, artefakty kompresji i zniekształcenia geometryczne. IronBarcode udostępnia ImageFilterCollection do wstępnego przetwarzania obrazów przed dekodowaniem:
using IronBarCode;
using IronSoftware.Drawing;
// Apply corrections for a low-quality warehouse photo
var options = new BarcodeReaderOptions
{
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter(1.2f),
new DenoiseFilter()
},
Speed = ReadingSpeed.Detailed
};
var barcodes = BarcodeReader.Read(imagePath, options);
using IronBarCode;
using IronSoftware.Drawing;
// Apply corrections for a low-quality warehouse photo
var options = new BarcodeReaderOptions
{
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter(1.2f),
new DenoiseFilter()
},
Speed = ReadingSpeed.Detailed
};
var barcodes = BarcodeReader.Read(imagePath, options);
Imports IronBarCode
Imports IronSoftware.Drawing
' Apply corrections for a low-quality warehouse photo
Dim options As New BarcodeReaderOptions With {
.ImageFilters = New ImageFilterCollection From {
New SharpenFilter(),
New ContrastFilter(1.2F),
New DenoiseFilter()
},
.Speed = ReadingSpeed.Detailed
}
Dim barcodes = BarcodeReader.Read(imagePath, options)
SharpenFilter odzyskuje definicję krawędzi ze skompresowanych lub nieostrych zrzutów ekranu. ContrastFilter pomaga w przypadku nierównomiernego oświetlenia. DenoiseFilter redukuje plamki z skanów o niskiej rozdzielczości. Połączenie tych filtrów z ReadingSpeed.Detailed pozwala zmaksymalizować szybkość czytania trudnych materiałów.
W przypadku aplikacji .NET MAUI, które akceptują obrazy przesłane przez użytkowników z różnych źródeł, zastosowanie domyślnie konserwatywnego zestawu filtrów i przejście do bardziej agresywnej korekty przy drugiej próbie poprawia komfort użytkowania bez powodowania widocznego opóźnienia w typowych przypadkach. Można również przekazać Uri lub byte[] bezpośrednio do BarcodeReader.Read, co jest przydatne, gdy obraz pochodzi z odpowiedzi sieciowej, a nie z systemu plików. Dodatkowe przykłady źródeł danych można znaleźć w poradnikach IronBarcode.
Dłączego skanowanie oparte na obrazach nadaje się do aplikacji .NET MAUI?
Skanowanie na żywo za pomocą kamery poprzez kontrolkę CameraView wymaga przyznania uprawnień specyficznych dla platformy, zarządzania cyklem życia podglądu kamery oraz obsługi zdarzeń związanych z ustawianiem ostrości. W systemie iOS oznacza to również skonfigurowanie AVCaptureSession; na Androidzie, CameraX. Każda platforma ma swoje własne tryby awarii.
Skanowanie oparte na obrazach eliminuje tę kategorię obaw. Dokumentacja API IronBarcode pokazuje, że BarcodeReader.Read akceptuje ścieżkę do pliku, Stream, Bitmap lub byte[] — dowolną reprezentację, jaką może wygenerować Twoja aplikacja MAUI. Oznacza to, że ta sama logika skanowania działa niezależnie od tego, czy obraz pochodzi z FilePicker, pobrania z sieci, strony PDF renderowanej do bitmapy, czy załącznika do wiadomości e-mail.
Zużycie baterii jest mniejsze, ponieważ sprzęt aparatu pozostaje wyłączony. W podglądzie na żywo nie występuje migotanie interfejsu użytkownika i nie ma potrzeby zarządzania zdarzeniami cyklu życia kamery podczas zawieszania i wznawiania działania aplikacji. Na tabletach i komputerach stacjonarnych — gdzie podgląd na żywo z kamery rzadko jest odpowiedni — dekodowanie oparte na obrazach jest naturalnym domyślnym rozwiązaniem, a nie kompromisem. Użytkownicy mogą otwierać pliki z pamięci w chmurze, lokalnych folderów lub galerii zdjęć za pomocą tego samego wywołania FilePicker, niezależnie od typu urządzenia.
W przypadku procesów, w których użytkownicy fotografują etykiety z kodami kreskowymi i przesyłają je — co jest powszechne w aplikacjach internetowych ASP.NET wykorzystujących skanery BarCode — to samo wywołanie BarcodeReader.Read działa zarówno na kliencie mobilnym, jak i na serwerze, eliminując potrzebę utrzymywania dwóch implementacji skanowania.
Czym różni się IronBarcode od ZXing.Net.MAUI?
ZXing.Net.MAUI jest przeznaczony do skanowania na żywo z kamery i sprawdza się dobrze, gdy wymagańe jest wyświetlanie podglądu w czasie rzeczywistym. Wymaga integracji CameraView, rejestracji obsługi platformy oraz żądań uprawnień w czasie wykonywania.
IronBarcode obsługuje dekodowanie oparte na plikach i strumieniach, co obejmuje większość procesów obiegu dokumentów w Enterprise. Obsługuje szerszy zakres symboli, w tym PDF417, Data Matrix i Code 128, oraz zapewnia wstępne przetwarzanie obrazu za pomocą filtrów, czego nie oferuje ZXing. W przypadku aplikacji, w których użytkownicy przechwytują lub przesyłają obrazy zamiast skanować przedmioty na żywo, bardziej odpowiednim rozwiązaniem jest IronBarcode.
Jeśli Twoja aplikacja wymaga skanowania na żywo z kamery oprócz dekodowania plików, możesz połączyć obie biblioteki: ZXing.Net.MAUI do obsługi wizjera oraz bibliotekę IronBarcode for .NET do przetwarzania plików w trybie wsadowym.
Jakie są Twoje kolejne kroki?
Stworzenie skanera kodów kreskowych .NET MAUI za pomocą IronBarcode zajmuje mniej niż 30 linii kodu C#. Podejście oparte na plikach graficznych pozwala uniknąć w kodzie MAUI logiki związanej z uprawnieniami kamery oraz inicjalizacji specyficznej dla platformy, a to samo wywołanie skanowania działa identycznie w systemach Windows, Android i iOS.
Dokumentacja API IronBarcode obejmuje dodatkowe możliwości: odczytywanie kodów kreskowych z dokumentów PDF, przetwarzanie wsadowe wielu obrazów, pisanie niestandardowych filtrów obrazów oraz generowanie kodów kreskowych równolegle z ich odczytywaniem. Przegląd funkcji zawiera listę wszystkich obsługiwanych symboli i formatów.
Rozpocznij bezpłatny okres próbny, aby przetestować IronBarcode w swoim projekcie, lub zakup licencję, gdy będziesz gotowy do wdrożenia produkcyjnego.
Często Zadawane Pytania
Jak stworzyć skaner BarCode w .NET MAUI bez kamery?
Zainstaluj IronBarcode za pomocą NuGet (`Install-Package BarCode`), a następnie wywołaj `BarcodeReader.Read(filePath)` ze ścieżką uzyskaną z `FilePicker.PickAsync`. Nie są wymagane żadne uprawnienia do kamery ani konfiguracja `CameraView`.
Czy IronBarcode może skanować kody kreskowe na Androidzie i iOS w .NET MAUI?
Tak. To samo wywołanie `BarcodeReader.Read` działa w systemach Windows, Android i iOS bez żadnych ścieżek kodu specyficznych dla platformy ani zmian w manifeście.
Jakie formaty obrazów obsługuje IronBarcode do skanowania kodów kreskowych?
IronBarcode odczytuje BarCodes z plików JPEG, PNG, GIF, TIFF i BMP. Obsługuje również dane wejściowe typu `Stream`, `Bitmap` i `byte[]`, dzięki czemu obrazy z odpowiedzi sieciowych działają bez konieczności uprzedniego zapisywania na dysku.
Jak skanować wiele BarCodes z jednego obrazu w .NET MAUI?
Ustaw `ExpectMultipleBarCodes = true` w `BarcodeReaderOptions` i przekaż opcje do `BarcodeReader.Read`. Czytnik zwraca wszystkie wykryte kody kreskowe w jednej kolekcji `BarcodeResults`.
Jaka jest różnica między IronBarcode a ZXing.Net.MAUI?
ZXing.Net.MAUI obsługuje skanowanie na żywo za pomocą kontrolki `CameraView`. IronBarcode obsługuje dekodowanie plików i strumieni, wspiera więcej symboli (w tym PDF417 i Data Matrix) oraz zapewnia wstępne przetwarzanie obrazu dla danych wejściowych o niskiej jakości.
Jak poprawić wykrywanie BarCode na rozmytych lub niskiej jakości obrazach?
Dodaj `ImageFilterCollection` do `BarcodeReaderOptions` z `SharpenFilter`, `ContrastFilter` i `DenoiseFilter`, a następnie ustaw `Speed = ReadingSpeed.Detailed`. Spowoduje to zastosowanie korekcji obrazu przed etapem dekodowania.
Jakie formaty kodów kreskowych obsługuje IronBarcode w .NET MAUI?
IronBarcode obsługuje wszystkie główne symbole 1D i 2D: Code 128, Code 39, QR Code, Data Matrix, PDF417, EAN-13, EAN-8, UPC-A, UPC-E, Aztec i inne. Pełna lista znajduje się na stronie funkcji IronBarcode.




