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

Aspose.BarCode for .NET vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

Każdy programista, który korzystał z Aspose.BarCode, napisał kiedyś coś w stylu: new BarCodeReader(path, DecodeType.Code128). Działa to dobrze, gdy wiadomo, jaki format ma obraz. Gdy tak nie jest — gdy dokument pochodzi z systemu zewnętrznego, od dostawcy, który zmienił format etykiety, lub został przesłany przez użytkownika — albo zgadujesz listę typów dekodowania, albo sięgasz po DecodeType.AllSupportedTypes, co jest zauważalnie wolniejsze. 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. Aby najpierw przekształcić strony w obrazy, potrzebujesz Aspose.PDF dla .NET. Aspose.PDF to kolejna subskrypcja: 999–4995 USD rocznie, 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 60 symboli kodów kreskowych, co stanowi najbardziej kompletną listę formatów spośród wszystkich komercyjnych bibliotek 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. Wygenerowanie podstawowego BARCODE-a Code 128 wymaga instancjonowania BarcodeGenerator, ustawienia XDimension, BarHeight i innych parametrów, a następnie wywołania Save z jawnym argumentem formatu. Odczyt wymaga określenia typów dekodowania, które mają być przeszukiwane, wywołania ReadBarCodes(), a następnie iteracji FoundBarCodes. Obie operacje działają poprawnie — są po prostu bardziej rozbudowane niż to konieczne.

Kluczowe cechy architektury Aspose.BarCode:

  • Model odczytu "Format-First": Każda operacja odczytu wymaga wyraźnego określenia DecodeType. Rozwiązanie awaryjne DecodeType.AllSupportedTypes jest znacznie wolniejsze niż lista docelowa, ponieważ dekoder przechodzi sekwencyjnie przez każdą znaną symbolikę.
  • API oparte na instancjach: Zarówno BarCodeReader, jak i BarcodeGenerator są instancjami obiektów, które implementują IDisposable. Brak umieszczenia ich w blokach using powoduje wycieki zasobów.
  • Brak natywnej obsługi plików PDF: Aspose.BarCode nie może bezpośrednio otwierać ani renderować dokumentów PDF. Odczytywanie BARCODE-ów z plików PDF wymaga Aspose.PDF, oddzielnego produktu dostępnego w ramach subskrypcji w cenie od 999 do 4995 USD rocznie.
  • Głęboka hierarchia parametrów: Dostosowywanie odbywa się za pomocą łańcuchów właściwości generator.Parameters.Barcode.* — wielopoziomowej hierarchii obiektów, która wymaga zapamiętania.
  • Tylko licencje subskrypcyjne: Wszystkie poziomy to subskrypcje roczne. Opcja wieczysta nie jest dostępna jako samodzielny produkt.
  • Aktywacja licencji oparta na pliku: Wdrożenia produkcyjne wymagają pliku .lic dostępnego w znanej ścieżce, co dodaje dodatkowy etap wdrożenia w środowiskach Docker i Kubernetes.

Model czytania "Format-First"

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

// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;

var reader = new BarCodeReader("barcode.png", DecodeType.Code128);
reader.ReadBarCodes();
foreach (var result in reader.FoundBarCodes)
    Console.WriteLine($"{result.CodeTypeName}: {result.CodeText}");
// Aspose.BarCode: must specify format or use slow AllSupportedTypes
using Aspose.BarCode.BarCodeRecognition;

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

' Aspose.BarCode: must specify format or use slow AllSupportedTypes
Dim reader As New BarCodeReader("barcode.png", DecodeType.Code128)
reader.ReadBarCodes()
For Each result In reader.FoundBarCodes
    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 rozwiązaniem awaryjnym i działa znacznie wolniej niż lista typów dekodowania docelowego.

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

Niekorzystanie z using powoduje wyciek zasobów. BarcodeGenerator implementuje również IDisposable, choć konsekwencje nieusunięcia go są mniej poważne. 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 tworzony i utrzymywany przez Iron Software, firmę skupiającą się wyłącznie na narzędziach programistycznych .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 symbolikę BARCODE na podstawie zawartości obrazu bez konieczności określania przez wywołującego odpowiednika 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.
  • Natywna obsługa plików PDF: BarcodeReader.Read("doc.pdf") odczytuje dane bezpośrednio z plików PDF bez konieczności stosowania dodatkowych pakietów lub etapów renderowania. Wyniki obejmują result.PageNumber.
  • Fluent Generation API: BarcodeWriter.CreateBarcode() zwraca obiekt łańcuchowy. 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 ciągach znaków: Klucz licencyjny jest ustawiany za pomocą IronBarCode.License.LicenseKey, co jest zgodne ze zmiennymi środowiskowymi i menedżerami sekretów CI/CD.

Porównanie funkcji

Funkcja Aspose.BarCode IronBarcode
Wykrywanie formatu Podręcznik — należy określić DecodeType lub użyć powolnego AllSupportedTypes Automatyczne dla wszystkich obsługiwanych formatów
Liczba symboli 60+ 50+
Obsługa plików PDF Brak natywnej obsługi — wymaga oddzielnej licencji Aspose.PDF Native — BarcodeReader.Read("doc.pdf") wbudowane w pakiet
Model cenowy Tylko w ramach subskrypcji — 999–4995 USD/rok 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 Bezstanowość — naturalne bezpieczeństwo przy jednoczesnym użytkowaniu

Szczegółowe porównanie funkcji

Funkcja Aspose.BarCode IronBarcode
Generacja
Styl API new BarcodeGenerator(EncodeTypes.X, "data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.X)
Model dostosowywania generator.Parameters.Barcode.* hierarchia właściwości Płynny łańcuch metod (.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 wymagańe — automatyczne
Rezerwa na nieznany format DecodeType.AllSupportedTypes (powoli) Ten sam wywołanie — nie jest potrzebny tryb awaryjny
Optymalizacja wydajności 12+ QualitySettings parametrów 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 reader.FoundBarCodes po wywołaniu ReadBarCodes() Wartość zwracana przez 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 (dodatkowe 999–4995 USD rocznie) 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 programistów 14 985 USD/rok (OEM) 5999 USD jednorazowo (bez ograniczeń)
Obsługa plików PDF w zestawie Nie — oddzielna subskrypcja Aspose.PDF Tak
Platforma i wdrożenie
Aktywacja licencji .lic ścieżka do pliku Klucz ciągu znaków — zmienna środowiskowa
Wdrożenie Docker Należy skopiować plik .lic do obrazu lub zamontować go Zmienna środowiskowa — nie jest wymagańy żaden plik
.NET Framework Tak Tak (4.6.2+)
.NET Core / .NET 5+ Tak Tak (.NET Core 3.1+, .NET 5/6/7/8/9)
Windows Tak Tak (x64/x86)
Linux Tak Tak (x64)
macOS Tak Tak (x64/ARM)
Docker Tak Tak
Azure / AWS Lambda Tak Tak

Generation 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 wykorzystuje klasę BarcodeGenerator z hierarchią Parameters do konfiguracji. Wywołanie generacji minimalnej wymaga trzech kroków — instancjonowania, wywołania zapisu i specyfikacji formatu. W praktyce zazwyczaj wymaga to przejścia do 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

Każda personalizacja przechodzi do generator.Parameters.Barcode.*, który jest wielopoziomową hierarchią obiektów. Nie jest to skomplikówane, 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 wymaga ręcznego rysowania w GDI+ w celu nałożenia logo na kod QR — generuje obraz kodu kreskowego, a następnie używa System.Drawing.Graphics do nałożenia logo wyśrodkowanego nad nim. Funkcja AddBrandLogo w IronBarcode obsługuje to w jednym wywołaniu i automatycznie ustawia odpowiednią korektę błędów.

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. Łącznie kosztuje to od 1998 do 9990 dolarów rocznie za coś, co większość programistów uważa za pojedynczą funkcję.

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

Są to dwie konfiguracje licencji, dwa instrukcje using z dwóch przestrzeni nazw, potok renderowania, zarządzanie strumieniem pamięci oraz pętla zagnieżdżona. Wykorzystuje również DecodeType.AllSupportedTypes, ponieważ w momencie wyodrębniania obrazu zazwyczaj nie wiadomo, jaki format wykorzystuje BARCODE.

Podejście IronBarcode

IronBarcode wewnętrznie obsługuje parsowanie plików PDF, renderowanie stron i wykrywanie kodów kreskowych. Wywołujesz Read ze ścieżką kończącą się na .pdf, a funkcja zwraca wyniki BARCODE zawierające result.PageNumber, dzięki czemu wiesz, z której strony pochodzi każdy z nich. 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

Gdy nie wiadomo, jaki format BARCODE'a zawiera obraz, obie biblioteki radzą sobie z tą sytuacją w zupełnie inny sposób.

Podejście Aspose.BarCode

DecodeType.AllSupportedTypes to rozwiązanie firmy Aspose przeznaczone do sytuacji, w których format pliku jest nieznany. 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;

// AllSupportedTypes scans for every known format — significantly slower
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;

// AllSupportedTypes scans for every known format — significantly slower
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

' AllSupportedTypes scans for every known format — significantly slower
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. Jeśli chcesz dostosować kompromis między wydajnością a dokładnością, opcja ReadingSpeed pozwala to zrobić bez konieczności posiadania wiedzy na temat formatowania:

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 stawia na przepustowość. ReadingSpeed.Detailed priorytetowo traktuje dokładność w przypadku uszkodzonych lub mało kontrastowych obrazów. Ż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, wyczerpujące skanowanie) Automatyczne — zawsze szybkie, to samo wywołanie dla wszystkich formatów
reader.ReadBarCodes() (part of BarcodeReader.Read — returns results directly)
reader.FoundBarCodes Wartość zwracana przez 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 = "key"
new Aspose.BarCode.Metered() + .SetMeteredKey() (not needed — single key covers all environments)
generator.GenerateBarCodeImage() .ToPngBinaryData() lub .SaveAsPng()
QREncodeMode.Auto + QRErrorLevel.LevelH + ręczne nałożenie 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 jest jedynym produktem Aspose w stosie, cena 999–4995 USD rocznie za funkcjonalność kodów kreskowych skłania do 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.

W przypadku zespołów korzystających z Aspose.Total — gdzie Aspose.BarCode jest dołączony do ponad 20 innych produktów — sytuacja wygląda inaczej. 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 wymagania, ale podwaja koszt subskrypcji. Znalezienie renderera innej firmy wiąże się z dodatkową zależnością i nakładem pracy związanym z integracją. 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. Jeśli aplikacja została zbudowana z założeniem, że dane wejściowe są w formacie Code 128, a klient prześle etykietę DataMatrix, zakodowany na stałe DecodeType.Code128 po cichu nie zwróci żadnych wyników. Zmiana na DecodeType.AllSupportedTypes poprawia poprawność, ale powoduje spadek wydajności.

Zespoły, które napotkały ten problem — dodawanie coraz większej liczby wartości DecodeType do konfiguracji czytnika w miarę pojawiania się nowych formatów w środowisku produkcyjnym — często kończą z listą, którą trzeba aktualizować za każdym razem, gdy dodawane jest nowe źródło formatu. 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

Najczęstszym błędem kompilacji po zamianie pakietów jest 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 się result.Value. result.CodeTypeName staje się result.Format.ToString(). Właściwość result.Format jest wartością wyliczeniową BarcodeEncoding, co pozwala również na porównania typów w razie potrzeby.

Usunięcie DecodeType

Wszystkie odniesienia DecodeType.* w kodzie źródłowym można usunąć:

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

Jeśli konkretny DecodeType został wymieniony w celu poprawy wydajności w znanym formacie, ReadingSpeed.Faster w BarcodeReaderOptions zapewnia podobną korzyść bez konieczności znajomości formatu.

Zmiana inicjalizacji licencji

Aspose.BarCode wykorzystuje plik .lic ładowany za pośrednictwem 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

Usuń plik .lic z repozytorium i skompiluj artefakty. W Dockerze usuń wiersz COPY Aspose.BarCode.lic i zastąp go wpisem ENV IRONBARCODE_LICENSE.

Mapowanie typów kodowania na kodowanie kodów kreskowych

EncodeTypes.QR odpowiada BarcodeEncoding.QRCode — różnica w nazewnictwie jest miejscem, w którym zespoły najczęściej napotykają pierwszy błąd kompilacji po migracji kodu generacyjnego. Wszystkie pozostałe odwzorowania są bezpośrednimi odpowiednikami o spójnej nazewnictwie.

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 Framework 4.6.2+, .NET Core 3.1+ oraz .NET 5, 6, 7, 8 i 9. Biblioteka jest regularnie aktualizowana zgodnie z harmonogramem wydawania .NET firmy Microsoft, co zapewnia kompatybilność z .NET 10, którego premiera przewidziana jest na koniec 2026 roku. Aspose.BarCode obsługuje ten sam zakres wersji .NET, więc żadna z bibliotek nie ma przewagi pod względem kompatybilności z aktualnymi wersjami. 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. Jeśli Aspose.Total jest już licencjonowany, Aspose.BarCode nie generuje żadnych dodatkowych kosztów, a jego lista ponad 60 symboli jest najszersza spośród wszystkich komercyjnych bibliotek kodów kreskowych .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().

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie