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 awaryjneDecodeType.AllSupportedTypesjest znacznie wolniejsze niż lista docelowa, ponieważ dekoder przechodzi sekwencyjnie przez każdą znaną symbolikę. - API oparte na instancjach: Zarówno
BarCodeReader, jak iBarcodeGeneratorsą instancjami obiektów, które implementująIDisposable. Brak umieszczenia ich w blokachusingpowoduje 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
.licdostę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
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);
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 odpowiednikaDecodeType. - 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)
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()
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")
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
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
// 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
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
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
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)
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" .
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" .
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"))
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:
- Wykrywanie wielu BARCODE-ów na jednym obrazie:
ExpectMultipleBarcodes = truezwraca wszystkie BARCODE-y znalezione na jednym obrazie wraz z współrzędnymi położenia każdego z nich. - Wpisywanie BarCodes do plików PDF: Wpisuj BarCodes bezpośrednio na istniejących stronach PDF bez konieczności korzystania z osobnej biblioteki PDF.
- Odczyt wieloklatkowy plików TIFF: Odczytuj BARCODES ze wszystkich klatek wielostronicowego pliku TIFF za pomocą jednego wywołania.
- Stylizowane kody QR: kolor, logo i poziom korekcji błędów są ustawiane za pomocą łańcucha Fluent bez zewnętrznego przetwarzania obrazu.
- Obsługa Azure Functions i AWS Lambda: Wdrożenia bezserwerowe są obsługiwane na obu platformach w ramach standardowej licencji.
- Kodowanie danych binarnych: Koduj tablice bajtów bezpośrednio do barcode'ów Data Matrix lub PDF417 w zastosowaniach z danymi binarnymi.
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().

