IRONSOFTWAREHOME
FILMY

Migracja z ZXing.Net do IronBarcode

Curtis Chau
Curtis Chau
Updated: 1 sierpnia 2026

Niniejszy przewodnik obejmuje kompletną migrację z ZXing.Net do IronBarcode for .NET dla aplikacji .NET, które odczytują i generują kody kreskowe. Dotyczy usuniecia podstawowego pakietu ZXing.Net i pakietow wiazacych, eliminacji obejsc PdfiumViewer tam, gdzie wystepuja, oraz zastapienia kazdego stanu BarcodeReader instancjizacja z uzyciem statycznego API IronBarcode. Każda sekcja zawiera kod "przed" i "po" zaczerpnięty z najczęściej spotykanych wzorców w integracjach ZXing.Net.

Dlaczego warto przejść z ZXing.Net

ZXing.Net od ponad dziesięciu lat służy społeczności .NET jako bezpłatna biblioteka BARCODE na licencji Apache 2.0. Jednak wraz ze wzrostem skali lub złożoności aplikacji niektóre ograniczenia architektoniczne przekładają się na koszty operacyjne.

Bezpieczenstwo w watkach: BarcodeReader z ZXing.Net jest obiektem stanowiskowym. W dokumentacji biblioteki zaznaczono, że instancje nie mogą być współdzielone między wątkami. W praktyce oznacza to, że każda ścieżka przetwarzania współbieżnego — każda akcja kontrolera obsługująca równoczesne żądania, każde zadanie w równoległej partii — musi przydzielić, skonfigurować i odrzucić własny czytnik. Wraz ze wzrostem liczby żądań ten wzorzec alokacji powoduje wymierną presję na pamięć. Alternatywa ThreadLocal<BarcodeReader> zmniejsza czestotliwosc przydzielania, ale wprowadza wlasna zlozonosc przy usuwaniu. W obu przypadkach poprawność w warunkach współbieżności jest problemem wywołującego, a nie gwarancją zapewnianą przez bibliotekę.

Ryzyko specyfikacji formatu: ZXing.Net wymaga, aby reader.Options.PossibleFormats byl wypełniony przed kazdą operacja dekodowania. Kod kreskowy w formacie nieobecnym na tej liście zwraca null — brak wyjątku, brak ostrzeżenia, brak wskazania, że kod kreskowy był obecny, ale nierozpoznany. Dla aplikacji otrzymujących dokumenty od zewnętrznych partnerów, to zachowanie niewidocznego braku jest ryzykiem niezawodności: błędnie wysłane zamówienie, pominięta rejestracja pacjenta lub wpis do audytu, który nigdy się nie zapisze, mogą wywodzić się z listy formatów, która była skonfigurowana dla poprzedniego wymagania i nigdy nie zaktualizowana.

Luka w przetwarzaniu plików PDF: ZXing.Net odczytuje wyłącznie pliki bitmapowe. Gdy dokumenty źródłowe są w formacie PDF — faktury, listy przewozowe, certyfikaty zgodności — użytkownicy muszą zintegrować oddzielną bibliotekę do renderowania plików PDF (najczęściej jest to PdfiumViewer), zaimplementować pętlę wyliczającą strony, skonfigurować DPI, zarządzać plikami tymczasowymi oraz obsługiwać czyszczenie zarówno w przypadku powodzenia, jak i niepowodzenia. Jest to od 30 do 50 wierszy kodu infrastruktury na każdą integrację, który służy wyłącznie do konwersji tego, czego ZXing.Net nie może odczytać (pliki PDF), na to, co może (mapy bitowe). Ta infrastruktura ma swoje własne zależności, własne wymagania dotyczące wdrażania i własne tryby awarii.

Fragmentacja powiązań platformowych: Funkcja ładowania obrazów w ZXing.Net jest podzielona na pakiety powiązań specyficzne dla poszczególnych platform. Wiazanie Windows uzywa System.Drawing.Bitmap; wiazanie wieloplatformowe uzywa SixLabors.ImageSharp z innym parametrem typu generycznego i inna using dyrektywa. Projekt, ktory zaczyna sie na Windows i pozniej jest konteneryzowany na Linux, musi zmienic zarowno swoje odniesienia NuGet, jak i kod ladowania obrazow. Dwie ścieżki kodu dla tej samej operacji zwiększają powierzchnię podatną na błędy i utrudniają wprowadzanie przyszłych zmian w warstwie skanującej.

Podstawowy problem

Najlepszym przykładem architektury ZXing.Net jest różnica między wywołaniem jednowątkowym a współbieżnym. W ZXing.Net przetwarzanie współbieżne wymaga utworzenia pełnego obiektu czytnika dla każdej operacji równoległej:

// ZXing.Net: full reader instantiation and configuration on every parallel task
Parallel.ForEach(files, file =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(file);
    var result = reader.Decode(bitmap);
    if (result != null)
        processed[file] = result.Text;
});

IronBarcode całkowicie usuwa obiekt. Wywołanie statyczne jest takie samo, niezależnie od tego, czy działa na jednym wątku, czy na stu:

// IronBarcode: static call, same code for single-threaded and concurrent use
Parallel.ForEach(files, file =>
{
    var result = BarcodeReader.Read(file).FirstOrDefault();
    if (result != null)
        processed[file] = result.Value;
});

##IronBarcode a ZXing.Net: porównanie funkcji

FunkcjaZXing.NetIronBarcode
LicencjaApache 2.0 (bezpłatna)Komercjalne
Bezpieczeństwo wątkówNie jest bezpieczne dla wątków — wymagana nowa instancja na wątekBezpieczne dla wątków statyczne API
Wykrywanie formatuReczenie — wymagane jest PossibleFormats listaAutomatyczne — ponad 50 formatów
Odczytywanie plików PDFNie — wymaga PdfiumViewer lub podobnego oprogramowaniaNatywny — pojedyncze wywołanie metody
Obsługa platformOddzielne pakiety wiązania dla każdej platformyPojedynczy pakiet, wszystkie platformy
Wiele BarCode'ów na jednym obrazieTak — DecodeMultipleTak — domyślne zachowanie
Generowanie kodów kreskowychZwraca Bitmap, wymaga recznego zapisuFluent API z wbudowanym wyjściem
Obsługa logo w kodzie QRNieTak
Kontrola kolorów kodów QRNieTak
Odzyskiwanie uszkodzonych kodów BarCodeTryHarder flagaKorekcja obrazu wspierana przez ML
Dodatkowe zależności DockerMoze wymagac libgdiplusNone
Komercjalne wsparcie SLANieTak
Wymagane pakiety NuGet2–3 (podstawowe + powiązane + opcjonalne ImageSharp)1

Szybki start

Krok 1: Usuń pakiety ZXing.Net

Usuń wszystkie pakiety ZXing.Net i powiązane z projektu:

dotnet remove package ZXing.Net
dotnet remove package ZXing.Net.Bindings.Windows.Compatibility
dotnet remove package ZXing.Net.Bindings.ImageSharp
dotnet remove package PdfiumViewer
SHELL

Jeśli natywne binaria PdfiumViewer zostały zainstalowane jako osobny pakiet:

dotnet remove package PdfiumViewer.Native.x64.v8-xfa
SHELL

Jesli Dockerfile zawiera apt-get install -y libgdiplus — dodane, aby wspierac System.Drawing przez wiazanie Windows na Linux — ta linia moze zostac usunieta po migracji.

Krok 2: Zainstaluj IronBarcode

dotnet add package IronBarcode
SHELL

Nie są wymagane żadne dodatkowe pakiety powiązań ani zależności specyficzne dla platformy. Ten sam pakiet NuGet działa na Windows, Linuksie, macOS i w kontenerach Docker. Dla szczegółów wdrożeniowych, przewodnik po instalacji IronBarcode na Docker i Linuksie obejmuje dokładny wzorzec Dockerfile.

Krok 3: Aktualizuj przestrzenie nazw i inicjalizuj licencję

Usuń wszystkie związane z ZXing przestrzenie nazw z każdego pliku korzystającego z operacji kodów kreskowych:

// Remove all of these:
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using PdfiumViewer;

// Add this single import:
using IronBarCode;

Dodaj inicjalizację licencji przy starcie aplikacji, przed jakimikolwiek operacjami na kodach kreskowych:

// Program.cs or Startup.cs — initialise once at startup
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

Klucz licencyjny jest simplem łańcuchem znakowym, ktory moze byc zaladowany z zmiennej srodowiskowej, appsettings.json, lub menadzerem tajemnic. Nie ma pliku do zlokalizowania i nie ma ścieżki do skonfigurowania.

Przykłady migracji kodu

Czytanie pojedynczego kodu kreskowego z obrazu

Ten przykład zastępuje najczęstszy wzór użycia ZXing.Net: tworzenie czytnika, konfigurowanie listy formatów, ładowanie bitmapy i dekodowanie.

Podejście ZXing.Net:

using ZXing;
using ZXing.Windows.Compatibility;
using System.Drawing;

public string ReadSingleBarcode(string imagePath)
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(imagePath);
    var result = reader.Decode(bitmap);

    return result?.Text ?? string.Empty;
}

Podejście IronBarcode:

using IronBarCode;

public string ReadSingleBarcode(string imagePath)
{
    var result = BarcodeReader.Read(imagePath).FirstOrDefault();
    return result?.Value ?? string.Empty;
}

Lista formatow, Bitmap alokacja i using blok sa usuniete.IronBarcode akceptuje bezpośrednią ścieżkę do pliku i automatycznie wykrywa wszystkie obsługiwane formaty. Wlasciwosc, ktora wczesniej zwracala zakodowany łańcuch znakow, byla result.Text w ZXing.Net; jest result.Value w IronBarcode.

Czytanie wszystkich kodów kreskowych z obrazu

Ten przyklad zastepuje DecodeMultiple, ktory w ZXing.Net wymaga wyczerpujacej listy formatow, aby uniknac cichych brakow.

Podejście ZXing.Net:

using ZXing;
using ZXing.Windows.Compatibility;
using System.Drawing;

public List<string> ReadAllBarcodes(string imagePath)
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.CODE_39,
        BarcodeFormat.EAN_13,
        BarcodeFormat.EAN_8,
        BarcodeFormat.UPC_A,
        BarcodeFormat.DATA_MATRIX,
        BarcodeFormat.PDF_417
    };
    reader.Options.TryHarder = true;

    using var bitmap = new Bitmap(imagePath);
    var results = reader.DecodeMultiple(bitmap);

    return results?.Select(r => r.Text).ToList() ?? new List<string>();
}

Podejście IronBarcode:

using IronBarCode;

public List<string> ReadAllBarcodes(string imagePath)
{
    return BarcodeReader.Read(imagePath)
        .Select(r => r.Value)
        .ToList();
}

BarcodeReader.Read zawsze zwraca kolekcje i nigdy nie zwraca null, eliminujac null-guard na wyniku. Aby dostosowac rownowage miedzy dokladnoscia a szybkoscia, zobacz przewodnik po opcjach szybkości odczytu, ktory omawia ReadingSpeed enum bez zawężania zakresu formatu.

Przetwarzanie wsadowe równoległe

Ten przykład pokazuje różnicę w bezpieczeństwie wątków w najbardziej bezpośredni sposób. ZXing.Net wymaga nowego czytnika przy każdej operacji równoległej;IronBarcode używa tego samego wywołania statycznego bez względu na poziom równoległości.

Podejście ZXing.Net:

using ZXing;
using ZXing.Windows.Compatibility;
using System.Collections.Concurrent;
using System.Drawing;

public Dictionary<string, string> ProcessBatch(IEnumerable<string> filePaths)
{
    var output = new ConcurrentDictionary<string, string>();

    Parallel.ForEach(filePaths, new ParallelOptions { MaxDegreeOfParallelism = 4 }, file =>
    {
        // ZXing.Net is not thread-safe — a new reader is required per parallel operation
        var reader = new BarcodeReader();
        reader.Options.PossibleFormats = new List<BarcodeFormat>
        {
            BarcodeFormat.QR_CODE,
            BarcodeFormat.CODE_128
        };

        using var bitmap = new Bitmap(file);
        var result = reader.Decode(bitmap);
        if (result != null)
            output[file] = result.Text;
    });

    return output.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}

Podejście IronBarcode:

using IronBarCode;
using System.Collections.Concurrent;

public Dictionary<string, string> ProcessBatch(IEnumerable<string> filePaths)
{
    var output = new ConcurrentDictionary<string, string>();
    var options = new BarcodeReaderOptions { MaxParallelThreads = 4 };

    Parallel.ForEach(filePaths, file =>
    {
        var result = BarcodeReader.Read(file, options).FirstOrDefault();
        if (result != null)
            output[file] = result.Value;
    });

    return output.ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
}

Nie ma instancji czytnika do ochrony lub izolowania. Dla wzorców asynchronicznych i konfiguracji liczby wątków, zobacz przewodnika po czytaniu kodów kreskowych asynchronicznie i wielowątkowo.

Wyodrębnianie kodów kreskowych z PDF

Ten przykład zastępuje pętlę renderowania PdfiumViewer. Jeśli dotychczasowa integracja używała Ghostscript lub iText zamiast PdfiumViewer, blok przed będzie różnił się szczegółami, ale strukturalnie identyczny: pętla enumeracji stron dostarczająca bitmapy do ZXing.Net.

Podejście ZXing.Net:

using ZXing;
using ZXing.Windows.Compatibility;
using PdfiumViewer;
using System.Drawing;
using System.Drawing.Imaging;

public List<string> ExtractBarcodesFromPdf(string pdfPath)
{
    var collected = new List<string>();

    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.PDF_417
    };

    using var document = PdfDocument.Load(pdfPath);
    for (int page = 0; page < document.PageCount; page++)
    {
        string temp = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
        try
        {
            using var rendered = document.Render(page, 200, 200, PdfRenderFlags.CorrectFromDpi);
            rendered.Save(temp, ImageFormat.Png);

            using var bmp = new Bitmap(temp);
            var decoded = reader.DecodeMultiple(bmp);
            if (decoded != null)
                collected.AddRange(decoded.Select(d => d.Text));
        }
        finally
        {
            if (File.Exists(temp))
                File.Delete(temp);
        }
    }

    return collected;
}

Podejście IronBarcode:

using IronBarCode;

public List<string> ExtractBarcodesFromPdf(string pdfPath)
{
    return BarcodeReader.Read(pdfPath)
        .Select(r => r.Value)
        .ToList();
}

Zależność PdfiumViewer, pętla renderowania stron, konfiguracja DPI, tworzenie plików tymczasowych i blok usuwania są usuwane.IronBarcodeczyta kody kreskowe z PDF-ów natywnie, przetwarzając automatycznie wszystkie strony.

Generowanie BarCode

Pisarz ZXing.Net zwraca Bitmap, ktory uzytkownicy musza zapisac uzywajac System.Drawing.Imaging.IronBarcode zwraca GeneratedBarcode z wbudowanymi metodami wyjscia.

Podejście ZXing.Net:

using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing;
using System.Drawing.Imaging;

public void WriteCode128(string content, string outputPath)
{
    var writer = new BarcodeWriter
    {
        Format = BarcodeFormat.CODE_128,
        Options = new EncodingOptions
        {
            Width = 400,
            Height = 120,
            Margin = 10
        }
    };

    using var bitmap = writer.Write(content);
    bitmap.Save(outputPath, ImageFormat.Png);
}

Podejście IronBarcode:

using IronBarCode;

public void WriteCode128(string content, string outputPath)
{
    BarcodeWriter.CreateBarcode(content, BarcodeEncoding.Code128)
        .ResizeTo(400, 120)
        .SaveAsPng(outputPath);
}

Jesli potrzebne jest wyjscie binarne zamiast zapisu do pliku, ToPngBinaryData() i ToJpegBinaryData() sa dostepne na zwroconym obiekcie GeneratedBarcode bez jakiejkolwiek kanalizacji MemoryStream.

Odniesienie mapowania ZXing.Net API do IronBarcode

ZXing.NetIronBarcodeUwagi
new BarcodeReader()Statyczne — brak instancjiBarcodeReader.Read(...) jest statycznym wywołaniem
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... }Nie jest potrzebneAutomatyczne wykrywanie obejmuje wszystkie 50+ formatów
reader.Options.TryHarder = trueSpeed = ReadingSpeed.BalancedDostrajanie dokladnosci poprzez BarcodeReaderOptions
reader.Decode(bitmap)BarcodeReader.Read(imagePath).FirstOrDefault()Przekaz sciezke do pliku — konstrukcja Bitmap nie jest potrzebna
reader.DecodeMultiple(bitmap)BarcodeReader.Read(imagePath)Zawsze zwraca kolekcję; never null
result.Textresult.ValueZmieniono nazwę właściwości
result.BarcodeFormatresult.FormatZmieniono nazwę właściwości
BarcodeFormat.QR_CODEBarcodeEncoding.QRCodeZmiana konwencji nazewnictwa enumów
BarcodeFormat.CODE_128BarcodeEncoding.Code128Zmiana konwencji nazewnictwa enumów
BarcodeFormat.EAN_13BarcodeEncoding.EAN13Zmiana konwencji nazewnictwa enumów
BarcodeFormat.DATA_MATRIXBarcodeEncoding.DataMatrixZmiana konwencji nazewnictwa enumów
BarcodeFormat.PDF_417BarcodeEncoding.PDF417Zmiana konwencji nazewnictwa enumów
new BarcodeWriter { Format = ..., Options = new EncodingOptions { ... } }BarcodeWriter.CreateBarcode(data, encoding)Fabryka statyczna, brak obiektu opcji
writer.Write(data) zwraca Bitmap.SaveAsPng(path) / .ToPngBinaryData()Wbudowane wyjscie na GeneratedBarcode
EncodingOptions { Width, Height }.ResizeTo(width, height)Płytki metod rozmiaru
Brak obsługi plików PDFBarcodeReader.Read("file.pdf")Wsparcie natywne PDF, wszystkie strony

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

Problem 1: Wzorce instancjowania BarcodeReader

ZXing.Net: Uzytkownicy tworza new BarcodeReader(), ustawiaja reader.Options.PossibleFormats, laduja Bitmap, wywoluja reader.Decode(bitmap) lub reader.DecodeMultiple(bitmap) i czytaja result.Text.

Rozwiązanie: Usuń całkowicie instancję. Zamień cały wzorzec na statyczne wywołanie:

// Before: reader creation + format config + bitmap + decode + result.Text
// After:
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
var value = result?.Value ?? string.Empty;

Przeszukaj baze kodu pod katem new BarcodeReader(), aby znalezc kazda instancje. Każda jest usunięta, nie przekształcona.

Problem 2: Usunięcie bloku PossibleFormats

ZXing.Net: Każde wywołanie dekodowania jest poprzedzone przypisaniem reader.Options.PossibleFormats = new List<BarcodeFormat> { ... }. Te listy są często długie i specyficzne dla projektu.

Rozwiazanie: Usun kazdy blok przypisania PossibleFormats w calosci.IronBarcode wykonuje automatyczne wykrywanie formatu; żadna lista formatów nie jest akceptowana ani wymagana. Jesli flaga TryHarder = true byla ustawiona wraz z lista formatow, zastep ja Speed = ReadingSpeed.Balanced na obiekcie BarcodeReaderOptions, jesli potrzebne jest dostrajanie dokladnosci.

Problem 3: Czyszczenie pakietów powiązań

ZXing.Net: Projekty uzywajace ZXing.Net.Bindings.Windows.Compatibility maja kod odwolujacy sie do typu wejscia System.Drawing.Bitmap. Projekty uzywajace ZXing.Net.Bindings.ImageSharp nawoluja sie do SixLabors.ImageSharp.Image<Rgba32>. Oba wzorce przestają działać po usunięciu pakietów powiązań.

Rozwiązanie: Usuń oba pakiety powiązań i zastąp cały kod ładowania obrazów. IronBarcode's BarcodeReader.Read akceptuje lancuch sciezki do pliku, byte[], Stream lub Uri — konstrukcja Bitmap lub Image<t> nie jest potrzebna. Pozostale using System.Drawing; importy, ktore istnialy wylacznie dla ladowania Bitmap, rowniez mozna usunac.

Problem 4: Odniesienie do result.Text na result.Value

ZXing.Net: Odczytana wartosc kodu kreskowego jest uzyskiwana za pomoca result.Text. Format kodu kreskowego jest uzyskiwany za pomoca result.BarcodeFormat.

Rozwiazanie: Zastap result.Text result.Value i result.BarcodeFormat result.Format w calym zakresie baz kodu. Obie zmiany to proste zmiany nazw właściwości bez różnic w zachowaniu.

Lista kontrolna migracji ZXing.Net

Zadania przed migracją

Przeprowadź audyt bazy kodu, aby znaleźć wszystkie odniesienia do ZXing.Net przed wprowadzeniem zmian:

grep -r "using ZXing" --include="*.cs" .
grep -r "new BarcodeReader" --include="*.cs" .
grep -r "PossibleFormats" --include="*.cs" .
grep -r "BarcodeFormat\." --include="*.cs" .
grep -r "reader\.Decode\|reader\.DecodeMultiple" --include="*.cs" .
grep -r "result\.Text\|result\.BarcodeFormat" --include="*.cs" .
grep -r "new BarcodeWriter\|writer\.Write\|EncodingOptions" --include="*.cs" .
grep -r "PdfiumViewer\|PdfDocument\.Load" --include="*.cs" .
grep -r "using System\.Drawing" --include="*.cs" .
SHELL

Udokumentuj, ktore pliki odnosza sie do pakietow wiazacych ZXing (Windows vs ImageSharp) i zanotuj, gdzie System.Drawing.Bitmap jest uzywane wylacznie do wejscia ZXing. Zrecenzuj Dockerfile (jesli obecny) pod katem instalacji libgdiplus.

Zadania związane z aktualizacją kodu

  1. Usun ZXing.Net, ZXing.Net.Bindings.Windows.Compatibility, ZXing.Net.Bindings.ImageSharp, i PdfiumViewer pakiety NuGet
  2. Zainstaluj pakiet NuGet IronBarcode
  3. Dodaj IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; do uruchamiania aplikacji
  4. Zastap wszystkie importy using ZXing* i using SixLabors.ImageSharp* z using IronBarCode;
  5. Usun kazda instancjizacje new BarcodeReader()
  6. Usun kazdy blok reader.Options.PossibleFormats = ...
  7. Zastap reader.Decode(bitmap) BarcodeReader.Read(imagePath).FirstOrDefault()
  8. Zastap reader.DecodeMultiple(bitmap) BarcodeReader.Read(imagePath)
  9. Zastap result.Text result.Value
  10. Zastap result.BarcodeFormat result.Format
  11. Zaktualizuj odniesienia enum BarcodeFormat.X do odpowiednikow BarcodeEncoding.X
  12. Replace new BarcodeWriter { Format = ..., Options = new EncodingOptions { ... } }with BarcodeWriter.CreateBarcode(data, encoding).ResizeTo(w, h)
  13. Zastap writer.Write(data) + bitmap.Save(...) .SaveAsPng(path) lub .ToPngBinaryData()
  14. Usun wszystkie importy using System.Drawing;, ktore istnialy wylacznie dla ladowania bitmap ZXing.Net
  15. Usuń pętlę renderowania stron PdfiumViewer tam, gdzie była wdrożona jako obejście dla PDF
  16. Usun libgdiplus z Dockerfile, jesli zostal dodany, aby wspierac System.Drawing na Linux

Testy po migracji

  • Zweryfikuj, że każdy format kodu kreskowego, który aplikacja była wcześniej skonfigurowana do wykrycia, jest poprawnie znajdowany
  • Przetestuj obrazy zawierajace formaty kodow kreskowych, ktore wczesniej byly wykluczone z listy PossibleFormats, aby potwierdzic, ze auto-detekcja je wybiera
  • Uruchom ścieżki przetwarzania równoległego pod obciążeniem i potwierdź brak sytuacji wyścigowych lub wyników zerowych
  • Jeśli aplikacja przetworzyła PDF-y za pomocą PdfiumViewer, dostarcz te same dane wejściowe PDF i potwierdź zgodność wartości kodów kreskowych
  • Potwierdź, że wygenerowane kody kreskowe (Code 128, QR Code itp.) zapewniają prawidłowy format wyjścia i wymiary
  • Na wdrozeniach Linux lub Docker, potwierdz, ze czytanie obrazu i czytanie PDF dzialaja bez libgdiplus
  • Uruchom pełny zestaw testów i porównaj wynik z przedmigracyjnym punktem odniesienia

Kluczowe korzyści wynikające z migracji do IronBarcode

Usunięty ciężar bezpieczeństwa wątków: Statyczne API IronBarcode całkowicie usuwa wzorzec instance per wątek. Nie ma czytnika do zinstancjonowania, zadnej listy formatow do skonfigurowania na watku, i zadnego ThreadLocal basenu do zarzadzania. To samo wywołanie jest poprawne zarówno w środowisku jednosesyjnowym, jak i wysoko równoległym, a poprawność współbieżności jest zapewniona przez bibliotekę, a nie delegowana do każdego wywołującego.

Automatyczne wykrywanie formatu: Usuniecie listy PossibleFormats eliminuje kategorie cichych bledow, ktore wystepuja, gdy dokumenty zawieraja formaty kodow kreskowych, o ktorych nie pomyslano podczas rozwoju. Aplikacje, które przetwarzają dokumenty od zewnętrznych partnerów lub działają w ramach ewoluujących standardów kodów kreskowych, nie wymagają już utrzymywania listy formatów, aby pozostały niezawodne.

Natywne przetwarzanie PDF: Pętla renderowania PdfiumViewer — jego enumeracja stron, konfiguracja DPI, cykl życia plików tymczasowych i kod czyszczenia — została całkowicie usunięta. Aplikacje, które wcześniej wymagały dwóch bibliotek (ZXing.Net i renderera PDF) do przetwarzania kodu kreskowego PDF, teraz używają jednej. Zmniejszenie wdrożonych zależności upraszcza zarówno powierzchnię kompilacji, jak i wdrożenia.

Pojedynczy pakiet wieloplatformowy: Wyeliminowano różnicę w pakietach wiążących pomiędzy wdrożeniami Windows i Linux. To samo wywolanie BarcodeReader.Read(path) kompiluje sie i dziala identycznie na wszystkich platformach docelowych, eliminujac potrzebe ochrony platformowej w kodzie ladowania obrazow i upraszczajac procesy rozwoju i konteneryzacji wieloplatformowej.

Zredukowany kod infrastruktury: Najważniejszym rezultatem migracji jest usunięcie otaczającej infrastruktury — bloków ładowania Bitmap, list formatów, pętli renderowania PdfiumViewer, pul ThreadLocal — które istniały w integracjach ZXing.Net, nie w celu pracy z kodami kreskowymi, ale aby spełnić wymagania architektoniczne biblioteki. Co pozostaje po migracji to sama logika kodu kreskowego. Dla dodatkowego kontekstu na temat wskaźników wykrywania i scenariuszy skanowania, porównanie skanerów ZXing.Net i IronBarcode dostarcza szerszej analizy.

Zwróć uwagę: Ghostscript, PDFium, ZXing.NET i iText są zarejestrowanymi znakami towarowymi ich odpowiednich właścicieli. Ta strona nie jest powiązana ani wspierana przez Artifex Software, Chromium Project, Google, ZXing.NET ani iText Group. Wszystkie nazwy produktów, loga i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.
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ęczników.

...
Czytaj więcej

Powiązane artykuły

Key in blue circle

Uzyskaj natychmiast swój darmowy 30-dniowy Klucz Testowy.

Your trial license will be sent to your email address

Brak ograniczeń. 100% dostępności. Bez karty kredytowej.

bullet_checkedNie wymaga karty kredytowej ani tworzenia kontaBrak ograniczeń. 100% dostępności. Bez karty kredytowej.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Zarezerwuj swoje darmowe Demo na żywo
Booking Badge

Zaufane przez miliony inżynierów na całym świecie

Logotypy klientów Iron Software
Otrzymaj swoje Konsultacja Bez Zobowiązań
Wypełnij poniższy formularz lub wyślij e-mail na sales@ironsoftware.com
Twoje dane zawsze będą utrzymywane w tajemnicy.
Zaufane przez miliony inżynierów na całym świecie
Logotypy klientów Iron Software
Otrzymaj swój darmowy Klucz Próbny na 30 dni natychmiast.
Nie wymaga karty kredytowej ani tworzenia konta