Przejdź do treści stopki
FILMY

Jak odczytywać BarCodes z obrazów w języku C#

Migracja z BarCode do IronBarcode

Niniejszy przewodnik obejmuje kompletną ścieżkę migracji z BarCode do IronBarcode for .NET dla programistów .NET. Migracja konsoliduje dwa pakiety w jeden, zastępuje potok kodowania-rendowania pojedynczym wywołaniem metody oraz łączy wszystkie format-specyficzne importy przestrzeni nazw — using Barcoder.Code128, using Barcoder.Qr, using Barcoder.DataMatrix — w jednym using IronBarCode;. Typ IBarcode oraz typy ImageRenderer / ImageRendererOptions zostały całkowicie usunięte. Jeśli brakowało możliwości czytania, co spowodowało dodanie drugiej biblioteki obok Barcoder,IronBarcode pokrywa czytanie natywnie z BarcodeReader.Read().

Dlaczego warto przejść z BarCode

Zespoły migrujące z BarCode zgłaszają następujące czynniki:

Dodano wymóg odczytu: BarCode jest biblioteką służącą wyłącznie do generowania kodów, bez możliwości ich dekodowania. Gdy aplikacja musi weryfikować przychodzące kody kreskowe, przetwarzać zeskanowane dokumenty lub odczytywać kody kreskowe z przesłanych plików PDF, BarCode nie oferuje żadnego rozwiązania. Dodanie drugiej biblioteki do odczytu powoduje podział kodu źródłowego na dwie zależności NuGet, dwa interfejsy API do utrzymania oraz dwie historie wersji do śledzenia.IronBarcode obsługuje zarówno generowanie, jak i odczyt za pomocą tego samego pakietu.

Brak zgodności z .NET Framework: Barcoder.Renderer.Image zrezygnowało z wsparcia dla .NET Framework. Zespoły korzystające z usług lub aplikacji desktopowych opartych na platformie .NET Framework 4.x, które aktualizują pakiet renderera obrazów podczas rutynowej konserwacji zależności, napotykają błąd kompilacji.IronBarcode obsługuje platformy od .NET Framework 4.6.2 do .NET 9 bez konieczności stosowania pakietów warunkowych dla różnych środowisk docelowych.

Dryft wersji pakietu: Barcoder i Barcoder.Renderer.Image są niezależnie wersjonowanymi pakietami NuGet. Aktualizacja jednego z nich bez drugiego podczas odświeżania zależności może spowodować niezgodności. W repozytoriach zawierających wiele projektów zapewnienie spójnych wersji każdego renderera we wszystkich projektach stanowi obciążenie koordynacyjne, które rośnie wraz z wielkością zespołu.

Dodawanie wielu formatów: Projekt, który zaczyna się od Code128, a później dodaje QR, a następnie DataMatrix, musi dodać import nowej przestrzeni nazw i nauczyć się innej klasy kodera z różnymi parametrami metod dla każdego formatu.IronBarcode używa enumu BarcodeEncoding — dodanie formatu to jedna zmiana w istniejącym wywołaniu. Żadnych nowych przestrzeni nazw, żadnych nowych klas, żadnych odmiennych sygnatur metod.

Wymagania dotyczące wdrożenia MAUI i chmury: BarCode nie dokumentuje obsługi wdrożeń MAUI, Docker, AWS Lambda ani Azure. Zespoły tworzące wielopłatformowe aplikacje mobilne lub bezserwerowe potoki przetwarzania kodów kreskowych stwierdzają, że udokumentowane cele Barcodera nie obejmują tych scenariuszy.

Podstawowy problem

BarCode łączy wybór formatu z importami przestrzeni nazw i wymusza stosowanie potoku renderowania dla każdej operacji wyjściowej. Zmiana formatów lub typów danych wyjściowych wymaga zmian strukturalnych w kodzie:

// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 2,
    .BarHeightFor1DBarcode = 50
})

Using stream As FileStream = File.OpenWrite("barcode.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode wyraża tę samą operację jako pojedyncze wywołanie łańcuchowe:

// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

IronBarcode a Barcoder: porównanie funkcji

Funkcja BarCode IronBarcode
Wymagane pakiety NuGet Minimum 2 (BarCode + BarCode.Renderer.Image) 1 (IronBarcode)
Generowanie BarCode Tak Tak
Odczytywanie / dekodowanie BarCode Nie Tak
Klasy koderów dla poszczególnych formatów Tak — Code128Encoder, QrEncoder, DataMatrixEncoder, itp. Nie — enum BarcodeEncoding
Importy przestrzeni nazw według formatu Tak — Barcoder.Code128, Barcoder.Qr, Barcoder.DataMatrix Nie — tylko using IronBarCode
Metody wyjściowe obiektu wynikowego Nie — IBarcode nie ma metod zapisu Tak — GeneratedBarcode ma SaveAsPng, ToPngBinaryData, ToStream
Odczytywanie plików PDF Nie Tak — BarcodeReader.Read(path)
QR z logo Nie Tak — .AddBrandLogo(path)
Obsługa platformy .NET Framework Renderer obrazów typu "drop-in" .NET Framework 4.6.2+
Obsługa .NET 9 Niejasna / ograniczona aktywność Tak
Obsługa MAUI Nie Tak — iOS, Android, Windows, macOS
Docker / Azure / AWS Lambda Brak dokumentacji Tak
Licencja MIT (open source) Commercial — Lite $999, Plus $1,499, Professional $2,999, Unlimited $5,999
Kontrola prędkości czytania Nie Tak — enum ReadingSpeed
Wykrywanie wielu kodów BarCode Nie Tak — opcja ExpectMultipleBarcodes

Szybki start: Migracja z BarCode do IronBarcode

Krok 1: Zastąp pakiet NuGet

Usuń wszystkie pakiety BarCode ze swojego projektu:

dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
SHELL

Jeśli dodałeś również renderer SVG:

dotnet remove package Barcoder.Renderer.Svg
dotnet remove package Barcoder.Renderer.Svg
SHELL

Zainstaluj IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

Krok 2: Aktualizacja przestrzeni nazw

Usuń wszystkie instrukcje using Barcoder.* z każdego pliku w projekcie:

// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
$vbLabelText   $csharpLabel

Zastąp je wszystkie jedną dyrektywą using:

using IronBarCode;
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Krok 3: Inicjalizacja licencji

Dodaj inicjalizację licencji podczas uruchamiania aplikacji — Program.cs, Startup.cs lub MauiProgram.cs:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Bezpłatny klucz próbny jest dostępny na stronie ironsoftware.com.

Przykłady migracji kodu

Generowanie kodu 128

Podejście BarCode:

using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 2,
    .BarHeightFor1DBarcode = 50
})

Using stream As FileStream = File.OpenWrite("barcode.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");
// NuGet: dotnet add package IronBarcode
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

Zarządzanie Code128Encoder, ImageRenderer, ImageRendererOptions oraz strumieniami zostało całkowicie usunięte. Format określany jest jako BarcodeEncoding.Code128 na zunifikowanej klasie BarcodeWriter. Metody wyjściowe znajdują się bezpośrednio na zwróconym obiekcie GeneratedBarcode. Dokumentacja dotycząca generowania kodów kreskowych w IronBarcode obejmuje dostosowywanie stylu, marginesów i kolorów.

Generowanie kodów QR

Podejście BarCode:

using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;

IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 4
});

using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;

IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 4
});

using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Qr
Imports Barcoder.Renderers

Dim barcode As IBarcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 4
})

Using stream = File.OpenWrite("qr.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

Drugi parametr do CreateQrCode to wyjściowy wymiar w pikselach. Domyślny poziom korekty błędów jest rozsądny i można go w razie potrzeby dostosować.IronBarcode obsługuje również operację, która nie jest możliwa w BarCode — osadzanie logo marki w środku kodu QR:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")
$vbLabelText   $csharpLabel

Generowanie kodów DataMatrix

Podejście BarCode:

using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;

IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 5
});

using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;

IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 5
});

using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.DataMatrix
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = DataMatrixEncoder.Encode("ITEM-XYZ-001")

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 5
})

Using stream As FileStream = File.OpenWrite("datamatrix.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
    .SaveAsPng("datamatrix.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
    .SaveAsPng("datamatrix.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("datamatrix.png")
$vbLabelText   $csharpLabel

Wzór jest identyczny do Code128 — zmienia się tylko wartość BarcodeEncoding. Bez importowania nowych przestrzeni nazw, bez innych klas, bez innych sygnatur metod.

Kontrola rozmiaru pliku wyjściowego

Barcoder używa PixelSize jako mnożnika skali na rozmiarze modułu kodu kreskowego i BarHeightFor1DBarcode dla wysokości 1D — nie ma bezpośredniego API szerokości/wysokości.

Podejście BarCode:

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 3,
    BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 3,
    BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports System.IO

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 3,
    .BarHeightFor1DBarcode = 80
})

Using stream As FileStream = File.OpenWrite("barcode.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

.ResizeTo(width, height) przyjmuje jawne wymiary w pikselach. Łączy się z innymi metodami wyjściowymi na tym samym obiekcie GeneratedBarcode.

Pobieranie danych binarnych zamiast pliku

Podejście BarCode:

using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2
});

using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2
});

using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 2
})

Using ms As New MemoryStream()
    renderer.Render(barcode, ms)
    Dim pngBytes As Byte() = ms.ToArray()
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
using IronBarCode;

byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports IronBarCode

Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128).ToPngBinaryData()
$vbLabelText   $csharpLabel

Wzór MemoryStream i ToArray() zastąpiony został przez pojedyncze wywołanie metody chainowanej na GeneratedBarcode.

Odczytywanie BarCodes (nowa funkcja)

BarCode nie posiada API do odczytu. Jeśli wcześniej dodano drugą bibliotekę do odczytu, można ją usunąć.IronBarcode odczytuje dane z plików, tablic bajtów, strumieni i plików PDF przy użyciu tego samego pakietu, który służy do generowania.

Podejście IronBarcode:

using IronBarCode;

// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
}

// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");

// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
    Console.WriteLine(result.Value);

// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
using IronBarCode;

// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
}

// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");

// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
    Console.WriteLine(result.Value);

// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
Imports IronBarCode

' Read from image file
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Format: {result.Format}")
Next

' Read from PDF natively — no image extraction step, no extra dependency
Dim pdfResults = BarcodeReader.Read("invoice.pdf")

' Read multiple barcodes from one image
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-sheet.png", options)
For Each result In multiResults
    Console.WriteLine(result.Value)
Next

' Read from a stream directly
Using fileStream = File.OpenRead("barcode.png")
    Dim streamResults = BarcodeReader.Read(fileStream)
End Using
$vbLabelText   $csharpLabel

Dokumentacja dotycząca odczytu kodów kreskowych IronBarcode obejmuje wielostronicowe pliki PDF, odczyt obszarów zainteresowania oraz opcje optymalizacji wydajności.

Wyjście SVG

Podejście BarCode:

using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
Imports Barcoder.Renderers

Dim svgRenderer = New SvgRenderer()
Using stream = File.OpenWrite("barcode.svg")
    svgRenderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .SaveAsSvg("barcode.svg");
using IronBarCode;

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .SaveAsSvg("barcode.svg");
Imports IronBarCode

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
    .SaveAsSvg("barcode.svg")
$vbLabelText   $csharpLabel

Pakiet Barcoder.Renderer.Svg można usunąć, gdy wszystkie miejsca renderujące SVG zostaną zmigrowane.

Dokumentacja API BarCode do IronBarcode

BarCode IronBarcode
Code128Encoder.Encode("data", false) BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
QrEncoder.Encode("data", ErrorCorrectionLevel.M) QRCodeWriter.CreateQrCode("data", 500)
DataMatrixEncoder.Encode("data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix)
new ImageRenderer(new ImageRendererOptions { ... }) Nie jest potrzebne
renderer.Render(barcode, fileStream) .SaveAsPng(path)
renderer.Render(barcode, memoryStream) + ms.ToArray() .ToPngBinaryData()
IBarcode GeneratedBarcode
PixelSize = 2, BarHeightFor1DBarcode = 50 .ResizeTo(width, height)
SvgRenderer + renderer.Render(barcode, stream) .SaveAsSvg(path)
Brak API do odczytu BarcodeReader.Read(path / stream / bytes / pdf)
2 pakiety — Barcoder + Barcoder.Renderer.Image 1 pakiet — IronBarcode
Format przestrzeni nazw na kodera (Barcoder.Code128, Barcoder.Qr, itp.) BarcodeEncoding enum, pojedyncza przestrzeń nazw

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: IBarcode nie posiada metod zapisywania

Barcoder: Kod, który przechowuje zmienną IBarcode i przekazuje ją później do renderera, stosuje wzór renderowania odroczonego. Każda metoda pomocnicza, która akceptuje IBarcode i wywołuje renderer.Render() musi zostać srefaktoryzowana.

Rozwiązanie: Zmień odwołania do typów IBarcode na GeneratedBarcode. Obiekt GeneratedBarcode przenosi swoje metody wyjściowe z nim — przekaż go do dowolnej metody, która potrzebuje zapisać lub zrównać wynik:

//IronBarcode— GeneratedBarcode carries output methods
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");

static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
    barcode.SaveAsPng(path);
}
//IronBarcode— GeneratedBarcode carries output methods
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");

static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
    barcode.SaveAsPng(path);
}
Imports IronBarCode

Dim barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
SaveBarcodeToFile(barcode, "output.png")

Private Sub SaveBarcodeToFile(barcode As GeneratedBarcode, path As String)
    barcode.SaveAsPng(path)
End Sub
$vbLabelText   $csharpLabel

Wyszukiwanie renderer.Render( w rozwiązaniu znajdzie wszystkie miejsca renderowania odroczonego.

Problem 2: PixelSize nie ma bezpośredniego odpowiednika

Barcoder: PixelSize jest mnożnikiem skali na naturalnym rozmiarze modułu kodu kreskowego. Wymiary wyjściowe zależą od długości treści, formatu i wystąpienia tego mnożnika. BarHeightFor1DBarcode kontroluje niezależnie wysokość 1D. Nie ma bezpośredniej specyfikacji szerokości/wysokości.

Rozwiązanie: Zmierz rzeczywisty pikselowy wyjściowy kod Barcoder, który istnieje, i przekaż te wartości do .ResizeTo(width, height):

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .ResizeTo(300, 80)
    .SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .ResizeTo(300, 80)
    .SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
    .ResizeTo(300, 80) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

Problem 3: Nagromadzenie importów przestrzeni nazw Format

Barcoder: Każdy używany w projekcie format kodu kreskowego dodaje dyrektywę using Barcoder.[Format] do każdego pliku, który go używa. Projekt używający Code128, QR i DataMatrix zazwyczaj ma trzy format-specyficzne importy na plik plus using Barcoder i using Barcoder.Renderers.

Rozwiązanie: Przeprowadź wyszukiwanie wszystkich instrukcji using Barcoder i zastąp je wszystkie using IronBarCode;:

grep -rn "using Barcoder" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
SHELL

Każdy wynik to linia do usunięcia, zastąpiona pojedynczą dyrektywą using IronBarCode; raz na plik.

Problem 4: Błędy synchronizacji wersji pakietów

Barcoder: Budowanie po zaktualizowaniu tylko jednego z Barcoder lub Barcoder.Renderer.Image może powodować błędy typu-resolucji, ponieważ te dwa pakiety mogą nie być kompatybilne w różnych wersjach.

Rozwiązanie: Po usunięciu obu pakietów BarCode i zainstalowaniu IronBarcode, jest jeden pakiet i jedna wersja. Konflikty blokad pakietów w tej kategorii zostały wyeliminowane. Zweryfikuj, czy plik .csproj zawiera tylko pojedyncze odniesienie IronBarcode i nie ma pozostałych odniesień Barcoder.* przed budowaniem.

Lista kontrolna migracji BarCode

Zadania przed migracją

Przed wprowadzeniem zmian sprawdź swój kod źródłowy, aby zidentyfikować wszystkie miejsca użycia BarCode:

grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
SHELL

Dokumentuj wszystkie lokalizacje, gdzie IBarcode jest przechowywana jako zmienna typ lub przekazywana jako parametr metody — są to strony renderowania odroczonego, które wymagają najwięcej uwagi. Zanotuj wszystkie wartości PixelSize i BarHeightFor1DBarcode oraz zmierz odpowiadające wymiary wyjściowe.

Zadania związane z aktualizacją kodu

  1. Usuń pakiet NuGet Barcoder ze wszystkich projektów
  2. Usuń pakiet NuGet Barcoder.Renderer.Image ze wszystkich projektów
  3. Usuń pakiet NuGet Barcoder.Renderer.Svg, jeśli jest obecny
  4. Zainstaluj pakiet NuGet IronBarcode
  5. Dodaj IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; podczas uruchamiania aplikacji
  6. Zastąp wszystkie instrukcje using Barcoder.* using IronBarCode;
  7. Zastąp Code128Encoder.Encode(...) BarcodeWriter.CreateBarcode(..., BarcodeEncoding.Code128)
  8. Zastąp QrEncoder.Encode(...) QRCodeWriter.CreateQrCode(..., size)
  9. Zastąp DataMatrixEncoder.Encode(...) BarcodeWriter.CreateBarcode(..., BarcodeEncoding.DataMatrix)
  10. Usuń wszystkie konstrukcje new ImageRenderer(new ImageRendererOptions {...})
  11. Zastąp renderer.Render(barcode, fileStream) .SaveAsPng(path) na GeneratedBarcode
  12. Zastąprenderer.Render(barcode, memoryStream) + ms.ToArray()``.ToPngBinaryData()
  13. Zastąp użycie SvgRenderer .SaveAsSvg(path)
  14. Zmień odwołania typu IBarcode na GeneratedBarcode
  15. Zastąp opcje PixelSize / BarHeightFor1DBarcode .ResizeTo(width, height)

Testy po migracji

  • Sprawdź, czy każdy wygenerowany format BARCODE-a skanuje się poprawnie za pomocą standardowego skanera lub własnego czytnika IronBarcode
  • Porównaj wymiary wizualnego wyjścia z przed migracji — potwierdź, że wartości .ResizeTo() dają równoważne rozmiary
  • Sprawdź wynik kodu QR za pomocą skanera w telefonie, aby upewnić się, że poziom korekcji błędów jest odpowiedni
  • Sprawdź, czy pliki SVG wyświetlają się poprawnie w przeglądarce i podczas drukowania, jeśli w projekcie używasz SVG
  • Jeśli usunięto drugą bibliotekę czytania, zweryfikuj, że BarcodeReader.Read() produkuje równoważne zdekodowane wartości dla tych samych wejść
  • Sprawdź odczyt plików PDF, jeśli Twój projekt przetwarza dokumenty PDF — upewnij się, że wielostronicowe pliki PDF są odczytywane poprawnie na wszystkich stronach
  • Uruchom kompilację z zerowymi pozostałymi odniesieniami do Barcoder.* — błędy kompilatora wskazują na pominięte lokalizacje migracji

Kluczowe korzyści wynikające z migracji do IronBarcode

Ujednolicona zależność pakietów: Jeden pakiet NuGet zastępuje dwa (lub trzy, jeśli używano również renderera SVG). Jedna wersja do śledzenia, jeden dziennik zmian do monitorowania i brak problemów z kompatybilnością między pakietami podczas aktualizacji zależności. Złożoność .csproj oraz packages.lock.json maleje natychmiastowo.

Możliwość odczytu natywnego: Aplikacje, które wcześniej wymagały drugiej biblioteki do odczytu kodów kreskowych, mogą zostać skonsolidowane w IronBarcode. BarcodeReader.Read() akceptuje pliki obrazów, tablice bajtów, strumienie i pliki PDF za pośrednictwem tego samego API, z wbudowaną detekcją wielokrotnych kodów oraz optymalizacją prędkości czytania.

Selekcja formatu jako konfiguracja: Dodanie nowego formatu kodu kreskowego do istniejącego projektu to jedno słowo zmiany w wartości enum BarcodeEncoding w istniejącym wywołaniu CreateBarcode. Bez importowania nowych przestrzeni nazw, bez nowych klas koderów i bez nowych pakietów. Dzięki temu rozszerzanie formatu przebiega płynnie w miarę ewolucji wymagań produktowych.

Jawne wymiary wyjściowe: .ResizeTo(width, height) zastępuje w systemie mnożnikowym PixelSize mnożnik z jawną specyfikacją pikseli. Związek między kodem a wynikiem jest bezpośredni i przewidywalny, niezależny od długości treści BarCode lub rozmiaru modułu specyficznego dla danego formatu.

Rozszerzony zakres obsługiwanych platform:IronBarcode obsługuje .NET Framework od wersji 4.6.2 do .NET 9, wdrożenia MAUI na systemach iOS, Android, Windows i macOS oraz udokumentowane wdrożenia w Dockerze, AWS Lambda i Azure Functions. Zespoły, których wymagania platformowe wykraczają poza .NET Core, nie napotkają luki w wsparciu frameworka, który wpływa na Barcoder.Renderer.Image.

Aktywna konserwacja i przyszła kompatybilność:IronBarcode regularnie wydaje aktualizacje wraz z udokumentowanym harmonogramem kompatybilności z platformą .NET. Aktywny tempo wydania utrzymuje bibliotekę na bieżąco z aktualnymi wersjami .NET, co nie jest gwarantowane w bibliotece z ograniczoną ostatnio aktywnością wydania.

Często Zadawane Pytania

Dlaczego warto przejść z Barcoder na IronBarcode?

Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.

Jak zastąpić wywołania API Barcoder za pomocą IronBarcode?

Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.

Jak bardzo zmienia się kod podczas migracji z Barcoder do IronBarcode?

Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.

Czy podczas migracji muszę mieć zainstalowane zarówno Barcoder, jak i IronBarcode?

Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.

Jaka jest nazwa pakietu NuGet dla IronBarcode?

Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.

W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Barcoder?

IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.

Czy IronBarcode automatycznie wykrywa wszystkie formaty kodów kreskowych po migracji z Barcodera?

Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.

Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?

Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.

W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?

Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.

Jakie właściwości wyników ulegają zmianie podczas migracji z Barcoder do IronBarcode?

Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.

Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?

Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.

Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?

Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie