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

AWS vs Google Vision (Porównanie funkcji OCR)

Dynamsoft Label Recognizer wykonuje jedną rzecz wyjątkowo dobrze — wyodrębnianie MRZ z paszportów, skanowanie numerów VIN z pojazdów oraz odczytywanie ustrukturyzowanych etykiet z opakowań przemysłowych — i nie wykonuje żadnych innych zadań. Ta wąska specjalizacja staje się problemem budżetowym w momencie, gdy aplikacja wymaga dodatkowo ogólnego OCR dokumentów, ponieważ wtedy trzeba nabyć licencję naDynamsoft Label Recognizerdo MRZ, Dynamsoft BarCode Reader do kodów QR, Dynamsoft Document Normalizer do wykrywania krawędzi, a nadal szukać czwartej biblioteki do obsługi dokumentów całostronicowych. IronOCR obejmuje wszystkie te możliwości w jednym pakiecie NuGet przy $999 wieczystym.

Zrozumienie programu Dynamsoft Label Recognizer

Firma Dynamsoft Corporation z siedzibą w Vancouver w Kanadzie stworzyła swój produkt Label Recognizer w oparciu o konkretną propozycję: niezawodne rozpoznawanie tekstu strukturalnego nadającego się do odczytu maszynowego w ograniczonych formatach. Pakiet NuGet dla produktu to Dynamsoft.DotNet.LabelRecognizer, a jego licencjonowanie komercyjne działa wyłącznie na zasadzie subskrypcji rocznej — nie ma opcji wieczystej. Skontaktuj się z Dynamsoft w sprawie aktualnych stawek.

Model rozpoznawania biblioteki opiera się na szablonach. Konfigurujesz zadania rozpoznawania poprzez JSON settings API (AppendSettingsFromString), a następnie wywołujesz RecognizeFile lub RecognizeByFile dla plików obrazów. Wyniki są zwracane jako zbiory wyników wierszowych zawierające surowe ciągi tekstowe. Analiza tych ciągów znaków w celu uzyskania sensownych danych strukturalnych — przesunięcia pól, konwersje dat, sprawdzanie cyfr kontrolnych — leży całkowicie w Twojej odpowiedzialności.

Kluczowe cechy architektury Dynamsoft Label Recognizer:

  • Silnik rozpoznawania oparty na szablonach: wzorce MRZ, VIN i etykiet wymagają konfiguracji szablonu JSON przed rozpoznaniem
  • Tylko surowy wynik tekstowy: RecognizeFile zwraca obiekty LineResult z łańcuchami tekstowymi; brak parsowania pól strukturalnych
  • Wprowadzanie wyłącznie obrazów: brak natywnej obsługi plików PDF; Pliki PDF wymagają zewnętrznej konwersji na obrazy przed przetworzeniem
  • Licencjonowanie subskrypcji rocznej: Dostępne poziomy per urządzenie i per serwer; skontaktuj się z Dynamsoft w sprawie aktualnych stawek; no one-time purchase
  • Oddzielny produkt dla każdej funkcji: odczyt BarCode, normalizacja dokumentów i optymalizacja kamery wymagają osobno licencjonowanego produktu
  • Ograniczony zakres językowy: skupia się na formatach MRZ z alfabetem łacińskim; brak szerokiego wsparcia dla dokumentów wielojęzycznych

Interfejs API ustawień środowiska uruchomieniowego JSON

Każdy proces pracy wDynamsoft Label Recognizerrozpoczyna się od konfiguracji szablonu. Na przykład rozpoznawanie MRZ wymaga załadowania dokumentu JSON, który określa parametry rozpoznawania, modele znaków i odniesienia do regionów, zanim będzie można przystąpić do przetwarzania obrazu:

using Dynamsoft.DLR;

public class DynamsoftMrzService : IDisposable
{
    private readonly LabelRecognizer _recognizer;

    public DynamsoftMrzService(string licenseKey)
    {
        // Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey);
        _recognizer = new LabelRecognizer();

        // MRZ requires specific template configuration loaded as JSON
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _recognizer.AppendSettingsFromString(mrzTemplate);
    }

    public string ExtractRawMrz(string passportImagePath)
    {
        var results = _recognizer.RecognizeFile(passportImagePath);

        // Returns raw MRZ text lines only — no field parsing
        var mrzLines = new StringBuilder();
        foreach (var result in results)
        {
            foreach (var lineResult in result.LineResults)
            {
                mrzLines.AppendLine(lineResult.Text);
            }
        }
        return mrzLines.ToString().Trim();
    }

    public void Dispose() => _recognizer?.Dispose();
}
using Dynamsoft.DLR;

public class DynamsoftMrzService : IDisposable
{
    private readonly LabelRecognizer _recognizer;

    public DynamsoftMrzService(string licenseKey)
    {
        // Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey);
        _recognizer = new LabelRecognizer();

        // MRZ requires specific template configuration loaded as JSON
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _recognizer.AppendSettingsFromString(mrzTemplate);
    }

    public string ExtractRawMrz(string passportImagePath)
    {
        var results = _recognizer.RecognizeFile(passportImagePath);

        // Returns raw MRZ text lines only — no field parsing
        var mrzLines = new StringBuilder();
        foreach (var result in results)
        {
            foreach (var lineResult in result.LineResults)
            {
                mrzLines.AppendLine(lineResult.Text);
            }
        }
        return mrzLines.ToString().Trim();
    }

    public void Dispose() => _recognizer?.Dispose();
}
Imports Dynamsoft.DLR
Imports System.Text

Public Class DynamsoftMrzService
    Implements IDisposable

    Private ReadOnly _recognizer As LabelRecognizer

    Public Sub New(licenseKey As String)
        ' Static license initialization — must precede instance creation
        LabelRecognizer.InitLicense(licenseKey)
        _recognizer = New LabelRecognizer()

        ' MRZ requires specific template configuration loaded as JSON
        Dim mrzTemplate As String = "{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }"
        _recognizer.AppendSettingsFromString(mrzTemplate)
    End Sub

    Public Function ExtractRawMrz(passportImagePath As String) As String
        Dim results = _recognizer.RecognizeFile(passportImagePath)

        ' Returns raw MRZ text lines only — no field parsing
        Dim mrzLines As New StringBuilder()
        For Each result In results
            For Each lineResult In result.LineResults
                mrzLines.AppendLine(lineResult.Text)
            Next
        Next
        Return mrzLines.ToString().Trim()
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _recognizer?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

Wynik RecognizeFile to surowy tekst MRZ, taki jak P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<. Aby uzyskać Surname = "SMITH", GivenNames = "JOHN", DocumentNumber, DateOfBirth i ExpiryDate jako typowane właściwości, należy samodzielnie zaimplementować parser TD1/TD2/TD3. Dokumentacja Dynamsoft i pliki źródłowe w tym repozytorium szacują ten parser na około 150 linii kodu parsującego — obsługującego przesunięcia znaków, << separatory nazw, rozróżnianie dwu cyfrowego roku i weryfikację sumy kontrolnej — żadnej z tych rzeczy Dynamsoft nie dostarcza.

Zrozumienie IronOCR

IronOCR to komercyjna biblioteka OCR dla platformy .NET, oparta na zoptymalizowanym silniku Tesseract 5 z warstwą zarządzanego interfejsu API, która obsługuje przetwarzanie wstępne, formaty wejściowe, ustrukturyzowane dane wyjściowe oraz specjalistyczne parsowanie dokumentów. Instalacja to pojedyncza komenda NuGet: dotnet add package IronOcr. Brak natywnego zarządzania plikami binarnymi, brak konfiguracji folderu tessdata, brak plików konfiguracyjnych szablonów.

Kluczowe cechy:

  • Ogólnego przeznaczenia i specjalistyczne: Obsługuje OCR dokumentów całostronicowych, wielostronicowych plików PDF, partii zeskanowanych obrazów oraz formatów specjalistycznych (paszporty, BARCODE, tablice rejestracyjne) z tego samego pakietu
  • Automatyczny proces przetwarzania wstępnego: funkcje Deskew, DeNoise, Contrast, Binarize i EnhanceResolution działają bez ręcznej konfiguracji na danych wejściowych o niskiej jakości
  • Natywna obsługa plików PDF: bezpośredni odczyt zeskanowanych i cyfrowych plików PDF, w tym plików chronionych hasłem, bez konieczności zewnętrznej konwersji
  • Ustrukturyzowana hierarchia wyników: Wyniki przedstawiają strony, akapity, wiersze, słowa i ramki znaków wraz z wynikami pewności
  • Wbudowane odczytywanie kodów kreskowych: Włącz ocr.Configuration.ReadBarCodes = true i kody kreskowe są wyodrębniane razem z tekstem w tym samym przebiegu.
  • Ponad 125 pakietów językowych: każdy język instaluje się jako oddzielny pakiet NuGet; brak zarządzania folderami tessdata
  • Licencjonowanie wieczyste: $999 Lite, $1,499 Plus, $2,999 Professional — jednorazowy zakup, wszystkie platformy, wszystkie funkcje w zestawie.
  • Wdrażanie wielopłatformowe: Windows, Linux, macOS, Docker, AWS i Azure działają z tego samego pakietu bez konfiguracji specyficznej dla platformy

Porównanie funkcji

Funkcja Dynamsoft Label Recognizer IronOCR
Ogólne OCR dokumentów Nieobsługiwane Pełne wsparcie
Wyodrębnianie MRZ Specjalistyczne (tekst surowy) Wbudowane z analizowanymi polami
Natywne wprowadzanie plików PDF Nieobsługiwane Tak
Odczytywanie BarCode Oddzielny produkt (Dynamsoft BarCode Reader) Zintegrowane (ReadBarCodes)
Wynik w formacie PDF z możliwością wyszukiwania Nieobsługiwane Tak
Obsługa języków Ograniczone (Latin MRZ) Ponad 125 języków
Model licencyjny Tylko subskrypcja roczna Opcje wieczne + subskrypcyjne
Produkty wymagane do pełnego pokrycia 3+ 1

Szczegółowe porównanie funkcji

Funkcja Dynamsoft Label Recognizer IronOCR
Zakres rozpoznawania
Ogólne OCR dokumentów Nieobsługiwane Tak
Rozpoznawanie MRZ Specjalistyczne Tak (ReadPassport)
Rozpoznawanie numerów VIN Specjalistyczne Tak (za pomocą standardowego OCR)
Odczytywanie etykiet przemysłowych Specjalistyczne Tak
Rozpoznawanie pisma ręcznego Nieobsługiwane Tak
Wyodrębnianie tabel Nieobsługiwane Tak
Formaty danych wejściowych
Pliki graficzne (JPG, PNG, TIFF) Tak Tak
PDF (natywny) Nieobsługiwane Tak
Plik PDF chroniony hasłem Nieobsługiwane Tak
Tablica bajtów / strumień Tak Tak
Dokumenty wielostronicowe Ręczne agregowanie Tak (język ojczysty)
Formaty wyjściowe
Zwykły tekst Tak (nieprzetworzone linie) Tak
Pola ustrukturyzowane (przetworzone) Brak danych Tak (strony, wiersze, WORDy)
PDF z funkcją wyszukiwania Nieobsługiwane Tak
hOCR Nieobsługiwane Tak
Wyniki pewności Za wiersz Za słowo, wiersz i stronę
Przetwarzanie wstępne
Automatyczne przetwarzanie wstępne Podstawowe Tak (inteligentny potok)
Korekcja pochylenia / obrotu Ograniczone Tak
Usuwanie szumów Ograniczone Tak
Wzmocnienie kontrastu Ograniczone Tak
Normalizacja DPI Brak danych Tak
Możliwości integracji
Odczytywanie BarCode Oddzielny produkt Wbudowane
Normalizacja dokumentu Oddzielny produkt Nie jest wymagane
OCR oparte na regionie Tak (za pomocą szablonów) Tak (CropRectangle)
Przetwarzanie równoległe bezpieczne dla wątków Tak Tak
Platforma i wdrożenie
Windows Tak Tak
Linux Tak Tak
macOS Tak Tak
Docker Tak Tak
Azure / AWS Tak Tak
Srodowiska odizolowane / Offline Tak Tak
Licencjonowanie i koszty
Roczna subskrypcja Tak (skontaktuj się z Dynamsoft w sprawie stawek) Opcjonalnie
Licencja wieczysta Niedostępne Tak ($999 jeden raz)
Jeden pakiet zawierający wszystkie funkcje Nie (3+ produkty) Tak
Bezpłatna wersja próbna 30 dni Tak

Zakres specjalistyczny a ogólny

Najważniejszą decyzją architektoniczną podjętą przez firmę Dynamsoft jest stworzenie rozwiązania specjalistycznego, a nie ogólnego. Decyzja ta ma bezpośrednie konsekwencje dla każdej aplikacji, która zaczyna od odczytu MRZ lub etykiet, ale ostatecznie wymaga czegoś więcej.

Podejście firmy Dynamsoft

Dynamsoft Label Recognizer obsługuje dokładnie to, co opisują jego szablony JSON, i nic poza tym. Aplikacja do przetwarzania paszportów zbudowana na platformie Dynamsoft wymaga trzech produktów, zanim będzie mogła obsługiwać rzeczywisty przepływ dokumentów:

// Dynamsoft passport processing — MULTIPLE PRODUCTS REQUIRED

using Dynamsoft.DLR;  // Label Recognizer — for MRZ (annual subscription)
using Dynamsoft.DBR;  // Barcode Reader — for any barcodes (additional license)
// Plus: a separate OCR library — for full page text (more budget)

public class DynamsoftPassportProcessor : IDisposable
{
    private readonly LabelRecognizer _mrzRecognizer;
    private readonly BarcodeReader _barcodeReader;
    // private readonly SomeOtherOcrLibrary _fullTextOcr;  // third product

    public DynamsoftPassportProcessor(
        string mrzLicenseKey,
        string barcodeLicenseKey)
    {
        // License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey);
        _mrzRecognizer = new LabelRecognizer();

        // Configure MRZ template — JSON required before any recognition
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate);

        // Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();
    }

    public PassportResult ProcessPassport(string imagePath)
    {
        // Step 1: Wyodrębnianie MRZ — raw text only, no field parsing
        var mrzResults = _mrzRecognizer.RecognizeFile(imagePath);
        var mrzText = new StringBuilder();
        foreach (var r in mrzResults)
            foreach (var line in r.LineResults)
                mrzText.AppendLine(line.Text);

        // Step 2: Parse MRZ manually — your 150-line TD3 parser here
        var parsedMrz = ParseMrzManually(mrzText.ToString());

        // Step 3: Barcodes — second product, second API
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);

        // Step 4: Full page text — THIRD library, no Dynamsoft option
        // var fullText = _fullTextOcr.ReadImage(imagePath);

        return new PassportResult
        {
            ParsedMrz = parsedMrz,
            Barcodes = barcodeResults.Select(b => b.BarcodeText).ToList(),
            FullPageText = null  // requires a fourth product
        };
    }

    public void Dispose()
    {
        _mrzRecognizer?.Dispose();
        _barcodeReader?.Dispose();
    }
}
// Dynamsoft passport processing — MULTIPLE PRODUCTS REQUIRED

using Dynamsoft.DLR;  // Label Recognizer — for MRZ (annual subscription)
using Dynamsoft.DBR;  // Barcode Reader — for any barcodes (additional license)
// Plus: a separate OCR library — for full page text (more budget)

public class DynamsoftPassportProcessor : IDisposable
{
    private readonly LabelRecognizer _mrzRecognizer;
    private readonly BarcodeReader _barcodeReader;
    // private readonly SomeOtherOcrLibrary _fullTextOcr;  // third product

    public DynamsoftPassportProcessor(
        string mrzLicenseKey,
        string barcodeLicenseKey)
    {
        // License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey);
        _mrzRecognizer = new LabelRecognizer();

        // Configure MRZ template — JSON required before any recognition
        string mrzTemplate = @"{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }";
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate);

        // Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();
    }

    public PassportResult ProcessPassport(string imagePath)
    {
        // Step 1: Wyodrębnianie MRZ — raw text only, no field parsing
        var mrzResults = _mrzRecognizer.RecognizeFile(imagePath);
        var mrzText = new StringBuilder();
        foreach (var r in mrzResults)
            foreach (var line in r.LineResults)
                mrzText.AppendLine(line.Text);

        // Step 2: Parse MRZ manually — your 150-line TD3 parser here
        var parsedMrz = ParseMrzManually(mrzText.ToString());

        // Step 3: Barcodes — second product, second API
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);

        // Step 4: Full page text — THIRD library, no Dynamsoft option
        // var fullText = _fullTextOcr.ReadImage(imagePath);

        return new PassportResult
        {
            ParsedMrz = parsedMrz,
            Barcodes = barcodeResults.Select(b => b.BarcodeText).ToList(),
            FullPageText = null  // requires a fourth product
        };
    }

    public void Dispose()
    {
        _mrzRecognizer?.Dispose();
        _barcodeReader?.Dispose();
    }
}
Imports Dynamsoft.DLR  ' Label Recognizer — for MRZ (annual subscription)
Imports Dynamsoft.DBR  ' Barcode Reader — for any barcodes (additional license)
' Plus: a separate OCR library — for full page text (more budget)

Public Class DynamsoftPassportProcessor
    Implements IDisposable

    Private ReadOnly _mrzRecognizer As LabelRecognizer
    Private ReadOnly _barcodeReader As BarcodeReader
    ' Private ReadOnly _fullTextOcr As SomeOtherOcrLibrary  ' third product

    Public Sub New(mrzLicenseKey As String, barcodeLicenseKey As String)
        ' License each product independently
        LabelRecognizer.InitLicense(mrzLicenseKey)
        _mrzRecognizer = New LabelRecognizer()

        ' Configure MRZ template — JSON required before any recognition
        Dim mrzTemplate As String = "{
            ""LabelRecognizerParameterArray"": [{
                ""Name"": ""MRZ_Passport"",
                ""ReferenceRegionNameArray"": [""FullImage""],
                ""CharacterModelName"": ""MRZ""
            }]
        }"
        _mrzRecognizer.AppendSettingsFromString(mrzTemplate)

        ' Second product, second license key
        BarcodeReader.InitLicense(barcodeLicenseKey)
        _barcodeReader = New BarcodeReader()
    End Sub

    Public Function ProcessPassport(imagePath As String) As PassportResult
        ' Step 1: Wyodrębnianie MRZ — raw text only, no field parsing
        Dim mrzResults = _mrzRecognizer.RecognizeFile(imagePath)
        Dim mrzText = New StringBuilder()
        For Each r In mrzResults
            For Each line In r.LineResults
                mrzText.AppendLine(line.Text)
            Next
        Next

        ' Step 2: Parse MRZ manually — your 150-line TD3 parser here
        Dim parsedMrz = ParseMrzManually(mrzText.ToString())

        ' Step 3: Barcodes — second product, second API
        Dim barcodeResults = _barcodeReader.DecodeFile(imagePath)

        ' Step 4: Full page text — THIRD library, no Dynamsoft option
        ' Dim fullText = _fullTextOcr.ReadImage(imagePath)

        Return New PassportResult With {
            .ParsedMrz = parsedMrz,
            .Barcodes = barcodeResults.Select(Function(b) b.BarcodeText).ToList(),
            .FullPageText = Nothing  ' requires a fourth product
        }
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _mrzRecognizer?.Dispose()
        _barcodeReader?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

Powyższy kod nadal nie obsługuje danych wejściowych w formacie PDF. Jeśli skan paszportu zostanie dostarczony w formacie PDF zamiast JPEG, przed uruchomieniem jakiegokolwiek kodu należy dodać bibliotekę do renderowania plików PDF. Całkowita integracja dla rzeczywistego przepływu pracy: cztery produkty, cztery klucze licencyjne, cztery powierzchnie konserwacyjne.

Podejście IronOCR

IronOCR obsługuje ten sam proces przetwarzania paszportów — analizę MRZ, OCR całej strony, BARCODE i dane wejściowe w formacie PDF — w ramach jednego pakietu:

using IronOcr;

public class IronOcrPassportProcessor
{
    private readonly IronTesseract _ocr;

    public IronOcrPassportProcessor()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes included
    }

    public CompletePassportResult ProcessPassport(string imagePath)
    {
        // Structured MRZ fields — no manual parsing required
        var mrzData = _ocr.ReadPassport(imagePath);

        // Full page OCR + barcodes in the same call
        var fullResult = _ocr.Read(imagePath);

        return new CompletePassportResult
        {
            // MRZ fields are already parsed properties
            DocumentType    = mrzData.DocumentType,
            IssuingCountry  = mrzData.IssuingCountry,
            Surname         = mrzData.Surname,
            GivenNames      = mrzData.GivenNames,
            PassportNumber  = mrzData.DocumentNumber,
            Nationality     = mrzData.Nationality,
            DateOfBirth     = mrzData.DateOfBirth,
            ExpiryDate      = mrzData.ExpiryDate,
            RawMrz          = mrzData.MRZ,

            // Full page text from same package
            FullPageText    = fullResult.Text,

            // Barcodes alongside text — no separate product
            Barcodes        = fullResult.Barcodes.Select(b => b.Value).ToList(),

            Confidence      = fullResult.Confidence
        };
    }
}
using IronOcr;

public class IronOcrPassportProcessor
{
    private readonly IronTesseract _ocr;

    public IronOcrPassportProcessor()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes included
    }

    public CompletePassportResult ProcessPassport(string imagePath)
    {
        // Structured MRZ fields — no manual parsing required
        var mrzData = _ocr.ReadPassport(imagePath);

        // Full page OCR + barcodes in the same call
        var fullResult = _ocr.Read(imagePath);

        return new CompletePassportResult
        {
            // MRZ fields are already parsed properties
            DocumentType    = mrzData.DocumentType,
            IssuingCountry  = mrzData.IssuingCountry,
            Surname         = mrzData.Surname,
            GivenNames      = mrzData.GivenNames,
            PassportNumber  = mrzData.DocumentNumber,
            Nationality     = mrzData.Nationality,
            DateOfBirth     = mrzData.DateOfBirth,
            ExpiryDate      = mrzData.ExpiryDate,
            RawMrz          = mrzData.MRZ,

            // Full page text from same package
            FullPageText    = fullResult.Text,

            // Barcodes alongside text — no separate product
            Barcodes        = fullResult.Barcodes.Select(b => b.Value).ToList(),

            Confidence      = fullResult.Confidence
        };
    }
}
Imports IronOcr

Public Class IronOcrPassportProcessor
    Private ReadOnly _ocr As IronTesseract

    Public Sub New()
        _ocr = New IronTesseract()
        _ocr.Configuration.ReadBarCodes = True ' barcodes included
    End Sub

    Public Function ProcessPassport(imagePath As String) As CompletePassportResult
        ' Structured MRZ fields — no manual parsing required
        Dim mrzData = _ocr.ReadPassport(imagePath)

        ' Full page OCR + barcodes in the same call
        Dim fullResult = _ocr.Read(imagePath)

        Return New CompletePassportResult With {
            ' MRZ fields are already parsed properties
            .DocumentType = mrzData.DocumentType,
            .IssuingCountry = mrzData.IssuingCountry,
            .Surname = mrzData.Surname,
            .GivenNames = mrzData.GivenNames,
            .PassportNumber = mrzData.DocumentNumber,
            .Nationality = mrzData.Nationality,
            .DateOfBirth = mrzData.DateOfBirth,
            .ExpiryDate = mrzData.ExpiryDate,
            .RawMrz = mrzData.MRZ,

            ' Full page text from same package
            .FullPageText = fullResult.Text,

            ' Barcodes alongside text — no separate product
            .Barcodes = fullResult.Barcodes.Select(Function(b) b.Value).ToList(),

            .Confidence = fullResult.Confidence
        }
    End Function
End Class
$vbLabelText   $csharpLabel

Jeden pakiet, jeden klucz licencyjny, jedno API. W przypadku przewodnika po odczytywaniu paszportów i funkcji odczytu BARCODE dokumentacja IronOCR obejmuje oba te elementy w tym samym kontekście produktowym, ponieważ są to ten sam produkt.

Koszt i złożoność wielu produktów

Najwyraźniej różnice w modelach kosztowych widać na przykładzie skanera magazynowego. System musi odczytywać etykiety produktów (tekst), skanować kody kreskowe (QR/EAN) oraz przetwarzać załączone pliki PDF dotyczące przesyłek. W przypadku Dynamsoft są to trzy oddzielnie licencjonowane produkty z odrębnymi wzorcami inicjalizacji.

Podejście firmy Dynamsoft

// Dynamsoft warehouse scanner — THREE products, THREE license keys

using Dynamsoft.DLR;  // Label Recognizer — product labels
using Dynamsoft.DBR;  // Barcode Reader — product barcodes
using Dynamsoft.DDN;  // Document Normalizer — document edge detection

public class DynamsoftWarehouseScanner : IDisposable
{
    private readonly LabelRecognizer _labelRecognizer;
    private readonly BarcodeReader _barcodeReader;
    private readonly DocumentNormalizer _documentNormalizer;

    public DynamsoftWarehouseScanner(
        string labelLicenseKey,
        string barcodeLicenseKey,
        string documentLicenseKey)
    {
        LabelRecognizer.InitLicense(labelLicenseKey);
        _labelRecognizer = new LabelRecognizer();

        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();

        DocumentNormalizer.InitLicense(documentLicenseKey);
        _documentNormalizer = new DocumentNormalizer();
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // Three separate API calls, three result types to aggregate manually
        var labelResults   = _labelRecognizer.RecognizeFile(imagePath);
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);
        var docResults     = _documentNormalizer.Normalize(imagePath);

        // Merge three result sets into one model — your code
        return AggregateResults(labelResults, barcodeResults, docResults);
    }

    public void Dispose()
    {
        _labelRecognizer?.Dispose();
        _barcodeReader?.Dispose();
        _documentNormalizer?.Dispose();
    }
}
// Dynamsoft warehouse scanner — THREE products, THREE license keys

using Dynamsoft.DLR;  // Label Recognizer — product labels
using Dynamsoft.DBR;  // Barcode Reader — product barcodes
using Dynamsoft.DDN;  // Document Normalizer — document edge detection

public class DynamsoftWarehouseScanner : IDisposable
{
    private readonly LabelRecognizer _labelRecognizer;
    private readonly BarcodeReader _barcodeReader;
    private readonly DocumentNormalizer _documentNormalizer;

    public DynamsoftWarehouseScanner(
        string labelLicenseKey,
        string barcodeLicenseKey,
        string documentLicenseKey)
    {
        LabelRecognizer.InitLicense(labelLicenseKey);
        _labelRecognizer = new LabelRecognizer();

        BarcodeReader.InitLicense(barcodeLicenseKey);
        _barcodeReader = new BarcodeReader();

        DocumentNormalizer.InitLicense(documentLicenseKey);
        _documentNormalizer = new DocumentNormalizer();
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // Three separate API calls, three result types to aggregate manually
        var labelResults   = _labelRecognizer.RecognizeFile(imagePath);
        var barcodeResults = _barcodeReader.DecodeFile(imagePath);
        var docResults     = _documentNormalizer.Normalize(imagePath);

        // Merge three result sets into one model — your code
        return AggregateResults(labelResults, barcodeResults, docResults);
    }

    public void Dispose()
    {
        _labelRecognizer?.Dispose();
        _barcodeReader?.Dispose();
        _documentNormalizer?.Dispose();
    }
}
Imports Dynamsoft.DLR  ' Label Recognizer — product labels
Imports Dynamsoft.DBR  ' Barcode Reader — product barcodes
Imports Dynamsoft.DDN  ' Document Normalizer — document edge detection

Public Class DynamsoftWarehouseScanner
    Implements IDisposable

    Private ReadOnly _labelRecognizer As LabelRecognizer
    Private ReadOnly _barcodeReader As BarcodeReader
    Private ReadOnly _documentNormalizer As DocumentNormalizer

    Public Sub New(labelLicenseKey As String, barcodeLicenseKey As String, documentLicenseKey As String)
        LabelRecognizer.InitLicense(labelLicenseKey)
        _labelRecognizer = New LabelRecognizer()

        BarcodeReader.InitLicense(barcodeLicenseKey)
        _barcodeReader = New BarcodeReader()

        DocumentNormalizer.InitLicense(documentLicenseKey)
        _documentNormalizer = New DocumentNormalizer()
    End Sub

    Public Function ScanItem(imagePath As String) As WarehouseItemResult
        ' Three separate API calls, three result types to aggregate manually
        Dim labelResults = _labelRecognizer.RecognizeFile(imagePath)
        Dim barcodeResults = _barcodeReader.DecodeFile(imagePath)
        Dim docResults = _documentNormalizer.Normalize(imagePath)

        ' Merge three result sets into one model — your code
        Return AggregateResults(labelResults, barcodeResults, docResults)
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _labelRecognizer?.Dispose()
        _barcodeReader?.Dispose()
        _documentNormalizer?.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

Pliki PDF z wysyłkami nadal wymagają czwartego produktu — Dynamsoft nie posiada natywnego OCR dla plików PDF. Roczna licencja na trzy produkty Dynamsoft w pakiecie na serwer: 5997 USD+/rok. Dodaj bibliotekę PDF, a koszt wyniesie ponad 6300 USD rocznie, zanim napisano by choćby jedną linię kodu logiki biznesowej.

Podejście IronOCR

using IronOcr;

public class IronOcrWarehouseScanner
{
    private readonly IronTesseract _ocr;

    public IronOcrWarehouseScanner()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes in same pass
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // One call: text + barcodes + structured word positions
        var result = _ocr.Read(imagePath);

        return new WarehouseItemResult
        {
            AllText    = result.Text,
            Barcodes   = result.Barcodes.Select(b => new BarcodeInfo
                         { Format = b.Format.ToString(), Value = b.Value }).ToList(),
            Confidence = result.Confidence
        };
    }

    public string ScanLabelRegion(string imagePath, int x, int y, int width, int height)
    {
        // Target a specific label area — no template JSON required
        var region = new CropRectangle(x, y, width, height);
        using var input = new OcrInput();
        input.LoadImage(imagePath, region);
        input.Deskew();
        input.Contrast();

        return _ocr.Read(input).Text;
    }

    public string ProcessShipmentPdf(string pdfPath)
    {
        // Native PDF — no external library, no page conversion loop
        return _ocr.Read(pdfPath).Text;
    }
}
using IronOcr;

public class IronOcrWarehouseScanner
{
    private readonly IronTesseract _ocr;

    public IronOcrWarehouseScanner()
    {
        _ocr = new IronTesseract();
        _ocr.Configuration.ReadBarCodes = true;  // barcodes in same pass
    }

    public WarehouseItemResult ScanItem(string imagePath)
    {
        // One call: text + barcodes + structured word positions
        var result = _ocr.Read(imagePath);

        return new WarehouseItemResult
        {
            AllText    = result.Text,
            Barcodes   = result.Barcodes.Select(b => new BarcodeInfo
                         { Format = b.Format.ToString(), Value = b.Value }).ToList(),
            Confidence = result.Confidence
        };
    }

    public string ScanLabelRegion(string imagePath, int x, int y, int width, int height)
    {
        // Target a specific label area — no template JSON required
        var region = new CropRectangle(x, y, width, height);
        using var input = new OcrInput();
        input.LoadImage(imagePath, region);
        input.Deskew();
        input.Contrast();

        return _ocr.Read(input).Text;
    }

    public string ProcessShipmentPdf(string pdfPath)
    {
        // Native PDF — no external library, no page conversion loop
        return _ocr.Read(pdfPath).Text;
    }
}
Imports IronOcr

Public Class IronOcrWarehouseScanner
    Private ReadOnly _ocr As IronTesseract

    Public Sub New()
        _ocr = New IronTesseract()
        _ocr.Configuration.ReadBarCodes = True ' barcodes in same pass
    End Sub

    Public Function ScanItem(imagePath As String) As WarehouseItemResult
        ' One call: text + barcodes + structured word positions
        Dim result = _ocr.Read(imagePath)

        Return New WarehouseItemResult With {
            .AllText = result.Text,
            .Barcodes = result.Barcodes.Select(Function(b) New BarcodeInfo With {
                .Format = b.Format.ToString(),
                .Value = b.Value
            }).ToList(),
            .Confidence = result.Confidence
        }
    End Function

    Public Function ScanLabelRegion(imagePath As String, x As Integer, y As Integer, width As Integer, height As Integer) As String
        ' Target a specific label area — no template JSON required
        Dim region = New CropRectangle(x, y, width, height)
        Using input As New OcrInput()
            input.LoadImage(imagePath, region)
            input.Deskew()
            input.Contrast()

            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Function ProcessShipmentPdf(pdfPath As String) As String
        ' Native PDF — no external library, no page conversion loop
        Return _ocr.Read(pdfPath).Text
    End Function
End Class
$vbLabelText   $csharpLabel

W przypadku dokumentacji dotyczącej OCR opartego na regionach oraz przewodnika po wprowadzaniu danych z plików PDF,IronOCR obsługuje oba te obszary bez konieczności stosowania dodatkowych produktów.

Model wdrożenia

Obie biblioteki działają lokalnie, bez przesyłania danych dokumentów do chmury. Kluczowe różnice w wdrażaniu dotyczą wzorców inicjalizacji, zarządzania plikami konfiguracyjnymi oraz tego, co każda biblioteka zawiera w swoim artefakcie wdrożeniowym.

Podejście firmy Dynamsoft

Dynamsoft wymaga statycznych wywołań inicjalizacyjnych klasy SDK przed utworzeniem jakiejkolwiek instancji. Każdy produkt ma swój własny wzorzec inicjalizacji, a klucz licencyjny aktywuje wyłącznie ten konkretny produkt. Pliki konfiguracji szablonu — dokumenty ustawień JSON dla MRZ, VIN lub niestandardowych wzorców etykiet — muszą być obecne i poprawnie odwołane w czasie działania. Wdrożenie, które obejmuje Label Recognizer i Barcode Reader, zarządza dwiema ścieżkami aktywacji, dwoma zestawami szablonów i dwoma łańcuchami Dispose.

W przypadku wdrożeń w magazynach lub kioskach zależność od pliku konfiguracyjnego powoduje dodanie artefaktu wdrożeniowego poza plikami binarnymi. Szablony JSON są oddzielnymi plikami, nie są skompilowane w pakiecie. Niepoprawne skonfigurowanie ścieżki szablonu na nowym serwerze i rozpoznanie zwróci puste wyniki lub wyrzuci błąd w czasie rzeczywistym podczas wywołania AppendSettingsFromString.

Podejście IronOCR

IronOCR jest wdrażany jako pojedynczy pakiet NuGet. Aktywacja licencji to przypisanie ciągu znaków w jednym wierszu:

// Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' Application startup — one line, works for all features
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
$vbLabelText   $csharpLabel

Brak plików szablonów. Brak natywnego zarządzania plikami binarnymi. Brak folderu tessdata. Przewodnik wdrażania Docker wymaga jedynie libgdiplus na Linuxie — jednej linii apt-get install w Dockerfile.

FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get update && apt-get install -y libgdiplus
COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]

Ten sam pakiet obsługuje systemy Linux, AWS Lambda i Azure App Service bez konieczności konfiguracji specyficznej dla danej platformy. W przypadku zespołów korzystających z potoków CI/CD nie ma plików szablonów, które wymagałyby oddzielnej kontroli wersji lub wdrażania artefaktów.

Przewodnik po mapowaniu API

Dynamsoft Label Recognizer Odpowiednik IronOCR
LabelRecognizer.InitLicense(key) IronOcr.License.LicenseKey = key
new LabelRecognizer() new IronTesseract()
_recognizer.AppendSettingsFromString(json) Nie jest wymagane — silnik skonfigurowany automatycznie
_recognizer.RecognizeFile(path) ocr.Read(path)
_recognizer.RecognizeByFile(path, "") ocr.Read(path)
result.LineResults[i].Text result.Lines[i].Text
Ręczny parser TD3 MRZ (ponad 150 wierszy) ocr.ReadPassport(path).Surname itd.
BarcodeReader.InitLicense(key) (oddzielny produkt) ocr.Configuration.ReadBarCodes = true
_barcodeReader.DecodeFile(path) result.Barcodes (to samo wywołanie co OCR)
barcode.BarcodeFormatString barcode.Format.ToString()
barcode.BarcodeText barcode.Value
DocumentNormalizer.InitLicense(key) (oddzielny produkt) Nie jest wymagane
Brak obsługi plików PDF ocr.Read("document.pdf")
Brak możliwości wyszukiwania w pliku PDF result.SaveAsSearchablePdf(path)
recognizer.Dispose() using var ocr = new IronTesseract()

Kiedy zespoły rozważają przejście z Dynamsoft na IronOCR

Zakres zastosowania wykracza poza MRZ lub etykiety

Większość migracji ma miejsce, gdy projekt zaczyna się w wąskim zakresie — "tylko odczyt MRZ paszportu" — a następnie pojawiają się wymagania produktowe. Klient chce archiwizować zeskanowane paszporty jako pliki PDF z możliwością wyszukiwania. Zespół ds. zgodności chce przeprowadzić OCR na stemplach wizowych. W kolejce zgłoszeń do pomocy technicznej znajdują się zgłoszenia dotyczące plików PDF, których Dynamsoft nie może przetworzyć. W tej chwili zespół korzysta z Dynamsoft do MRZ oraz z drugiej biblioteki OCR do wszystkiego innego. Dwie umowy licencyjne, dwa ścieżki konserwacji, dwa wzorce API w tej samej bazie kodu.IronOCR obsługuje pierwotny wymóg MRZ przez ReadPassport() oraz rozszerzone wymagania przez ten sam egzemplarz IronTesseract. Zespoły przechodzące z systemu opartego na dwóch bibliotekach na jeden pakiet zazwyczaj odnotowują 30–40% redukcję kodu warstwy integracyjnej.

Roczne koszty subskrypcji są nie do utrzymania

Koszty licencji wieloproduktowej Dynamsoftu rosną corocznie. Skontaktuj się z Dynamsoftem, aby uzyskać aktualne ceny. Na przestrzeni wielu lat, łączne opłaty za subskrypcje roczne na wiele produktów mogą znacznie przekroczyć koszt jednorazowy $999 IronOCR. Model licencjonowania wieczystego ma największe znaczenie dla produktów z określoną żywotnością komercyjną — system przetwarzania dokumentów rządowych, który będzie działał przez siedem lat, nie chce mieć zależności rocznego odnawiania od specjalistycznego dostawcy dla kluczowego komponentu.

Wymagane jest wprowadzenie pliku PDF

Dynamsoft Label Recognizer nie obsługuje natywnie formatu PDF. Każdy dokument dostarczony w formacie PDF wymaga etapu przetwarzania wstępnego: renderowania każdej strony do obrazu, przesłania obrazu przez Dynamsoft, zebrania i ponownego złożenia wyników. Ten potok dodaje zależność od renderowania PDF, pętlę iteracji stron oraz problem mapowania współrzędnych, jeśli konieczne jest skorelowanie wyników rozpoznawania z oryginalną geometrią pliku PDF.IronOCR natywnie czyta PDF-y — ocr.Read("passport-scans.pdf") przetwarza każdą stronę, a result.Pages daje dostęp do tekstu, słów i ocen pewności na każdej stronie. W przypadku zespołów, w których 20% lub więcej danych wejściowych ma formę plików PDF, rozwiązanie firmy Dynamsoft powoduje znaczne obciążenie związane z konserwacją przy każdej aktualizacji biblioteki renderującej pliki PDF.

Koszt integracji wielu produktów jest zbyt wysoki

Każdy dodatkowy produkt Dynamsoft to oddzielne wywołanie inicjalizacji statycznej, oddzielny łańcuch Dispose i oddzielny plik konfiguracji JSON do zarządzania. Zespoły, które zintegrowały trzy produkty Dynamsoft, twierdzą, że głównym kosztem utrzymania jest powierzchnia integracji — a nie jakość rozpoznawania. Rotacja kluczy licencyjnych, aktualizacje wersji SDK oraz wdrażanie plików szablonów muszą być koordynowane jednocześnie we wszystkich trzech produktach. Model pojedynczego pakietu IronOCR oznacza jedną wersję do aktualizacji, jeden klucz licencyjny do rotacji i jeden interfejs API do utrzymania, niezależnie od tego, z ilu funkcji OCR korzysta aplikacja.

Potrzebne są międzynarodowe typy dokumentów

Dynamsoft Label Recognizer opiera się na formatach MRZ z alfabetem łacińskim zgodnie z dokumentem ICAO Doc 9303. Aplikacje przetwarzające dokumenty tożsamości w językach CJK, paszporty z alfabetem arabskim lub wielojęzyczne etykiety wysyłkowe szybko osiągają limity obsługi języków.IronOCR oferuje ponad 125 pakietów językowych w postaci pojedynczych pakietów NuGet — arabski, chiński uproszczony, chiński tradycyjny, japoński, koreański i inne. Każdy instalowany przez dotnet add package IronOcr.Languages.Arabic bez zmiany kodu rozpoznania. Przewodnik dotyczący wielu języków opisuje funkcję jednoczesnego rozpoznawania wielu języków za pomocą kilku wierszy konfiguracji.

Typowe kwestie związane z migracją

Zastąpienie parsera MRZ

Najbardziej bezpośrednim krokiem migracyjnym jest zastąpienie połączenia Dynamsoft RecognizeFile + ręczny parser TD3 przez ReadPassport. Ścieżka ekstrakcji Dynamsoft zwraca surowy tekst jak P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<< i wymaga ponad 150 linii parsowania przesunięcia znaków dla formatu TD3. Zastępstwo dla IronOCR:

// Before: Dynamsoft raw extraction + manual 150-line parser
var results = _recognizer.RecognizeFile(imagePath);
var rawMrz = string.Join("\n", results.SelectMany(r => r.LineResults).Select(l => l.Text));
var parsed = MyTd3Parser.Parse(rawMrz);  // delete this file

// After:IronOCR parsed output directly
var passportData = new IronTesseract().ReadPassport(imagePath);
string surname  = passportData.Surname;
string docNum   = passportData.DocumentNumber;
DateTime? dob   = passportData.DateOfBirth;
// Before: Dynamsoft raw extraction + manual 150-line parser
var results = _recognizer.RecognizeFile(imagePath);
var rawMrz = string.Join("\n", results.SelectMany(r => r.LineResults).Select(l => l.Text));
var parsed = MyTd3Parser.Parse(rawMrz);  // delete this file

// After:IronOCR parsed output directly
var passportData = new IronTesseract().ReadPassport(imagePath);
string surname  = passportData.Surname;
string docNum   = passportData.DocumentNumber;
DateTime? dob   = passportData.DateOfBirth;
Imports System
Imports System.Linq

' Before: Dynamsoft raw extraction + manual 150-line parser
Dim results = _recognizer.RecognizeFile(imagePath)
Dim rawMrz = String.Join(vbCrLf, results.SelectMany(Function(r) r.LineResults).Select(Function(l) l.Text))
Dim parsed = MyTd3Parser.Parse(rawMrz)  ' delete this file

' After: IronOCR parsed output directly
Dim passportData = New IronTesseract().ReadPassport(imagePath)
Dim surname As String = passportData.Surname
Dim docNum As String = passportData.DocumentNumber
Dim dob As DateTime? = passportData.DateOfBirth
$vbLabelText   $csharpLabel

Ręczny parser został całkowicie usunięty. Wykrywanie formatu TD1 (karty ID), TD2 (wizy) i TD3 (paszporty) jest automatyczne wewnątrz ReadPassport. Instrukcja obsługi Passport opisuje każdy zwracany pole.

Konsolidacja inicjalizacji wielu produktów

Wieloproduktowe aplikacje Dynamsoft mają wiele statycznych wywołań InitLicense przy starcie, z których każde wymaga własnego klucza. Połącz je w jedną linię licencji IronOCR i usuń bloki inicjalizacji dla poszczególnych produktów:

// Before: three static initializations
LabelRecognizer.InitLicense(mrzKey);
BarcodeReader.InitLicense(barcodeKey);
DocumentNormalizer.InitLicense(documentKey);

// After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;  // barcodes included automatically
// Before: three static initializations
LabelRecognizer.InitLicense(mrzKey);
BarcodeReader.InitLicense(barcodeKey);
DocumentNormalizer.InitLicense(documentKey);

// After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true;  // barcodes included automatically
Imports System

' Before: three static initializations
LabelRecognizer.InitLicense(mrzKey)
BarcodeReader.InitLicense(barcodeKey)
DocumentNormalizer.InitLicense(documentKey)

' After: one line, all capabilities enabled
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")

Dim ocr As New IronTesseract()
ocr.Configuration.ReadBarCodes = True  ' barcodes included automatically
$vbLabelText   $csharpLabel

Istniejące wywołania Dispose Dynamsoft w klasach usług należy zastąpić standardowymi blokami using na egzemplarzach IronTesseract, lub pojedynczym, ponownie używanym egzemplarzem zarejestrowanym w kontenerze DI. Podręcznik konfiguracji IronTesseract obejmuje oba wzorce.

Dodanie obsługi plików PDF

Najczęstszą nową funkcją, jaką zespoły zyskują podczas migracji, jest natywne wprowadzanie danych z plików PDF — coś, czego Dynamsoft nigdy nie zapewniał. Po usunięciu pętli konwersji plików PDF na obrazy, natywny odczyt plików PDF nie wymaga żadnych zmian w kodzie poza ścieżką wejściową:

// Before: PDF rendering loop (50+ lines with external library)
var pdfDoc = PdfDocument.Load(pdfPath);
foreach (var page in pdfDoc.Pages)
{
    var bitmap = page.RenderAsBitmap(150);
    var results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap));
    // aggregate...
}

// After: native PDF — no loop, no external library
var result = new IronTesseract().Read(pdfPath);
string fullText = result.Text;
result.SaveAsSearchablePdf("searchable-output.pdf");
// Before: PDF rendering loop (50+ lines with external library)
var pdfDoc = PdfDocument.Load(pdfPath);
foreach (var page in pdfDoc.Pages)
{
    var bitmap = page.RenderAsBitmap(150);
    var results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap));
    // aggregate...
}

// After: native PDF — no loop, no external library
var result = new IronTesseract().Read(pdfPath);
string fullText = result.Text;
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

' Before: PDF rendering loop (50+ lines with external library)
Dim pdfDoc = PdfDocument.Load(pdfPath)
For Each page In pdfDoc.Pages
    Dim bitmap = page.RenderAsBitmap(150)
    Dim results = _labelRecognizer.RecognizeFile(SaveBitmapToTemp(bitmap))
    ' aggregate...
Next

' After: native PDF — no loop, no external library
Dim result = New IronTesseract().Read(pdfPath)
Dim fullText As String = result.Text
result.SaveAsSearchablePdf("searchable-output.pdf")
$vbLabelText   $csharpLabel

Dla zespołów, które muszą również tworzyć przeszukiwalne archiwa PDF z zeskanowanych danych wejściowych, SaveAsSearchablePdf jest jednorazowym wywołaniem metody. W instrukcji w formacie PDF z funkcją wyszukiwania szczegółowo opisano opcje wyjściowe.

Przetwarzanie wstępne zapewniające jakość etykiet przemysłowych

Silnik szablonów firmy Dynamsoft jest zoptymalizowany pod kątem kontrolowanych warunków etykiet. W przypadku obrazów o niskiej jakości — zużytych etykiet, opakowań o niskim kontraście, przekrzywionych skanów przemysłowych — proces przetwarzania wstępnego IronOCR wypełnia tę lukę. Przewodnik po korekcji jakości obrazu obejmuje każdy filtr. Dla przepływów pracy specyficznych dla etykiet, najprzydatniejsze są Deskew i Contrast:

using var input = new OcrInput();
input.LoadImage(labelImagePath);
input.Deskew();    // correct rotation from handheld scanner
input.Contrast();  // recover faded label text
input.DeNoise();   // remove packaging texture interference

var labelText = new IronTesseract().Read(input).Text;
Console.WriteLine($"Confidence: {new IronTesseract().Read(input).Confidence}%");
using var input = new OcrInput();
input.LoadImage(labelImagePath);
input.Deskew();    // correct rotation from handheld scanner
input.Contrast();  // recover faded label text
input.DeNoise();   // remove packaging texture interference

var labelText = new IronTesseract().Read(input).Text;
Console.WriteLine($"Confidence: {new IronTesseract().Read(input).Confidence}%");
Imports IronOcr

Using input As New OcrInput()
    input.LoadImage(labelImagePath)
    input.Deskew()    ' correct rotation from handheld scanner
    input.Contrast()  ' recover faded label text
    input.DeNoise()   ' remove packaging texture interference

    Dim labelText = New IronTesseract().Read(input).Text
    Console.WriteLine($"Confidence: {New IronTesseract().Read(input).Confidence}%")
End Using
$vbLabelText   $csharpLabel

Dodatkowe możliwości IronOCR

Funkcje nieomówione w powyższych sekcjach, z których zespoły często korzystają po migracji:

  • Rozpoznawanie pisma ręcznego: przetwarzanie odręcznych notatek i adnotacji wraz z tekstem drukowanym — funkcja, której Dynamsoft nie oferuje
  • Przetwarzanie zeskanowanych dokumentów: wielostronicowe zeskanowane pliki PDF z automatycznym przetwarzaniem wstępnym każdej strony
  • Wyodrębnianie tabel: wykrywanie i wyodrębnianie danych tabelarycznych z faktur, manifestów i arkuszy danych
  • Eksport hOCR: Eksportuj wyniki rozpoznawania jako HTML wraz ze współrzędnymi ramki ograniczającej do dalszej analizy układu
  • Async OCR: Rozpoznawanie bez blokowania dla ASP.NET i aplikacji serwerowych o dużej przepustowości
  • Śledzenie postępów: monitorowanie wielostronicowych zadań wsadowych za pomocą wywołań zwrotnych dotyczących postępu
  • Indeks ponad 125 języków: Pełna lista obsługiwanych pakietów NuGet w różnych językach, w tym alfabetów niełacińskich
  • Odczyt MICR/czeków: rozpoznawanie znaków atramentem magnetycznym do przetwarzania dokumentów finansowych — kolejny specjalistyczny przypadek użycia obsługiwany w jednym pakiecie
  • Wyniki pewności dla poszczególnych WORD-ów: szczegółowe wskaźniki jakości dla automatycznych procesów weryfikacji dokumentów

Zgodność z platformą .NET i gotowość na przyszłość

IronOCR obsługuje przede wszystkim środowiska uruchomieniowe .NET 8 i .NET 9, zachowując pełną kompatybilność wsteczną z .NET Framework 4.6.2 i .NET Core 3.1. Biblioteka jest dostarczana jako pojedynczy pakiet NuGet, który automatycznie dobiera odpowiedni plik binarny dla platformWindowsx64,Windowsx86,Linuxx64,macOSx64 imacOSARM za pomocą grafu identyfikatorów środowisk uruchomieniowych NuGet — bez warunkowych odwołań do pakietów i bez plików projektowych specyficznych dla danej platformy.Dynamsoft Label Recognizerrównież obsługuje nowoczesne środowiska uruchomieniowe .NET, ale jego model wieloproduktowy oznacza, że zgodność każdego produktu z .NET musi być weryfikowana i aktualizowana niezależnie. Aktywne tempo rozwoju IronOCR zapewnia aktualizacje pakietu NuGet dostosowane do każdego cyklu wydawniczego .NET, a model pojedynczego pakietu oznacza, że zgodność z .NET 10, spodziewana pod koniec 2026 r., będzie miała zastosowanie jednolicie do wszystkich funkcji bez konieczności śledzenia poszczególnych produktów.

Wnioski

Dynamsoft Label Recognizer to specjalista o wysokich umiejętnościach technicznych. W przypadku kiosku, który przetwarza wyłącznie strefę MRZ paszportów, lub stanowiska na linii montażowej, które odczytuje wyłącznie kody VIN, jego silnik rozpoznawania oparty na szablonach niezawodnie wykonuje to wąskie zadanie. Problem polega na tym, że rzeczywiste zastosowania rzadko ograniczają się do wąskiego zakresu. W przypadku paszportów należy przeprowadzić OCR pełnych stron danych. Etykiety wysyłkowe są dostarczane w formacie PDF. Systemy magazynowe wymagają przetwarzania BARCODE-ów i tekstu w jednym przebiegu. Każde rozszerzenie zakresu wymaga kolejnego produktu Dynamsoft, kolejnej rocznej licencji i kolejnego interfejsu API do utrzymania.

Model kosztowy sprawia, że jest to konkretne. Wieloletnie sumy za MRZ plus odczyt kodów kreskowych w całym zespole deweloperskim korzystającym z modelu rocznej subskrypcji Dynamsoftu kumulują się znacząco.IronOCR obejmuje obie możliwości — plus natywne PDF, przeszukiwalne wyjście PDF, pełne OCR dokumentu, ponad 125 języków i przetwarzanie wstępne — przy jednorazowym $999. Sama migracja jest w dużej mierze mechaniczna: zastąp RecognizeFile przez ocr.Read, usuń ręczny parser MRZ TD3, włącz ReadBarCodes = true i usuń zewnętrzną pętlę renderowania PDF.

Różnica w architekturze nie polega wyłącznie na kosztach. Projekt Dynamsoft zmusza zespoły do myślenia w kategoriach produktów, a nie możliwości — do zadawania pytania "który produkt Dynamsoft sobie z tym poradzi?" przed napisaniem jakiegokolwiek kodu. Projekt IronOCR odwraca tę zasadę: jedna instancja, jedna konfiguracja, jeden obiekt wynikowy, niezależnie od zawartości dokumentu. Różnica ta kumuluje się w trakcie trwania projektu wraz ze wzrostem wymagań.

Dla zespołów tworzących aplikacje od podstaw, które wymagają dowolnej kombinacji rozpoznawania MRZ, odczytu BarCode, ogólnego OCR dokumentów lub przetwarzania plików PDF, model "wszystko w jednym"IronOCR eliminuje problem koordynacji wielu produktów już na samym początku. Dla zespołów korzystających obecnie z wielu produktów Dynamsoft wraz z oddzielną biblioteką OCR ścieżka migracji konsoliduje ten obszar do jednej zależności. Centrum dokumentacji IronOCR obejmuje wszystkie omówione tutaj funkcje wraz z działającymi przykładami kodu i przewodnikami wdrożeniowymi.

Zwróć uwagęDynamsoft i Tesseract są zarejestrowanymi znakami towarowymi odpowiednich właścicieli. Ta strona nie jest powiązana z, zatwierdzona przez, ani sponsorowana przez Dynamsoft ani Google. Wszystkie nazwy produktów, logo 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.

Często Zadawane Pytania

Czym jest Dynamsoft OCR SDK?

Dynamsoft OCR SDK to rozwiązanie OCR wykorzystywane przez programistów i przedsiębiorstwa do wyodrębniania tekstu z obrazów i dokumentów. Jest to jedna z kilku opcji OCR ocenianych obok IronOCR for .NET pod kątem tworzenia aplikacji .NET.

Jak IronOCR wypada w porównaniu z Dynamsoft OCR SDK dla programistów .NET?

IronOCR to natywna dla NuGet biblioteka OCR dla platformy .NET, wykorzystująca IronTesseract jako główny silnik. W porównaniu z Dynamsoft OCR SDK oferuje prostsze wdrożenie (brak instalatorów SDK), ryczałtowe ceny oraz przejrzysty interfejs API w języku C# bez interoperacyjności COM lub zależności od chmury.

Czy IronOCR jest łatwiejszy w konfiguracji niż Dynamsoft OCR SDK?

IronOCR instaluje się za pomocą jednego pakietu NuGet. Nie ma żadnych instalatorów SDK, plików licencyjnych do skopiowania, komponentów COM do zarejestrowania ani oddzielnych plików binarnych środowiska uruchomieniowego, którymi trzeba by zarządzać. Cały silnik OCR jest zawarty w pakiecie.

Jakie różnice w dokładności występują między Dynamsoft OCR SDK a IronOCR?

IronOCR osiąga wysoką dokładność rozpoznawania standardowych dokumentów biznesowych, faktur, paragonów i zeskanowanych formularzy. W przypadku dokumentów o bardzo niskiej jakości lub rzadkich skryptów dokładność zależy od jakości źródła. IronOCR zawiera filtry wstępnego przetwarzania obrazu, które poprawiają rozpoznawanie danych wejściowych o niskiej jakości.

Czy IronOCR obsługuje wyodrębnianie tekstu z plików PDF?

Tak. IronOCR wyodrębnia tekst zarówno z natywnych plików PDF, jak i ze skanowanych obrazów PDF za pomocą jednego wywołania. Obsługuje również wielostronicowe pliki TIFF, obrazy i strumienie. W przypadku skanowanych plików PDF OCR jest stosowany strona po stronie, z obiektami wynikowymi dla każdej strony.

Jak wygląda licencjonowanie Dynamsoft OCR SDK w porównaniu z IronOCR?

IronOCR korzysta z licencji wieczystej o stałej stawce, bez opłat za stronę lub skan. Organizacje przetwarzające duże ilości dokumentów płacą ten sam koszt licencji niezależnie od ilości. Szczegóły i ceny hurtowe znajdują się na stronie licencji IronOCR.

Jakie języki obsługuje IronOCR?

IronOCR obsługuje 127 języków za pośrednictwem oddzielnych pakietów językowych NuGet. Dodanie języka wymaga wykonania pojedynczego polecenia „dotnet add package IronOcr.Languages.{Language}”. Nie jest wymagane ręczne umieszczanie plików ani konfiguracja ścieżek.

Jak zainstalować IronOCR w projekcie .NET?

Instalacja przez NuGet: „Install-Package IronOcr” w konsoli menedżera pakietów lub „dotnet add package IronOcr” w CLI. Dodatkowe pakiety językowe instaluje się w ten sam sposób. Nie jest wymagany natywny instalator SDK.

Czy IronOCR nadaje się do wdrożeń w Dockerze i kontenerach, w przeciwieństwie do Dynamsoft OCR?

Tak. IronOCR działa w kontenerach Docker za pośrednictwem pakietu NuGet. Klucz licencyjny jest ustawiany za pomocą zmiennej środowiskowej. Silnik OCR nie wymaga żadnych plików licencyjnych, ścieżek SDK ani montowania woluminów.

Czy mogę wypróbować IronOCR przed zakupem, w porównaniu z Dynamsoft OCR?

Tak. Tryb próbny IronOCR przetwarza dokumenty i zwraca wyniki OCR z nakładką znaku wodnego na wyjściu. Przed zakupem licencji można sprawdzić dokładność na własnych dokumentach.

Czy IronOCR obsługuje odczytywanie kodów kreskowych oprócz wyodrębniania tekstu?

IronOCR koncentruje się na wyodrębnianiu tekstu i OCR. Do odczytu kodów kreskowych firma Iron Software udostępnia bibliotekę IronBarcode jako dodatek. Obie biblioteki są dostępne osobno lub w ramach pakietu Iron Suite.

Czy łatwo jest przejść z Dynamsoft OCR SDK na IronOCR?

Migracja z Dynamsoft OCR SDK do IronOCR zazwyczaj obejmuje zastąpienie sekwencji inicjalizacyjnych instancjonowaniem IronTesseract, usunięcie zarządzania cyklem życia COM oraz aktualizację wywołań API. Większość migracji znacznie zmniejsza złożoność kodu.

Kannaopat Udonpant
Inżynier oprogramowania
Zanim stał się inżynierem oprogramowania, Kannapat ukończył doktorat z zasobów środowiskowych na Uniwersytecie Hokkaido w Japonii. W czasie studiowania, Kannapat również został członkiem Laboratorium Robotyki Pojazdów, które jest częścią Wydziału Inżynierii Bioprodukcji. W 2022 roku wykorzystał swoje umiejętności w ...
Czytaj więcej

Zespół wsparcia Iron

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