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

Jaką bibliotekę kodów kreskowych C# powinieneś użyć do rozwoju .NET?

Kazdy programista, ktory uzywal Aspose.BarCode, napisal jakas wersje tego wiersza: new BarCodeReader(path, DecodeType.Code128). Działa to dobrze, gdy wiadomo, jaki format ma obraz. Gdy tego nie robisz — gdy dokument pochodzi z zewnetrznego systemu, dostawcy, ktory zmienil format etykiety, lub przesylki uzytkownika — zgadujesz liste typow dekodowania lub siegasz po DecodeType.AllSupportedTypes, co zazwyczaj jest wolniejsze wedlug wskazowek samego Aspose. Wymóg dotyczący specyfikacji formatu nie jest przeszkodą nie do pokonania, ale stanowi codzienne utrudnienie, które kumuluje się podczas każdej operacji odczytu w kodzie źródłowym.

Kwestia pliku PDF to kwestia budżetu. Jeśli przetwarzasz kody kreskowe z dokumentów PDF, Aspose.BarCode nie poradzi sobie z tym samodzielnie. Potrzebujesz Aspose.PDF dla .NET, aby najpierw renderować strony na obrazy. Aspose.PDF to oddzielny produkt subskrypcyjny oprócz tego, co już płacisz za Aspose.BarCode. Dwie subskrypcje dla procesu, który większość programistów postrzega jako jedno zadanie.

IronBarcode automatycznie wykrywa format kodów kreskowych, natywnie odczytuje pliki PDF w jednym pakiecie i oferuje Licencję wieczystą w cenie od 749 USD. Niniejsze porównanie szczegółowo analizuje obie biblioteki, aby umożliwić podjęcie świadomej decyzji.

Zrozumienie Aspose.BarCode

Aspose od lat tworzy biblioteki do przetwarzania dokumentów dla platform .NET, Java i innych. Aspose.BarCode jest jednym z wielu produktów z tej rodziny, obok Aspose.Words, Aspose.Cells, Aspose.PDF, Aspose.Slides i kilkunastu innych. Dla zespołów, które już płacą za Aspose.Total — pakiet zawierający wszystkie produkty Aspose — Aspose.BarCode jest dostępny bez dodatkowych kosztów. Dla zespołów, które potrzebują tylko biblioteki kodów kreskowych, model subskrypcji jest trudniejszy do uzasadnienia.

Aspose.BarCode obsługuje ponad 80 symbologii kodów kreskowych, jedną z najpełniejszych list formatów w każdej komercyjnej bibliotece kodów kreskowych .NET. Ta wszechstronność jest największym atutem biblioteki. Powierzchnia API jest odpowiednio duża, a szczegółowość API rośnie wraz z liczbą funkcji. Generowanie podstawowego kodu kreskowego Code 128 wymaga zainstancjonowania BarcodeGenerator, ustawienia XDimension, BarHeight i innych parametrow, a nastepnie wywolania Save z jawna argumentacja formatu. Odczyt wymaga okreslenia, ktore typy dekodowania maja byc przeszukane, a nastepnie iteracji wynikow zwracanych przez ReadBarCodes(). Obie operacje działają poprawnie — są po prostu bardziej rozbudowane niż to konieczne.

Kluczowe cechy architektury Aspose.BarCode:

  • Model odczytu zaleznosci od formatu: Kazda operacja odczytu wymaga jawnego okreslenia DecodeType. Domyslny DecodeType.AllSupportedTypes jest zazwyczaj wolniejszy niz docelowa lista, poniewaz dekoder przeprowadza przeszukiwanie sequentialne wszystkich znanych symbologii.
  • API oparte na instancji: Zarowno BarCodeReader jak i BarcodeGenerator sa obiektami zinstancjonowanymi, ktore implementuja IDisposable. Powinny byc owinięte w bloki using aby zwolnic zasoby natywne.
  • Brak natywnej obsługi plików PDF: Aspose.BarCode nie może bezpośrednio otwierać ani renderować dokumentów PDF. Czytanie kodów kreskowych z plików PDF wymaga Aspose.PDF, osobnego produktu subskrypcyjnego.
  • Gleboka hierarchia parametrow: Dostosowanie odbywa sie poprzez lancuchy wlasciwosci generator.Parameters.Barcode.* — wielopoziomowa hierarchie obiektow wymagajaca zapamietania.
  • Licencjonowanie Subskrypcyjne: Zgodnie z opublikowanymi cenami Aspose, poziomy per-programista i site są rocznymi abonamentami; samodzielna opcja wieczysta nie jest wymieniona.
  • Aktywacja licencji opartej na plikach: Wdrozenia produkcyjne wymagaja pliku .lic, dostepnego w znanej sciezce, co dodaje krok wdrozenia dla srodowiskDockeri Kubernetes.

Model czytania "Format-First"

Interfejs API odczytu Aspose.BarCode opiera się na założeniu, że wywołujący zna format kodu kreskowego:

using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
foreach (var result in reader.ReadBarCodes())
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
Imports Aspose.BarCode.BarCodeRecognition

Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
For Each result In reader.ReadBarCodes()
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
Next
$vbLabelText   $csharpLabel

Gdy znasz format, ten wzorzec jest w porządku. Problem pojawia się, gdy "znasz format". System zakupowy przetwarzający faktury dostawców nie może zagwarantować, że każdy dostawca używa tego samego typu BarCODE. System zarządzania dokumentami, który akceptuje pliki przesyłane przez użytkowników, nie jest w stanie przewidzieć, w jakim formacie zostały one zeskanowane. W takich przypadkach DecodeType.AllSupportedTypes jest rozwiazaniem zapasowym, i jest zazwyczaj wolniejsze niz docelowa lista typow dekodowania.

Należy również usunąć dekoder:

using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
using var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
$vbLabelText   $csharpLabel

Nieuzylanie using to wyciek zasobow. BarcodeGenerator rowniez implementuje IDisposable, choc konsekwencje nieusuniecia tego sa mniej surowe. W obu przypadkach zarządzasz cyklem życia obiektów, którym statyczny interfejs API fabryki zająłby się automatycznie.

Zrozumienie IronBarcode

IronBarcode wykorzystuje statyczne metody fabryczne zarówno do odczytu, jak i zapisu. Nie ma potrzeby tworzenia, konfigurowania ani usuwania żadnych instancji. API odczytu jest domyślnie niezależne od formatu, a to samo wywołanie działa niezależnie od tego, czy plik źródłowy jest w formacie PNG, JPEG, TIFF czy PDF.

IronBarcode jest rozwijany i utrzymywany przez Iron Software, firmę skoncentrowaną na narzędziach dla programistów .NET. Biblioteka została zaprojektowana w oparciu o zasadę, że odczyt kodów kreskowych nie powinien wymagać wcześniejszej wiedzy na temat formatu kodu kreskowego — silnik wykrywania biblioteki określa format na podstawie zawartości obrazu. W przypadku generowania płynny łańcuch metod zastępuje wielopoziomową hierarchię parametrów, powszechną w innych bibliotekach.

Kluczowe cechy IronBarcode:

  • Automatyczne wykrywanie formatu: BarcodeReader.Read() identyfikuje symbologie kodu kreskowego na podstawie zawartosci obrazu bez wymogu okreslenia przez dzwoniacego ekwiwalentu DecodeType.
  • Statyczne, bezstanowe API: Wszystkie operacje odczytu i zapisu są metodami statycznymi. Nie ma instancji jednorazowych do zarządzania, a API jest naturalnie bezpieczne dla wątków, co pozwala na równoczesne użytkowanie.
  • Natywne wsparcie dla PDF: BarcodeReader.Read("doc.pdf") czyta bezposrednio z plikow PDF bez zadnych dodatkowych pakietow czy krokow renderowania. Wyniki zawieraja result.PageNumber.
  • Fluentne API do generacji: BarcodeWriter.CreateBarcode() zwraca obiekt lancuchowy. Dostosowywanie wykorzystuje łańcuchowanie metod zamiast hierarchii właściwości.
  • Model licencji wieczystej: Wszystkie poziomy oferują jednorazowy zakup bez wymogu corocznego odnawiania.
  • Aktywacja licencji oparta na lancuchach znakowych: Klucz licencji jest ustawiany przez IronBarCode.License.LicenseKey, co jest zgodne ze zmiennymi srodowiskowymi i menedzerami sekretow CI/CD.

Porównanie funkcji

Funkcja Aspose.BarCode IronBarcode
Wykrywanie formatu Ręczny — należy okreslic DecodeType lub uzyc powolnego AllSupportedTypes Automatyczne dla wszystkich obsługiwanych formatów
Liczba symboli 80+ 50+
Obsługa plików PDF Brak natywnej obsługi — wymaga oddzielnej licencji Aspose.PDF Natywny — BarcodeReader.Read("doc.pdf") wbudowany w pakiet
Model cenowy Tylko subskrypcja — roczne poziomy od 999 USD rocznie Licencja wieczysta od 749 USD (opłata jednorazowa)
Licencja wieczysta Niedostępne Tak, wszystkie poziomy
Styl API Konfiguracja oparta na instancjach, rozbudowana Statyczne metody fabryczne, płynny interfejs API
Wymóg IDisposable Tak — BarCodeReader i BarcodeGenerator Nie — statyczne metody bezstanowe
Bezpieczeństwo wątków Wymagane są oddzielne instancje dla każdego wątku Statyczne API — zobacz dokumentacjęIronBarcode w celu uzyskania wskazówek dotyczących wątków

Szczegółowe porównanie funkcji

Funkcja Aspose.BarCode IronBarcode
Generacja
Styl API new BarcodeGenerator(EncodeTypes.X, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X)
Model dostosowywania Hierarchia wlasciwosci generator.Parameters.Barcode.* Fluentna metoda lancucha (.ResizeTo(), .ChangeBarCodeColor())
Kod QR z logo Ręczne nakładanie GDI+ po wygenerowaniu .AddBrandLogo("logo.png") wbudowany
Wynik w bajtach generator.GenerateBarCodeImage() .ToPngBinaryData()
Kolorowe BarCodes generator.Parameters.Barcode.BarColor .ChangeBarCodeColor(Color.X)
Czytanie
Specyfikacja formatu Wymagane (DecodeType) Nie jest wymagane — automatyczne
Rezerwa na nieznany format DecodeType.AllSupportedTypes (powolne) Ten sam wywołanie — nie jest potrzebny tryb awaryjny
Optymalizacja wydajności Zestaw parametrow QualitySettings ReadingSpeed enum — trzy poziomy
Jednorazowy czytnik Tak — using var reader = new BarCodeReader(...) Brak — wywołanie statyczne, brak obiektu do usunięcia
Dostęp do wyników Iterowanie reader.ReadBarCodes() Zwracana wartosc BarcodeReader.Read()
Właściwość wartości BarCode result.CodeText result.Value
Właściwość nazwy formatu result.CodeTypeName result.Format.ToString()
Obsługa plików PDF
Odczyt plików PDF w języku ojczystym Nie Tak
Wymagane dla pliku PDF Aspose.PDF (oddzielna subskrypcja) Brak dodatkowego pakietu
Numer strony w wynikach Nie dotyczy result.PageNumber
Licencjonowanie
Model licencji Tylko w ramach subskrypcji, odnawianie roczne Wielorazowa, jednorazowa licencja
Pojedynczy programista 999 USD/rok 749 USD jednorazowo
10 programistów 4995 USD/rok (licencja na witrynę) 2999 USD jednorazowo (Professional)
Nieograniczona liczba wdrożeń (10 programistów) 13 986 USD rocznie (OEM Strona) 5999 USD jednorazowo (bez ograniczeń)
Obsługa plików PDF w zestawie Nie — oddzielna subskrypcja Aspose.PDF Tak
Platforma i wdrożenie
Aktywacja licencji Sciezka pliku .lic Klucz ciągu znaków — zmienna środowiskowa
WdrożenieDocker Nalezy skopiowac plik .lic do obrazu lub go zamontowac Zmienna środowiskowa — nie jest wymagany żaden plik
.NET Framework Tak Tak (4.6.2+)
.NET Core / .NET 5+ Tak Tak (.NET Core 3.1+, .NET 5/6/7/8)
Windows Tak Tak (x64/x86)
Linux Tak Tak (x64)
macOS Tak Tak (x64/ARM)
Docker Tak Tak
Azure / AWS Lambda Tak Tak

Generowanie API

W codziennym kodzie różnica w szczegółowości między tymi dwiema bibliotekami jest najbardziej widoczna w API generowania.

Podejście Aspose.BarCode

Aspose.BarCode uzywa klasy BarcodeGenerator z hierarchią Parameters do konfiguracji. Wywołanie generacji minimalnej wymaga trzech kroków — instancjonowania, wywołania zapisu i specyfikacji formatu. Rzeczywiste uzycie zazwyczaj wymaga poruszania się w generator.Parameters.Barcode.*:

using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
using Aspose.BarCode.Generation;
using System.Drawing;

var generator = new BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345");

// Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2;
generator.Parameters.Barcode.BarHeight.Pixels = 100;
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below;
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial";
generator.Parameters.Barcode.Padding.Left.Pixels = 10;
generator.Parameters.Barcode.Padding.Right.Pixels = 10;
generator.Parameters.BackColor = Color.White;
generator.Parameters.Resolution = 300;

generator.Save("barcode.png", BarCodeImageFormat.Png);
Imports Aspose.BarCode.Generation
Imports System.Drawing

Dim generator As New BarcodeGenerator(EncodeTypes.Code128, "ITEM-12345")

' Common customizations require navigating a deep parameter hierarchy
generator.Parameters.Barcode.XDimension.Pixels = 2
generator.Parameters.Barcode.BarHeight.Pixels = 100
generator.Parameters.Barcode.CodeTextParameters.Location = CodeLocation.Below
generator.Parameters.Barcode.CodeTextParameters.Font.FamilyName = "Arial"
generator.Parameters.Barcode.Padding.Left.Pixels = 10
generator.Parameters.Barcode.Padding.Right.Pixels = 10
generator.Parameters.BackColor = Color.White
generator.Parameters.Resolution = 300

generator.Save("barcode.png", BarCodeImageFormat.Png)
$vbLabelText   $csharpLabel

Kazda personalizacja wymaga poruszania sie w generator.Parameters.Barcode.*, co jest wielopoziomowa hierarchia obiektow. Nie jest to skomplikowane, gdy już się to zapamięta — ale wymaga zapamiętania.

Podejście IronBarcode

IronBarcode zastępuje hierarchię parametrów płynnym łańcuchem metod. Ustawienia domyślne dają poprawne wyniki w większości przypadków, a dostosowania są wyrażone w tekście:

using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
using IronBarCode;

// Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");

// Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");

// Get as bytes instead of saving to disk
byte[] pngData = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports IronBarCode

' Default settings work for most cases
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")

' Customization through a fluent chain
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")

' Get as bytes instead of saving to disk
Dim pngData As Byte() = BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

W przypadku kodów QR interfejs API generowania kodów QR firmy IronBarcode obsługuje logo marki bez konieczności ręcznego komponowania obrazu:

using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
using IronBarCode;
using IronSoftware.Drawing;

// With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");

// With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded-high-ecc.png");

// Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300)
    .ChangeBarCodeColor(Color.DarkBlue)
    .SaveAsPng("qr-colored.png");
Imports IronBarCode
Imports IronSoftware.Drawing

' With brand logo — built in, no manual image overlay needed
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")

' With high error correction (recommended when using a logo)
QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded-high-ecc.png")

' Colored QR code
QRCodeWriter.CreateQrCode("https://example.com", 300) _
    .ChangeBarCodeColor(Color.DarkBlue) _
    .SaveAsPng("qr-colored.png")
$vbLabelText   $csharpLabel

Aspose.BarCode nie dostarcza rozwiązania do jednokrotnego wywołania pomocnika z logiem QR; Dokumentowane podejscie to wygenerowanie obrazu kodu kreskowego, a nastepnie kompozycja logo na nim (na przyklad z System.Drawing.Graphics). Funkcja AddBrandLogo w IronBarcode obsluguje kompozycje w jednym wywolaniu i automatycznie ustawia odpowiednia korekcje bledow.

Odczytywanie BarCodes z plików PDF

Dla wielu zespołów to właśnie to porównanie ma największe znaczenie. Odczytywanie BarCodes z dokumentów PDF to powszechny proces: przychodzące faktury, etykiety wysyłkowe zapisane jako PDF, archiwa zeskanowanych dokumentów.

Podejście Aspose.BarCode

Aspose.BarCode nie obsługuje natywnie formatu PDF. Aby odczytać kod kreskowy z pliku PDF za pomocą Aspose, potrzebujesz Aspose.PDF do załadowania pliku PDF i renderowania stron do obrazów oraz Aspose.BarCode do skanowania tych renderowanych obrazów. Oba są produktami dostępnymi w ramach subskrypcji. Oba wymagają aktywacji licencji. Płacisz za dwie roczne subskrypcje, co większość programistów uważa za pojedynczą możliwość.

// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
// Requires both Aspose.PDF (separate license) and Aspose.BarCode
using Aspose.Pdf;
using Aspose.Pdf.Devices;
using Aspose.BarCode.BarCodeRecognition;
using System.IO;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var barcodeValues = new List<string>();

    // Step 1: Load and render the PDF using Aspose.PDF
    var pdfDocument = new Aspose.Pdf.Document(pdfPath);
    var resolution = new Resolution(300);
    var device = new PngDevice(resolution);

    for (int pageNum = 1; pageNum <= pdfDocument.Pages.Count; pageNum++)
    {
        using var pageStream = new MemoryStream();
        device.Process(pdfDocument.Pages[pageNum], pageStream);
        pageStream.Seek(0, SeekOrigin.Begin);

        // Step 2: Scan the rendered image for barcodes using Aspose.BarCode
        using var reader = new BarCodeReader(pageStream, DecodeType.AllSupportedTypes);
        foreach (var result in reader.ReadBarCodes())
        {
            barcodeValues.Add(result.CodeText);
        }
    }

    return barcodeValues;
}
Imports Aspose.Pdf
Imports Aspose.Pdf.Devices
Imports Aspose.BarCode.BarCodeRecognition
Imports System.IO

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim barcodeValues As New List(Of String)()

    ' Step 1: Load and render the PDF using Aspose.PDF
    Dim pdfDocument As New Aspose.Pdf.Document(pdfPath)
    Dim resolution As New Resolution(300)
    Dim device As New PngDevice(resolution)

    For pageNum As Integer = 1 To pdfDocument.Pages.Count
        Using pageStream As New MemoryStream()
            device.Process(pdfDocument.Pages(pageNum), pageStream)
            pageStream.Seek(0, SeekOrigin.Begin)

            ' Step 2: Scan the rendered image for barcodes using Aspose.BarCode
            Using reader As New BarCodeReader(pageStream, DecodeType.AllSupportedTypes)
                For Each result In reader.ReadBarCodes()
                    barcodeValues.Add(result.CodeText)
                Next
            End Using
        End Using
    Next

    Return barcodeValues
End Function
$vbLabelText   $csharpLabel

To sa dwie konfiguracje licencyjne, dwa uzycia z dwoch nazw przestrzeni, linia renderingu, zarzadzanie strumieniem pamieci i zagniezdzona petla. Wykorzystuje rowniez DecodeType.AllSupportedTypes, ponieważ w momencie wyodrębniania obrazu zazwyczaj nie wiesz, jaki format uzywa kod kreskowy.

Podejście IronBarcode

IronBarcode wewnętrznie obsługuje parsowanie plików PDF, renderowanie stron i wykrywanie kodów kreskowych. Wywolujesz Read ze sciezka konczaca sie na .pdf, a to zwraca wyniki kodu kreskowego, ktore zawieraja result.PageNumber, aby wiedzieć, z ktorej strony pochodzi kazdy. Bez drugiego pakietu, bez drugiej licencji, bez kodu renderującego.

using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
using IronBarCode;

public List<string> ReadBarcodesFromPdf(string pdfPath)
{
    var results = BarcodeReader.Read(pdfPath);
    return results.Select(r => r.Value).ToList();
}
Imports IronBarCode

Public Function ReadBarcodesFromPdf(pdfPath As String) As List(Of String)
    Dim results = BarcodeReader.Read(pdfPath)
    Return results.Select(Function(r) r.Value).ToList()
End Function
$vbLabelText   $csharpLabel
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
// With page number context
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}");
}
Imports System

' With page number context
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: [{barcode.Format}] {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Dokumentacja dotycząca odczytu plików PDF w IronBarcode obejmuje opcje przetwarzania wielostronicowego w trybie wsadowym oraz filtrowania zakresów stron.

Odczytywanie nieznanych formatów BarCode

Kiedy nie wiesz, jaki format kodu kreskowego zawiera obraz, obie biblioteki traktują sytuację inaczej.

Podejście Aspose.BarCode

DecodeType.AllSupportedTypes to rozwiazanie Aspose dla scenariuszy o nieznanym formacie. Własna dokumentacja firmy Aspose przyznaje, że jest to wolniejsze niż określenie listy docelowej, ponieważ dekoder przechodzi sekwencyjnie przez każdą znaną symbolikę. W przypadku przetwarzania dużych ilości danych — magazynu skanującego tysiące etykiet na minutę — ta różnica w wydajności nie jest bez znaczenia.

using Aspose.BarCode.BarCodeRecognition;

using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
using Aspose.BarCode.BarCodeRecognition;

using var reader = new BarCodeReader("unknown-format.png");
reader.SetBarCodeReadType(DecodeType.AllSupportedTypes);
foreach (var result in reader.ReadBarCodes())
{
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
}
Imports Aspose.BarCode.BarCodeRecognition

Using reader As New BarCodeReader("unknown-format.png")
    reader.SetBarCodeReadType(DecodeType.AllSupportedTypes)
    For Each result In reader.ReadBarCodes()
        Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}")
    Next
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode

Nie ma "trybu wolnego" ani "trybu szybkiego" opartego na znajomości formatów. Funkcja wykrywania IronBarcode wykorzystuje ten sam algorytm niezależnie od tego, czy obraz zawiera kod 128, czy DataMatrix. Jesli chcesz dostroic kompromisy miedzy wydajnoscia a dokladnoscia, opcja ReadingSpeed to robi, nie wymagajac znajomosci formatu:

using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
using IronBarCode;

// The same call regardless of format — always auto-detects
var results = BarcodeReader.Read("unknown-format.png");
foreach (var result in results)
{
    Console.WriteLine($"{result.Format}: {result.Value}");
}
Imports IronBarCode

' The same call regardless of format — always auto-detects
Dim results = BarcodeReader.Read("unknown-format.png")
For Each result In results
    Console.WriteLine($"{result.Format}: {result.Value}")
Next
$vbLabelText   $csharpLabel
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("document.png", options);
using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

var results = BarcodeReader.Read("document.png", options);
Imports IronBarCode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Dim results = BarcodeReader.Read("document.png", options)
$vbLabelText   $csharpLabel

ReadingSpeed.Faster priorytetuje przepustowosc. ReadingSpeed.Detailed priorytetuje dokladnosc na uszkodzonych lub niskokontrastowych obrazach. Żadne z nich nie wymaga wcześniejszej znajomości formatu. Pełny zestaw parametrów regulacyjnych można znaleźć w opcjach odczytu IronBarcode.

Przewodnik po mapowaniu API

Aspose.BarCode IronBarcode
new BarcodeGenerator(EncodeTypes.Code128, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
generator.Save("file.png", BarCodeImageFormat.Png) .SaveAsPng("file.png")
new BarCodeReader(path, DecodeType.Code128) BarcodeReader.Read(path)
DecodeType.AllSupportedTypes (powolne, wyczerpujace skanowanie) Automatyczne — zawsze szybkie, to samo wywołanie dla wszystkich formatów
reader.ReadBarCodes() (part of BarcodeReader.Read — returns results directly)
Iterowanie reader.ReadBarCodes() Zwracana wartosc BarcodeReader.Read
result.CodeText result.Value
result.CodeTypeName result.Format.ToString()
result.Confidence result.Confidence
Aspose.BarCode + Aspose.PDF for PDF reading BarcodeReader.Read("doc.pdf") — jeden pakiet
license.SetLicense("Aspose.BarCode.lic") IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
new Aspose.BarCode.Metered() + .SetMeteredKey() (not needed — single key covers all environments)
generator.GenerateBarCodeImage() .ToPngBinaryData() lub .SaveAsPng()
QREncodeMode.Auto + QRErrorLevel.LevelH + ręczna nakladka logo QRCodeWriter.CreateQrCode().AddBrandLogo()

Kiedy zespoły rozważają przejście z Aspose.BarCode na IronBarcode

Istnieje kilka scenariuszy, w których zespoły programistów często rozważająIronBarcode jako alternatywę dla Aspose.BarCode.

Nadchodzi odnowienie subskrypcji

Coroczne odnawianie subskrypcji to moment, w którym zespoły najczęściej ponownie rozważają decyzje dotyczące bibliotek. Jeśli Aspose.BarCode to jedyny produkt Aspose w stosie, płacenie 999 USD za rok na jednego programistę (lub 4 995 USD za rok na poziomie strony) za funkcję kodu kreskowego wymaga porównania. Rozmowa zazwyczaj wygląda następująco: "Płacimy za to co roku, w nieskończoność". "Ile kosztuje jednorazowa licencja IronBarcode?" W pakiecie Professional (2999 USD dla 10 programistów)IronBarcode zwraca się w ciągu pierwszego roku w porównaniu z licencją Site.

Dla zespołów używających Aspose.Total — gdzie Aspose.BarCode jest pakietowane z wieloma innymi produktami Aspose — matematyka jest inna. Koszt marginalny Aspose.BarCode w ramach tego pakietu jest bliski zeru. Te zespoły mają mniej powodów, by się zmieniać.

Obsługa formatu PDF staje się wymogiem

Wiele projektów rozpoczyna się od odczytu BarCodes z obrazów, a następnie dodaje obsługę plików PDF, gdy interesariusz zdaje sobie sprawę, że przychodzące dokumenty to pliki PDF, a nie pliki graficzne. W tym momencie zespół Aspose.BarCode staje przed decyzją: dodać Aspose.PDF (kolejną subskrypcję), znaleźć zewnętrzny renderer PDF lub ponownie ocenić bibliotekę kodów kreskowych.

Dodanie Aspose.PDF rozwiązuje bieżące wymaganie, ale oznacza drugą roczną subskrypcję. Znajdowanie renderera innych firm dodaje zależność i wysiłek integracyjny. Często skutkiem tego jest ponowna ocena biblioteki BarCode — i odkrycie, że IronBarcode odczytuje pliki PDF natywnie za jednorazową opłatą.

Scenariusze nieznanego formatu w środowisku produkcyjnym

Aplikacje przeznaczone dla klientów, które akceptują przesyłanie dokumentów, nie mogą kontrolować formatu BARCODE używanych w przesłanych dokumentach. Jesli aplikacja zostala zbudowana przyjmując dane wejsciowe jako kodeks 128 a klient przesyla etykiete DataMatrix, zdefiniowany na stale DecodeType.Code128 będzie cicho zwracal brak wynikow. Przejscie na DecodeType.AllSupportedTypes naprawia dokladnosc, ale wprowadza koszty wydajności.

Zespoly, ktore zetknely sie z tym problemem — dodawanie coraz wiecej wartosci DecodeType do swojej konfiguracji czytnika, gdy pojawiaja się nowe formaty w produkcji — czesto koncza na utrzymywaniu listy, ktora wymaga aktualizacji za kazdym razem, gdy dodawane sa nowe zrodla formatow. Funkcja automatycznego wykrywania IronBarcode sprawia, że lista ta staje się zbędna.

Wdrożenia w chmurze i w kontenerach

Licencjonowanie oparte na plikach w Aspose.BarCode wymaga dodatkowego etapu wdrażania: plik licencji musi być dostępny w czasie wykonywania z lokalizacji, którą aplikacja może odczytać. W procesie GitOps plik licencji trafia albo do kontroli źródła (co stanowi zagrożenie dla bezpieczeństwa), albo musi zostać wstrzyknięty za pośrednictwem zamontowanego woluminu sekretów. Podejście oparte na kluczach stosowane przez IronBarcode idealnie wpisuje się w sekrety Kubernetes oraz zmienne sekretne CI/CD, nie wymagając zarządzania żadnymi plikami w obrazie kontenera.

Typowe kwestie związane z migracją

Zespoły przechodzące z Aspose.BarCode na IronBarcode napotykają niewielką liczbę przewidywalnych zmian technicznych.

Mapowanie nazw właściwości

Najczestszy blad kompilacji po zamianie pakietow to zmiana nazwy z result.CodeText na result.Value. Wyszukiwanie w całym kodzie pozwala to szybko sprawdzić:

grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
grep -r "\.CodeText" --include="*.cs" .
grep -r "\.CodeTypeName" --include="*.cs" .
SHELL

result.CodeText staje sie result.Value. result.CodeTypeName staje sie result.Format.ToString(). Wlasciwosc result.Format to wartość enum BarcodeEncoding, ktora pozwala rowniez na typowe porownania tam, gdzie potrzeba.

Usunięcie DecodeType

Kazde odniesienie DecodeType.* w kodzie moze byc usuniete:

grep -r "DecodeType\." --include="*.cs" .
grep -r "DecodeType\." --include="*.cs" .
SHELL

Jesli zastosowano konkretne DecodeType, aby poprawic wydajnosc dla znanego formatu, ReadingSpeed.Faster w BarcodeReaderOptions zapewnia podobne korzysci bez wymogow definicji formatu.

Zmiana inicjalizacji licencji

Aspose.BarCode uzywa pliku .lic wczytywanego za pomoca license.SetLicense().IronBarcode używa klucza typu string:

IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
IronBarCode.License.LicenseKey =
    Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE")
    ?? throw new InvalidOperationException("IronBarcode license key not configured");
Imports IronBarCode
Imports System

License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONBARCODE_LICENSE"), Throw New InvalidOperationException("IronBarcode license key not configured"))
$vbLabelText   $csharpLabel

Usun plik .lic z repozytorium i artefaktow budowlanych. W Dockerze, usun linie COPY Aspose.BarCode.lic i zastap ją wejsciem ENV IRONBARCODE_LICENSE.

Mapowanie typów kodowania na kodowanie kodów kreskowych

EncodeTypes.QR mapuje sie do BarcodeEncoding.QRCode — różnica w nazewnictwie to miejsce, w którym zespoly najczesciej napotykają pierwszy blad kompilacji po migracji kodu generacji. Większość innych mapowań to bezpośrednie odpowiedniki z jednolitą nazwą.

Dodatkowe możliwości IronBarcode

Oprócz podstawowych punktów porównawczych,IronBarcode oferuje funkcje, które mogą być istotne w zależności od kontekstu zastosowania:

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

IronBarcode obsługuje.NET Framework4.6.2+, .NET Core 3.1+ i .NET 5, 6, 7 i 8. Biblioteka otrzymuje regularne aktualizacje zgodne z cyklem wydawniczym Microsoft .NET. Aspose.BarCode wspiera porównywalny zakres wersji .NET, więc żadna z bibliotek nie daje przewagi kompatybilności na bieżących wersjach. Istotną różnicą pod kątem gotowości na przyszłość jest licencjonowanie: zakupiona dzisiaj wieczysta licencja IronBarcode obejmuje przyszłe wersje .NET bez dodatkowych kosztów, podczas gdy subskrypcje Aspose.BarCode wymagają ciągłego odnawiania, aby uzyskać dostęp do zaktualizowanych kompilacji.

Wnioski

Aspose.BarCode i IronBarcode reprezentują dwie różne filozofie projektowania bibliotek BarCode. Aspose.BarCode opiera się na jawnym, opartym na instancjach interfejsie API, w którym wywołujący określa format, zarządza czasem życia obiektów i konfiguruje każdą operację poprzez hierarchię właściwości.IronBarcode opiera się na statycznym, niezależnym od formatu interfejsie API, w którym biblioteka wewnętrznie obsługuje wykrywanie, cykl życia obiektów oraz renderowanie plików PDF. Żadne z tych podejść nie jest z natury poprawne — właściwy wybór zależy od potrzeb aplikacji.

Aspose.BarCode to lepszy wybór dla zespołów już działających w ekosystemie Aspose. Kiedy Aspose.Total jest już licencjonowane, Aspose.BarCode dodaje brakujący koszt marginalny, a jego lista80+symboli to jedna z najszerszych dostępnych w jakiekolwiek komercyjnej bibliotece kodów kreskowych dla .NET. W przypadku aplikacji wymagających nietypowych formatów — MaxiCode, DotCode lub określonych symboli pocztowych, których nie ma na liście ponad 50 formatów obsługiwanych przez IronBarcode— Aspose.BarCode może być jedyną realną opcją. Jego dojrzałość i szeroki zakres formatów to prawdziwe atuty.

W przypadku zespołów rozważających zakup Aspose.BarCode jako samodzielnego produktu trudniej jest oszacować wartość. Wymóg dotyczący specyfikacji formatu utrudnia każdą operację czytania. Brak natywnej obsługi plików PDF podwaja koszt subskrypcji za funkcję, którąIronBarcode zawiera w swoim pakiecie podstawowym. Model subskrypcyjny oznacza, że koszt rośnie z każdym rokiem — 4995 USD rocznie dla zespołu składającego się z 10 programistów to 24 975 USD w ciągu pięciu lat, w porównaniu z 2999 USD za jednorazowy zakup IronBarcode Professional. Funkcja automatycznego wykrywania, natywny odczyt plików PDF oraz Licencja wieczysta IronBarcode rozwiązują wszystkie trzy powyższe problemy w jednym pakiecie.

Ostateczna decyzja zależy od dopasowania do ekosystemu i wymagań dotyczących symboliki. Zespoły głęboko zintegrowane z produktami Aspose lub zespoły, które potrzebują formatów spoza listy obsługiwanych przez IronBarcode, powinny skorzystać z Aspose.BarCode. Zespoły, które potrzebują samodzielnej licencji wieczystej, natywnego odczytu plików PDF oraz API, które nie wymaga znajomości formatów przy każdym odczycie, uznająIronBarcode za bardziej praktyczny wybór.

Często Zadawane Pytania

Czym jest Aspose.BarCode dla .NET?

Aspose.BarCode for .NET to biblioteka kodów kreskowych .NET służąca do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest to jedna z kilku alternatyw rozważanych przez programistów przy wyborze rozwiązania do obsługi kodów kreskowych w projektach .NET.

Jakie są główne różnice między Aspose.BarCode dla .NET a IronBarcode for .NET?

IronBarcode wykorzystuje statyczne, bezstanowe API, które nie wymaga zarządzania instancjami, podczas gdy Aspose.BarCode for .NET zazwyczaj wymaga utworzenia i konfiguracji instancji przed użyciem. IronBarcode zapewnia również natywną obsługę plików PDF, automatyczne wykrywanie formatów oraz licencjonowanie za pomocą jednego klucza we wszystkich środowiskach.

Czy licencja na IronBarcode for .NET jest łatwiejsza do uzyskania niż licencja na Aspose.BarCode dla .NET?

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 obsługiwane przez Aspose.BarCode for .NET?

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.

W jaki sposób IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu z Aspose.BarCode for .NET?

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ę wypróbować IronBarcode przed zakupem, w przeciwieństwie do Aspose.BarCode?

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 Aspose.BarCode dla .NET a IronBarcode for .NET?

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 Aspose.BarCode for .NET do IronBarcode jest prosta?

Migracja z Aspose.BarCode for .NET do IronBarcode polega przede wszystkim na zastąpieniu wywołań API opartych na instancjach statycznymi metodami IronBarcode, usunięciu standardowych fragmentów kodu dotyczących licencji oraz aktualizacji nazw właściwości wyników. Większość migracji wiąże się raczej z redukcją kodu niż z jego dodawaniem.

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