IRONSOFTWAREHOME
FILMY

Migracja z Dynamsoft OCR do IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 20 czerwca 2026

Niniejszy przewodnik zawiera kompletną ścieżkę migracji dla programistów .NET przechodzących zDynamsoft Label Recognizerna IronOCR. Obejmuje zastąpienie pakietu NuGet, aktualizacje przestrzeni nazw, inicjalizację licencji oraz praktyczne przykłady migracji kodu dla scenariuszy odbiegających od ogólnych porównań możliwości — w tym eliminację konfiguracji szablonów, usunięcie ustawień środowiska uruchomieniowego JSON, migrację definicji regionów oraz uproszczenie analizowania wyników.

Dlaczego warto przejść z Dynamsoft OCR

Dynamsoft Label Recognizer to specjalistyczne narzędzie stworzone do konkretnego celu. Ta precyzja sprawdza się dobrze w wąskich zastosowaniach, ale stwarza trudności w momencie, gdy zakres zastosowania aplikacji wykracza poza pierwotny przypadek użycia MRZ lub VIN.

Konfiguracja JSON ustawień wykonawczych jest powierzchnią utrzymania. Każdy przepływ pracy rozpoznawania Dynamsoft zaczyna się od AppendSettingsFromString, ładowania dokumentu JSON, który deklaruje tablice parametrów, modele znaków i odniesienia regionów. Te szablony JSON są oddzielnymi artefaktami wdrożeniowymi — nie są kompilowane do pliku binarnego. Wymagają one kontroli wersji, zarządzania procesem wdrażania oraz ręcznych aktualizacji, gdy firma Dynamsoft zmienia schematy szablonów w różnych wersjach SDK.IronOCR nie wymaga żadnych plików konfiguracyjnych: utwórz IronTesseract, wywołaj .Read(), a silnik automatycznie dobierze odpowiednie ustawienia.

Ceny rocznych subskrypcji są złożone. LicencjeDynamsoft Label Recognizerkosztują 599 USD+ za urządzenie rocznie. Nie ma opcji wieczystej. Klaster przetwarzający składający się z pięciu urządzeń kosztuje ponad 2995 USD rocznie — a budżet ten obejmuje jedynie rozpoznawanie MRZ i ustrukturyzowanych etykiet. Dodaj Dynamsoft BarCode Reader do kodów kreskowych lub Dynamsoft Document Normalizer do korekcji krawędzi, a roczny rachunek pomnoży się przez liczbę produktów. Licencja Lite IronOCR jest $999 jednorazowo i obejmuje ogólne OCR, etykiety strukturalne, kody kreskowe, natywną obsługę PDF, wyjście PDF z możliwością przeszukiwania oraz ponad 125 języków w jednym pakiecie.

Definiowanie regionu wymaga szablonów JSON. Definiowanie regionu rozpoznawania w Dynamsoft oznacza tworzenie bloku JSON ReferenceRegionArray, odniesienie go w LabelRecognizerParameterArray, a następnie załadowanie całego dokumentu przed rozpoczęciem przetwarzania obrazu.IronOCR używa jednego CropRectangle(x, y, width, height) konstruktora przekazywanego bezpośrednio do OcrInput.LoadImage. Zmiana regionu to edycja jednej liczby, a nie ponowne parsowanie dokumentu JSON.

Parsowanie wyników jest całkowicie Twoją odpowiedzialnością. RecognizeFile i RecognizeByFile zwracają tablice LineResult zawierające surowe ciągi tekstowe. Każda potrzebna struktura — przesunięcia pól, konwersje dat, sprawdzanie cyfr kontrolnych, obsługa separatorów nazw — wymaga niestandardowego kodu parsującego nałożonego na ten surowy wynik.IronOCR zwraca OcrResult z .Pages, .Lines, .Words i .Characters jako typowe kolekcje z już wypełnionymi współrzędnymi obramowania, wynikami zaufania i metadanymi czcionki.

**Brak natywnej obsługi plików PDF powoduje powstanie ukrytej zależności.**Dynamsoft Label Recognizernie obsługuje plików PDF. Każdy plik PDF, który trafia do Twojego procesu przetwarzania, wymaga zewnętrznej biblioteki do renderowania każdej strony do postaci bitmapy, pętli iteracji stron oraz etapu agregacji wyników przed pierwszym wywołaniem Dynamsoft.IronOCR odczytuje PDF-y natywnie: new IronTesseract().Read("document.pdf") przetwarza każdą stronę bez dodatkowych zależności, pętli renderowania czy folderu obrazów tymczasowych.

Bloki inicjalizacji wieloproduktowej rosną wraz z zakresem. Aplikacja Dynamsoft, która obsługuje etykiety strukturalne, kody kreskowe i normalizację dokumentów, wykonuje trzy statyczne wywołania InitLicense podczas uruchamiania, trzy łańcuchy usuwania i trzy niezależne zależności wersji SDK. Aktualizacja zestawu SDK oznacza koordynację działań we wszystkich produktach.IronOCR ma jedną linię inicjalizacyjną i jedną wersję pakietu, niezależnie od tego, z jakich funkcji korzysta aplikacja.

Podstawowy problem

Dynamsoft wymaga pliku konfiguracyjnego JSON załadowanego w czasie wykonywania, zanim rozpocznie się rozpoznawanie:

// Dynamsoft: JSON template required before any image processing
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();

string settings = @"{
    ""LabelRecognizerParameterArray"": [{
        ""Name"": ""VIN_Label"",
        ""ReferenceRegionNameArray"": [""VinRegion""],
        ""CharacterModelName"": ""VIN""
    }],
    ""ReferenceRegionArray"": [{
        ""Name"": ""VinRegion"",
        ""Localization"": {
            ""SourceType"": ""LST_MANUAL_SPECIFICATION"",
            ""FirstPoint"":  [5, 40],
            ""SecondPoint"": [95, 40],
            ""ThirdPoint"":  [95, 60],
            ""FourthPoint"": [5, 60]
        }
    }]
}";

recognizer.AppendSettingsFromString(settings);  // fails silently if JSON is malformed
var results = recognizer.RecognizeFile(imagePath);
C#
// IronOCR: no JSON, no template files — region is a constructor argument
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var region = new CropRectangle(x: 50, y: 400, width: 900, height: 200);
using var input = new OcrInput();
input.LoadImage(imagePath, region);

var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
C#

##IronOCR a Dynamsoft OCR: porównanie funkcji

Poniższa tabela przedstawia pełną różnicę w możliwościach obu bibliotek.

FunkcjaDynamsoft Label RecognizerIronOCR
Ogólne OCR dokumentówNieobsługiwanePełne wsparcie
Rozpoznawanie MRZSpecjalistyczne (tekst w formacie surowym)Wbudowane z polami strukturalnymi
Rozpoznawanie numerów VINSpecjalistyczne (wymagany szablon)Standardowe OCR z wyodrębnianiem regionów
Odczytywanie etykiet przemysłowychSpecjalistyczne (wymagany szablon)Tak, poprzez CropRectangle
Konfiguracja ustawień środowiska uruchomieniowegoWymagane (JSON przez AppendSettingsFromString)Nie jest wymagane
Artefakty wdrażania szablonówWymagane (pliki JSON)None
Natywne wprowadzanie plików PDFNieobsługiwaneTak
Plik PDF chroniony hasłemNieobsługiwaneTak
Wielostronicowy plik wejściowy w formacie TIFFIteracja strony podręcznikaRodzimy (LoadImageFrames)
Wynik w formacie PDF z możliwością wyszukiwaniaNieobsługiwaneTak (SaveAsSearchablePdf)
Odczytywanie BarCodeOddzielny produkt (Dynamsoft BarCode Reader)Wbudowany (ReadBarCodes = true)
Automatyczne przetwarzanie wstępneOgraniczoneTak (Deskew, DeNoise, Contrast, Binarize, Sharpen, Dilate, Erode)
Struktura tekstu (słowa, wiersze, akapity)Surowe ciągi tekstowe LineResultW pełni wpisane wraz ze współrzędnymi i poziomem pewności
Obsługa językówOgraniczone (Latin MRZ)Ponad 125 języków, dostępne w pakietach NuGet
Wielojęzyczne tłumaczenie symultaniczneNieobsługiwaneTak (OcrLanguage.French + OcrLanguage.German)
Wyniki pewnościTylko za linięZa słowo, wiersz, stronę
eksport hOCRNieobsługiwaneTak
Model licencyjnyRoczna subskrypcja (599 USD+/urządzenie/rok)Wieczna ($999 jednorazowo, poziom Lite)
Wymagane jest przetłumaczenie wielu produktówTak (3+ dla pełnego pokrycia)Nie (jeden pakiet)
Obsługa platformy .NET Framework.NET Framework 4.x+.NET Framework 4.6.2+, .NET 5/6/7/8/9
Wdrażanie wielopłatformoweTakTak (Windows, Linux, macOS, Docker, Azure, AWS)
Pakiet NuGetDynamsoft.LabelRecognizerIronOcr

Szybki start: Migracja z Dynamsoft OCR do IronOCR

Krok 1: Zastąp pakiet NuGet

Usuń pakiet Dynamsoft:

dotnet remove package Dynamsoft.LabelRecognizer
SHELL

Zainstaluj IronOCR z galerii NuGet:

dotnet add package IronOcr

Krok 2: Aktualizacja przestrzeni nazw

// Before (Dynamsoft)
using Dynamsoft.LabelRecognizer;
using Dynamsoft.Core;

// After (IronOCR)
using IronOcr;
C#

Krok 3: Inicjalizacja licencji

Zastąp każde statyczne wywołanie InitLicense Dynamsoft pojedynczym przypisaniem licencji IronOCR podczas uruchamiania aplikacji:

// Before (Dynamsoft — one call per product)
LabelRecognizer.InitLicense("DYNAMSOFT-LICENSE-KEY");

// After (IronOCR — one line, all features)
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
C#

Przykłady migracji kodu

Rozpoznawanie oparte na szablonach do silnika bezkonfigurowalnego

System szablonów JSON firmy Dynamsoft dostarcza SDK szczegółowych instrukcji dotyczących modeli znaków, specyfikacji regionów i parametrów rozpoznawania przed przetworzeniem jakiegokolwiek obrazu. W przypadku większości rzeczywistych zadań OCR taka konfiguracja zwiększa złożoność ustawień bez korzyści w zakresie rozpoznawania, ponieważ silnik Tesseract automatycznie obsługuje wykrywanie układu.

Podejście firmy Dynamsoft:

using Dynamsoft.LabelRecognizer;
using Dynamsoft.Core;

// JSON template required before recognition
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();

string invoiceTemplate = @"{
    ""LabelRecognizerParameterArray"": [{
        ""Name"": ""Invoice_Header"",
        ""ReferenceRegionNameArray"": [""HeaderRegion""],
        ""CharacterModelName"": ""NumberLetter""
    }],
    ""ReferenceRegionArray"": [{
        ""Name"": ""HeaderRegion"",
        ""Localization"": {
            ""SourceType"": ""LST_MANUAL_SPECIFICATION"",
            ""FirstPoint"":  [0, 0],
            ""SecondPoint"": [100, 0],
            ""ThirdPoint"":  [100, 20],
            ""FourthPoint"": [0, 20]
        }
    }]
}";

recognizer.AppendSettingsFromString(invoiceTemplate);

var results = recognizer.RecognizeFile("invoice.jpg");
var headerText = new StringBuilder();
foreach (var result in results)
    foreach (var line in result.LineResults)
        headerText.AppendLine(line.Text);

Console.WriteLine(headerText.ToString());
recognizer.Dispose();
C#

Podejście IronOCR:

using IronOcr;

// No template file — region specified inline, engine auto-configures
var region = new CropRectangle(x: 0, y: 0, width: 1200, height: 200);
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
input.Deskew();

var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
C#

Podejście Dynamsoft wymaga stworzenia, sprawdzenia i wdrożenia szablonu JSON przed przetworzeniem jakiegokolwiek obrazu. Literówka w AppendSettingsFromString zwraca puste wyniki w czasie wykonywania — brak walidacji w czasie kompilacji. CropRectangleIronOCR to zwykły konstruktor: sprawdzanie typów w czasie kompilacji, brak zewnętrznych plików, brak artefaktów wdrożeniowych. Zobacz przewodnik po OCR dla poszczególnych regionów, aby zapoznać się ze wszystkimi wzorcami docelowymi.

Skanowanie kodów VIN z migracją regionu

Pobieranie numerów identyfikacyjnych pojazdów to specjalność programu Dynamsoft Label Recognizer. Model szablonu VIN jest zoptymalizowany pod kątem konkretnego 17-znakowego formatu alfanumerycznego. Przejście na IronOCR zastępuje model szablonowy potokiem przetwarzania wstępnego i kierowaniem na regiony, co pozwala obsługiwać te same warunki tablic VIN bez konieczności konfiguracji modelu znaków.

Podejście firmy Dynamsoft:

using Dynamsoft.LabelRecognizer;

LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();

// VIN requires a specific character model and region configuration
string vinTemplate = @"{
    ""LabelRecognizerParameterArray"": [{
        ""Name"": ""VIN_Scan"",
        ""ReferenceRegionNameArray"": [""VIN_Zone""],
        ""CharacterModelName"": ""VIN""
    }],
    ""ReferenceRegionArray"": [{
        ""Name"": ""VIN_Zone"",
        ""Localization"": {
            ""SourceType"": ""LST_MANUAL_SPECIFICATION"",
            ""FirstPoint"":  [10, 35],
            ""SecondPoint"": [90, 35],
            ""ThirdPoint"":  [90, 65],
            ""FourthPoint"": [10, 65]
        }
    }]
}";
recognizer.AppendSettingsFromString(vinTemplate);

var results = recognizer.RecognizeFile("vehicle-vin.jpg");
string rawVin = results
    .SelectMany(r => r.LineResults)
    .Select(l => l.Text)
    .FirstOrDefault() ?? string.Empty;

Console.WriteLine($"Raw VIN text: {rawVin}");  // still requires validation
recognizer.Dispose();
C#

Podejście IronOCR:

using IronOcr;
using System.Text.RegularExpressions;

// Target the VIN plate region directly — no template file
var vinRegion = new CropRectangle(x: 100, y: 350, width: 800, height: 300);

using var input = new OcrInput();
input.LoadImage("vehicle-vin.jpg", vinRegion);
input.Contrast();   // recover faded stamped digits
input.Sharpen();    // clarify character boundaries on embossed plates

var result = new IronTesseract().Read(input);

// VIN: 17 chars, no I/O/Q
var vinMatch = Regex.Match(result.Text, @"\b[A-HJ-NPR-Z0-9]{17}\b");
string vin = vinMatch.Success ? vinMatch.Value : result.Text.Trim();

Console.WriteLine($"VIN: {vin}");
Console.WriteLine($"Confidence: {result.Confidence}%");
C#

Współrzędne CropRectangle używają tej samej ramki odniesienia pikseli jak specyfikacja SecondPoint w procentach Dynamsoft — przeliczając Użyj procentowych wartości Dynamsoft na wymiary obrazka. Linia przetwarzania wstępnego (Contrast, Sharpen) zastępuje optymalizację modelu znaków, którą Dynamsoft włącza do swojego szablonu VIN. Przewodnik po korekcji jakości obrazu obejmuje dobór filtrów do powierzchni wytłoczonych i o niskim kontraście.

Przetwarzanie wielostronicowych plików TIFF w trybie wsadowym

Dynamsoft Label Recognizer przetwarza pojedyncze obrazy. Wielostronicowe dokumenty TIFF — powszechne w systemach zarządzania dokumentami, archiwach obrazów medycznych i potokach faksów — wymagają iteracji zewnętrznej: załadowania każdej klatki, przepuszczenia jej indywidualnie przez moduł rozpoznawania oraz agregacji wyników.IronOCR obsługuje wieloramkowe TIFF-y natywnie przez LoadImageFrames.

Podejście firmy Dynamsoft:

using Dynamsoft.LabelRecognizer;
// Requires an external TIFF library to extract frames

LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(genericTemplate);

// External library needed to iterate TIFF frames
var tiffImage = System.Drawing.Image.FromFile("scanned-batch.tiff");
int frameCount = tiffImage.GetFrameCount(
    System.Drawing.Imaging.FrameDimension.Page);

var allText = new StringBuilder();
for (int i = 0; i < frameCount; i++)
{
    tiffImage.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Page, i);
    string tempPath = $"frame_{i}.jpg";
    tiffImage.Save(tempPath, System.Drawing.Imaging.ImageFormat.Jpeg);

    var results = recognizer.RecognizeFile(tempPath);
    foreach (var r in results)
        foreach (var line in r.LineResults)
            allText.AppendLine(line.Text);

    System.IO.File.Delete(tempPath);  // clean up temp files
}

Console.WriteLine(allText.ToString());
recognizer.Dispose();
C#

Podejście IronOCR:

using IronOcr;

// No frame iteration, no temp files, no external TIFF library
using var input = new OcrInput();
input.LoadImageFrames("scanned-batch.tiff");  // loads all frames natively
input.Deskew();
input.DeNoise();

var ocr = new IronTesseract();
var result = ocr.Read(input);

// Results organized per page
foreach (var page in result.Pages)
{
    Console.WriteLine($"Frame {page.PageNumber}: {page.Lines.Count} lines");
    Console.WriteLine(page.Text);
}

// Save entire batch as a single searchable PDF
result.SaveAsSearchablePdf("batch-searchable.pdf");
C#

Podejście Dynamsoft wymaga System.Drawing do ekstrakcji klatek, plików tymczasowych na dysku dla każdej klatki i ręcznego czyszczenia po każdym przebiegu. LoadImageFramesIronOCR odczytuje wszystkie klatki jednym wywołaniem — brak plików tymczasowych, brak śledzenia indeksów klatek. Po OCR, SaveAsSearchablePdf archiwizuje całą partię jako dokument przeszukiwalny w jednym wywołaniu metody. Wielokadrowy przewodnik w formacie TIFF oraz przewodnik w formacie PDF z funkcją wyszukiwania szczegółowo opisują obie te funkcje.

Strukturalne parsowanie wyników na poziomie słów

Dynamsoft RecognizeFile zwraca tablicę DLRResult. Każdy DLRResult zawiera kolekcję LineResults obiektów DLRLineResult z właściwością Text i właściwością Location zawierającą ograniczony czworokąt. Wyodrębnianie pozycji na poziomie słów wymaga podziału tekstu w wierszu na spacje i proporcjonalnego podziału ramki ograniczającej wiersz — jest to przybliżenie, które nie działa w przypadku czcionek proporcjonalnych.IronOCR uwypukla prostokąty obramowania na poziomie słów jako typowe właściwości na każdym obiekcie OcrResult.Word.

Podejście firmy Dynamsoft:

using Dynamsoft.LabelRecognizer;

LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(settingsJson);

var results = recognizer.RecognizeFile("form-scan.jpg");

foreach (var dlrResult in results)
{
    foreach (var lineResult in dlrResult.LineResults)
    {
        // Line-level data only — word boundaries are not provided
        Console.WriteLine($"Text: {lineResult.Text}");
        Console.WriteLine($"Confidence: {lineResult.Confidence}");

        // Location is a quadrilateral — four corner points
        var loc = lineResult.Location;
        Console.WriteLine($"Top-left: ({loc.Points[0].X}, {loc.Points[0].Y})");

        // To get word positions: split text and divide bounding box manually
        var words = lineResult.Text.Split(' ');
        int approxWidth = (loc.Points[1].X - loc.Points[0].X) / words.Length;
        for (int i = 0; i < words.Length; i++)
        {
            int wordX = loc.Points[0].X + (i * approxWidth);
            Console.WriteLine($"  Word '{words[i]}' approx at x={wordX}");
        }
    }
}
recognizer.Dispose();
C#

Podejście IronOCR:

using IronOcr;

var result = new IronTesseract().Read("form-scan.jpg");

// Word-level positions are first-class properties — no manual division
foreach (var page in result.Pages)
{
    foreach (var paragraph in page.Paragraphs)
    {
        Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");

        foreach (var line in paragraph.Lines)
        {
            foreach (var word in line.Words)
            {
                Console.WriteLine(
                    $"  Word: '{word.Text}' " +
                    $"at ({word.X},{word.Y}) " +
                    $"size {word.Width}x{word.Height} " +
                    $"confidence {word.Confidence}%");
            }
        }
    }
}
C#

IronOCR zapewnia prawdziwą hierarchię: strony zawierają akapity, akapity zawierają wiersze, wiersze zawierają słowa, a słowa zawierają znaki. Każdy poziom ujawnia .X, .Y, .Width, .Height i .Confidence jako typowe właściwości całkowite i zmiennoprzecinkowe - bez potrzeby wykonywania matematyki współrzędnych czworokątnych. Dokumentacja dotycząca wyników ustrukturyzowanych zawiera opis wszystkich dostępnych właściwości, a dokumentacja dotycząca oceny pewności wyjaśnia progi pewności stosowane w automatycznych procesach weryfikacji dokumentów.

Asynchroniczne przetwarzanie równoległe do skanowania etykiet o dużej objętości

Dynamsoft Label Recognizer jest bezpieczny dla wątków, ale jego wywołanie RecognizeFile jest synchroniczne. Obudowanie go w Task.Run umożliwia równoległe przetwarzanie, ale każde wywołanie współdzieli stan konfiguracji przez AppendSettingsFromString — ładowanie szablonów na wielu wątkach wymaga ostrożnej sekwencji inicjalizacji. Instancje IronTesseractIronOCRsą niezależne: utwórz jedną dla zadania, wywołaj Read, a model wątków jest prosty.

Podejście firmy Dynamsoft:

using Dynamsoft.LabelRecognizer;
using System.Threading.Tasks;

// InitLicense must be called once before parallel work begins
LabelRecognizer.InitLicense(licenseKey);

// Each thread needs its own recognizer instance with its own template load
var results = new System.Collections.Concurrent.ConcurrentBag<string>();

await Task.WhenAll(imagePaths.Select(async path =>
{
    // Cannot share recognizer instances safely across tasks
    var recognizer = new LabelRecognizer();
    recognizer.AppendSettingsFromString(templateJson);  // reload JSON per instance

    await Task.Run(() =>
    {
        var dlrResults = recognizer.RecognizeFile(path);
        var text = string.Join("\n",
            dlrResults.SelectMany(r => r.LineResults).Select(l => l.Text));
        results.Add(text);
    });

    recognizer.Dispose();
}));

Console.WriteLine($"Processed {results.Count} images");
C#

Podejście IronOCR:

using IronOcr;
using System.Collections.Concurrent;
using System.Threading.Tasks;

var extractedTexts = new ConcurrentDictionary<string, string>();

// Each IronTesseract instance is independent — no shared state
Parallel.ForEach(imagePaths, imagePath =>
{
    var ocr = new IronTesseract();
    var result = ocr.Read(imagePath);
    extractedTexts[imagePath] = result.Text;
});

foreach (var (path, text) in extractedTexts)
    Console.WriteLine($"{System.IO.Path.GetFileName(path)}: {text.Length} characters");
C#

IronOCR nie wymaga sekwencji inicjalizacji przed rozpoczęciem pracy równoległej. Jedno przypisanie IronOcr.License.LicenseKey podczas uruchamiania aplikacji aktywuje wszystkie instancje. Brak ponownego ładowania szablonu na wątek, brak walidacji JSON na instancję. Dla scenariuszy niewstrzymujących po stronie serwera, przewodnik po asynchronicznym OCR obejmuje wzorce oparte na await dla ASP.NET Core i Azure Functions.

Wyszukiwalny plik PDF z zeskanowanych archiwów etykiet

Dynamsoft nie posiada żadnej funkcji generowania plików PDF. Zeskanowane archiwa etykiet przetworzone przez Dynamsoft pozostają plikami zawierającymi wyłącznie obrazy — nie można ich przeszukiwać, nie są indeksowane przez systemy zarządzania dokumentami i nie są zgodne ze standardami archiwizacji PDF/A.IronOCR dodaje wyjście PDF z możliwością przeszukiwania jako pojedyncze wywołanie metody na obiekcie OcrResult.

Podejście firmy Dynamsoft:

using Dynamsoft.LabelRecognizer;

// Process scanned label — extract text into a string
LabelRecognizer.InitLicense(licenseKey);
var recognizer = new LabelRecognizer();
recognizer.AppendSettingsFromString(labelTemplate);

var results = recognizer.RecognizeFile("scanned-labels.jpg");
var extractedText = new StringBuilder();
foreach (var r in results)
    foreach (var line in r.LineResults)
        extractedText.AppendLine(line.Text);

// Cannot create a searchable PDF — save text to a sidecar .txt file instead
System.IO.File.WriteAllText("scanned-labels.txt", extractedText.ToString());

// The original image remains unsearchable
Console.WriteLine("No PDF output available in Dynamsoft Label Recognizer.");
recognizer.Dispose();
C#

Podejście IronOCR:

using IronOcr;

// Read, preprocess, and produce a searchable PDF archive in one pipeline
using var input = new OcrInput();
input.LoadImage("scanned-labels.jpg");
input.Deskew();
input.Contrast();

var ocr = new IronTesseract();
var result = ocr.Read(input);

// Searchable PDF: original image layer preserved, invisible text layer added
result.SaveAsSearchablePdf("scanned-labels-searchable.pdf");

Console.WriteLine($"Searchable PDF created. Confidence: {result.Confidence}%");
Console.WriteLine($"Extracted text preview: {result.Text.Substring(0, 100)}");
C#

Wynik w postaci pliku PDF z możliwością wyszukiwania zachowuje oryginalny zeskanowany obraz w pełnej rozdzielczości i dodaje na nim niewidoczną warstwę tekstową OCR. Systemy zarządzania dokumentami, indeksy wyszukiwania i przeglądarki plików PDF mogą teraz przeszukiwać zawartość etykiet. Przewodnik w formacie PDF z funkcją wyszukiwania oraz przewodnik dotyczący przetwarzania zeskanowanych dokumentów obejmują archiwa wielostronicowe i procesy konwersji zbiorczej.

Dynamsoft OCR API do IronOCR– dokumentacja API

Dynamsoft Label RecognizerOdpowiednik IronOCR
LabelRecognizer.InitLicense(key)IronOcr.License.LicenseKey = key
new LabelRecognizer()new IronTesseract()
recognizer.AppendSettingsFromString(json)Nie jest wymagane — konfiguracja automatyczna
recognizer.RecognizeFile(path)ocr.Read(path)
recognizer.RecognizeByFile(path, templateName)ocr.Read(path)
recognizer.RecognizeBuffer(buffer, width, height, ...)input.LoadImage(imageBytes) następnie ocr.Read(input)
DLRResult[] (tablica wyników)OcrResult (pojedynczy obiekt wyniku)
DLRResult.LineResultsOcrResult.Lines
DLRLineResult.TextOcrResult.Line.Text
DLRLineResult.ConfidenceOcrResult.Line.Words[i].Confidence
DLRLineResult.Location.Points[i]OcrResult.Line.X, .Y, .Width, .Height
ReferenceRegionArray (JSON)new CropRectangle(x, y, w, h)
LabelRecognizerParameterArray (JSON)Nie jest wymagane
CharacterModelName w szablonieNie jest wymagane
recognizer.Dispose()using var ocr = new IronTesseract()
Brak obsługi plików PDF jako danych wejściowychinput.LoadPdf(path)
Brak możliwości wyszukiwania w pliku PDFresult.SaveAsSearchablePdf(path)
Nie akceptujemy plików TIFF zawierających wiele stroninput.LoadImageFrames(path)
Odczytywanie BarCode (oddzielny produkt)ocr.Configuration.ReadBarCodes = true
Wiele wywołań InitLicense (na produkt)Pojedyncze przypisanie IronOcr.License.LicenseKey

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

Problem 1: Funkcja AppendSettingsFromString zwraca puste wyniki po migracji

Dynamsoft: Rozpoznanie cicho zwraca puste tablice DLRResult, gdy AppendSettingsFromString otrzymuje źle uformowany łańcuch JSON. Nie jest zgłaszany żaden wyjątek. Zespoły migrujące z Dynamsoft czasami dodają defensywne sprawdzanie wartości null w całym kodzie parsującym wyniki, aby zabezpieczyć się przed tą cichą awarią.

Rozwiązanie: Usuń całkowicie AppendSettingsFromString.IronOCR nie wymaga konfiguracji szablonów. Jeśli wymagane jest ukierunkowanie na konkretne regiony, zastąp JSON-a ReferenceRegionArray na CropRectangle:

// Remove all AppendSettingsFromString calls
// Replace region JSON with a CropRectangle constructor
var region = new CropRectangle(x: 0, y: 400, width: 1200, height: 300);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
var result = new IronTesseract().Read(input);
C#

Podręcznik konfiguracji IronTesseract dokumentuje wszystkie opcje konfiguracji silnika, które można ustawić jako właściwości zamiast ciągów JSON.

Problem 2: Wielokrotne wywołania funkcji InitLicense podczas uruchamiania aplikacji

Dynamsoft: Aplikacja korzystająca z Label Recognizer, Barcode Reader i Document Normalizer wywołuje trzy oddzielne metody InitLicense podczas uruchamiania, z każdą potrzebującą własnego klucza licencyjnego. Zespoły przechowują trzy zmienne środowiskowe, niezależnie rotują trzy klucze i debugują trzy oddzielne błędy inicjalizacji.

Rozwiązanie: Usuń wszystkie wywołania InitLicense Dynamsoft. Zastąp jednym wierszem IronOCR:

// Remove:
// LabelRecognizer.InitLicense(mrzKey);
// BarcodeReader.InitLicense(barcodeKey);
// DocumentNormalizer.InitLicense(docKey);

// Add once, at application startup:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
C#

Jedna zmienna środowiskowa aktywuje wszystkie funkcje IronOCR— OCR, BarCode, przetwarzanie plików PDF oraz ponad 125 języków — bez konieczności inicjalizacji poszczególnych funkcji.

Problem 3: Agregacja tekstu LineResult powoduje zniekształcenie wyników

Dynamsoft: RecognizeFile zwraca jedno DLRResult na wykrytą region etykiety. Aplikacje, które łączą lineResult.Text we wszystkich wynikach z separatorami \n, generują wyjście, które miesza linie z różnych stref etykiet na stronie — ponieważ kolejność obiektów DLRResult jest kolejnością detekcji regionalnej, a nie kolejnością czytania.

Rozwiązanie: Hierarchia wyników IronOCR porządkuje dane wyjściowe zgodnie z kolejnością czytania. Użyj struktury PagesParagraphsLines, aby uzyskać dostęp do tekstu w naturalnej kolejności dokumentu:

var result = new IronTesseract().Read(imagePath);

// Reading-order text — no manual aggregation
Console.WriteLine(result.Text);

// Or access paragraph-level groupings
foreach (var paragraph in result.Pages[0].Paragraphs)
    Console.WriteLine(paragraph.Text);
C#

Problem 4: Brak plików szablonów JSON na serwerze wdrożeniowym

Dynamsoft: Pliki szablonów JSON są oddzielnymi artefaktami wdrożeniowymi. Gdy plik szablonu jest nieobecny lub ma nieprawidłową ścieżkę na nowym serwerze, AppendSettingsFromString zawodzi — czasami cicho, czasami z wyjątkiem w czasie wykonywania — i wdrożenie łamie rozpoznanie bez dotykania kodu aplikacji.

**Rozwiązanie:**IronOCR nie posiada plików szablonów. Po zastąpieniu pakietu NuGet i aktualizacji przestrzeni nazw lista artefaktów wdrożeniowych zmniejsza się do plików binarnych aplikacji i jednej zmiennej Środowiska. W razie potrzeby dodaj sprawdzanie poprawności uruchamiania:

// Validate license at startup — no template files to check
if (!IronOcr.License.IsValidLicense)
    throw new InvalidOperationException("IronOCR license key is invalid or missing.");

var ocr = new IronTesseract();
// Ready to process — no file dependencies
C#

Zagadnienie 5: Zarządzanie łańcuchem utylizacji w odniesieniu do wielu produktów

Dynamsoft: Każda instancja produktu Dynamsoft (LabelRecognizer, BarcodeReader, DocumentNormalizer) implementuje IDisposable. Klasy usługowe, które agregują wiele produktów, zawierają wielopoziomowe implementacje Dispose, a pominięcie wywołania Dispose na dowolnej instancji produktu powoduje wycieki zasobów natywnych, które objawiają się wzrostem pamięci przy obciążeniu.

Rozwiązanie: Zarówno IronTesseract, jak i OcrInputIronOCR implementują IDisposable, ale model usuwania jest prostszy — jedna klasa, jeden wzorzec. Zarejestruj pojedynczą instancję IronTesseract w kontenerze DI jako singleton, lub użyj bloków using dla instancji krótkotrwałych:

// Short-lived pattern
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = new IronTesseract().Read(input);

// Long-lived singleton (register in Program.cs)
builder.Services.AddSingleton<IronTesseract>();
C#

Przewodnik dotyczący śledzenia postępów obejmuje zarządzanie cyklem życia długotrwałych zadań wsadowych, a przewodnik dotyczący asynchronicznego OCR przedstawia wzorce singletonowe w ASP.NET Core.

Problem 6: Model znaków niedostępny dla niestandardowego formatu etykiety

Dynamsoft: Pole CharacterModelName w szablonie odnosi się do pliku modelu, który musi istnieć w katalogu instalacyjnym SDK Dynamsoft. Niestandardowe modele znaków wymagają pobrania dodatkowych plików modeli z portalu Dynamsoft i umieszczenia ich w odpowiedniej ścieżce SDK. Brak modelu powoduje niepowodzenie rozpoznawania i wyświetlenie niezrozumiałego błędu wykonania.

**Rozwiązanie:**IronOCR nie korzysta z plików modeli znaków. W przypadku czcionek niestandardowych lub specjalistycznych należy skorzystać z niestandardowego szkolenia językowego:

// No character model files needed
// For specialized fonts, use a custom language pack
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;  // or load a custom trained pack

using var input = new OcrInput();
input.LoadImage(specializedFontImage);
input.Binarize();  // helps with specialized font clarity

var result = ocr.Read(input);
C#

Przewodnik po szkoleniu dotyczącym czcionek niestandardowych obejmuje szkolenie w zakresie pakietu językowego dla zastrzeżonych czcionek etykiet bez konieczności konfiguracji ścieżki pliku.

Lista kontrolna migracji Dynamsoft OCR

Przed migracją

Sprawdź kod źródłowy pod kątem wszystkich odniesień do Dynamsoft:

# Find all Dynamsoft using statements
grep -r "using Dynamsoft" --include="*.cs" .

# Find InitLicense calls (one per product)
grep -r "InitLicense" --include="*.cs" .

# Find AppendSettingsFromString calls (template loads)
grep -r "AppendSettingsFromString" --include="*.cs" .

# Find template JSON strings (inline or file references)
grep -r "LabelRecognizerParameterArray\|ReferenceRegionArray\|CharacterModelName" --include="*.cs" .

# Find RecognizeFile and RecognizeByFile calls
grep -r "RecognizeFile\|RecognizeByFile\|RecognizeBuffer" --include="*.cs" .

# Find LineResult result parsing patterns
grep -r "LineResults\|DLRResult\|DLRLineResult" --include="*.cs" .

# Identify any JSON template files in the project
find . -name "*.json" | xargs grep -l "LabelRecognizerParameterArray" 2>/dev/null
SHELL

Wyniki przeglądu zasobów:

  • Policz miejsca wywołań InitLicense (po jednym na każdy używany produkt Dynamsoft)
  • Policz miejsca wywołań AppendSettingsFromString (po jednym na każdy szablon rozpoznawania)
  • Wymień wszystkie pliki szablonów JSON, które zostaną usunięte po migracji
  • Zidentyfikuj wszystkie definicje ReferenceRegionArray (przekształć na CropRectangle)
  • Zwróć uwagę, które funkcje są obsługiwane przez oddzielne produkty (BARCODE, normalizacja dokumentów)

Migracja kodu

  1. Usuń pakiet NuGet Dynamsoft.LabelRecognizer (i wszystkie inne pakiety Dynamsoft)
  2. Zainstaluj pakiet NuGet IronOcr (dotnet add package IronOcr)
  3. Zastąp wszystkie using Dynamsoft.LabelRecognizer; i using Dynamsoft.Core; z using IronOcr;
  4. Zastąp wszystkie wywołania LabelRecognizer.InitLicense(key) pojedynczym wywołaniem IronOcr.License.LicenseKey = key przy starcie aplikacji
  5. Usuń wszystkie wywołania AppendSettingsFromString(json) — brak wymaganego ekwiwalentu
  6. Zastąp współrzędne JSON ReferenceRegionArray z konstruktorami new CropRectangle(x, y, width, height)
  7. Zastąp instancję new LabelRecognizer() przez new IronTesseract()
  8. Zastąp recognizer.RecognizeFile(path) przez ocr.Read(path)
  9. Zastąp iterację wyników DLRLineResult przez hierarchię .Words
  10. Zastąp ręczną agregację ciągów lineResult.Text przez result.Text lub strukturalną enumerację stron
  11. Zastąp BarcodeReader.InitLicense + BarcodeReader.DecodeFile przez ocr.Configuration.ReadBarCodes = true
  12. Usuń łańcuchy Dispose wieloproduktowe i zastąp przez using var ocr = new IronTesseract()
  13. Usuń pliki szablonów JSON z projektu i artefaktów wdrożeniowych
  14. Zastąp pętle iteracyjne ramki nad plikami TIFF przez input.LoadImageFrames(path)
  15. Dodaj result.SaveAsSearchablePdf(outputPath) zawsze, gdy zeskanowane wyniki muszą być zarchiwizowane

Po migracji

  • Zweryfikuj, że IronOcr.License.IsValidLicense zwraca true przy starcie aplikacji
  • Potwierdź, że wszystkie wyniki rozpoznawania zwracają niepuste result.Text dla wcześniej działających danych wejściowych
  • Sprawdź result.Confidence na reprezentatywnych próbkach — wartości powyżej 80% wskazują na dobrą jakość rozpoznawania
  • Testuj dokładność ukierunkowania regionalnego, porównując wyniki CropRectangle z wcześniejszymi wynikami regionów Dynamsoft
  • Zwaliduj odczytywanie kodów kreskowych, uruchamiając ocr.Configuration.ReadBarCodes = true na danych wejściowych, które wcześniej wymagały Dynamsoft Barcode Reader
  • Zweryfikuj przetwarzanie wielu stron TIFF, które produkuje jeden OcrResult.Page na każdą ramkę
  • Upewnij się, że plik PDF z możliwością wyszukiwania umożliwia wyszukiwanie tekstu w przeglądarce plików PDF
  • Uruchom testy przetwarzania równoległego z Parallel.ForEach i zweryfikuj brak przeciążeń wątków
  • Przetestuj wszystkie środowiska docelowe (Linux, Docker, Azure), aby potwierdzić, że wdrożenie w postaci pojedynczego pakietu działa bez plików szablonów JSON
  • Upewnij się, że w konfiguracji wdrożenia nie pozostały żadne zmienne środowiskowe klucza licencyjnego Dynamsoft

Kluczowe korzyści z migracji do IronOCR

Jedno opakowanie eliminuje podatek koordynacyjny wieloproduktowy. Każda funkcjonalność — ogólne OCR, ekstrakcja MRZ, odczytywanie kodów kreskowych, natywne wejście PDF, wyjście PDF z możliwością przeszukiwania, przetwarzanie wstępne oraz ponad 125 języków — jest wysyłana jako pojedynczy IronOcr pakiet NuGet. Aktualizacje wersji wpływają na jedno wejście pakietu w jednym pliku .csproj. Rotacja klucza licencyjnego jest jednym zmienną środowiskową. Zawartość pakietu wdrożeniowego ogranicza się do plików binarnych aplikacji, bez plików szablonów JSON i katalogów modeli znaków.

Brak zależności od plików konfiguracyjnych. System szablonów Dynamsoft wymaga obecności plików JSON i poprawnie ustawionych ścieżek dostępu w czasie wykonywania.IronOCR nie ma żadnych zależności od plików w czasie wykonywania poza samym pakietem NuGet. Obrazy Docker stają się deterministyczne: to, co przechodzi CI, jest dokładnie tym, co działa w środowisku produkcyjnym. Przewodnik wdrożeniowy Docker pokazuje pełny Dockerfile wymagający jedynie jednej linii apt-get install dla Linuxa.

Zorganizowane wyjście redukuje kod integracyjny. Dynamsoft zwraca surowe ciągi tekstowe LineResult. Pobieranie danych strukturalnych — pozycje pól, granice słów, poziom pewności dla każdego tokenu — wymaga przetwarzania końcowego, które kod sam wykonuje i testuje. Hierarchia wyników IronOCR przedstawia strony, akapity, wiersze, słowa i znaki jako typowane zbiory z współrzędnymi i wynikami pewności na każdym poziomie. Zespoły migrujące z Dynamsoft zazwyczaj usuwają 30–50% kodu przetwarzającego wyniki, ponieważIronOCR dostarcza strukturę, którą wcześniej budowali ręcznie. Strona z wynikami OCR dokumentuje kompletny model wyjściowy.

**Licencja wieczysta eliminuje niepewność związaną z rocznym budżetem.**Dynamsoft Label Recognizernie oferuje opcji licencji wieczystej. Klaster przetwarzający działający przez pięć lat kosztuje ponad 2995 USD rocznie tylko za rozpoznawanie etykiet, nie licząc produktów do normalizacji BARCODE lub dokumentów. Licencja Lite IronOCR$999 to jednorazowy zakup, który obejmuje wszystkie funkcje na czas nieokreślony. W przypadku wdrożeń rządowych, Enterprise i długoterminowych usunięcie konieczności corocznego odnawiania licencji z podstawowego komponentu przetwarzania dokumentów zmniejsza złożoność procesu zakupowego i eliminuje ryzyko wygaśnięcia subskrypcji w trakcie realizacji projektu. Strona licencyjna IronOCR zawiera listę wszystkich poziomów oraz opis tego, co każdy z nich obejmuje.

**Wielopłatformowość bez konfiguracji specyficznej dla platformy.**IronOCR wybiera odpowiedni plik binarny środowiska uruchomieniowego dla systemów Windows x64, Linux x64, macOS x64 i macOS ARM za pomocą grafu identyfikatorów środowiska uruchomieniowego NuGet. Brak warunkowych bloków <PackageReference>, brak kodu wykrywania platformy, brak konfiguracji ścieżek natywnych. Ten sam kod using IronOcr; kompiluje się i działa na Windows, Linux, AWS Lambda oraz Azure App Service bez modyfikacji.

**Zakres obsługiwanych języków dostosowuje się do potrzeb aplikacji.**Dynamsoft Label Recognizerzostał zaprojektowany z myślą o formatach MRZ z alfabetem łacińskim. Pisma niełacińskie — arabskie, chińskie, japońskie, koreańskie, hebrajskie — wykraczają poza zakres projektu.IronOCR obsługuje ponad 125 języków instalowanych jako indywidualne pakiety NuGet: dotnet add package IronOcr.Languages.Arabic dodaje wsparcie dla języka arabskiego bez zmiany kodu w linii rozpoznawania. Indeks języków wymienia każdy dostępny pakiet językowy. W przypadku aplikacji przetwarzających międzynarodowe dokumenty tożsamości, wielojęzyczne etykiety wysyłkowe lub faktury transgraniczne, ten szeroki zakres oznacza, że jedna biblioteka obsługuje każdy typ dokumentu, z jakim spotyka się rozwijająca się aplikacja.

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.

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
Otrzymaj swoją Konsultację 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