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:
RecognizeFilezwraca obiektyLineResultz ł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
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 = truei 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
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
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
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
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")
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
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
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")
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
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.
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.

