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. DomyslnyDecodeType.AllSupportedTypesjest zazwyczaj wolniejszy niz docelowa lista, poniewaz dekoder przeprowadza przeszukiwanie sequentialne wszystkich znanych symbologii. - API oparte na instancji: Zarowno
BarCodeReaderjak iBarcodeGeneratorsa obiektami zinstancjonowanymi, ktore implementujaIDisposable. Powinny byc owinięte w blokiusingaby 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
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);
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 ekwiwalentuDecodeType. - 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 zawierajaresult.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)
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()
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 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
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
// 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
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
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
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 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" .
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" .
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"))
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:
- Wykrywanie wielu kodow kreskowych na obraz:
ExpectMultipleBarcodes = truezwraca wszystkie znalezione kody kreskowe w jednym obrazie, z wspołrzednymi pozycji dla każdego. - 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 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().

