AWS vs Google Vision (Comparaison des fonctionnalités OCR)
Dynamsoft Label Recognizer excelle dans un domaine précis : l'extraction des zones de référence des passeports, la numérisation des numéros VIN des véhicules et la lecture structurée des étiquettes sur les emballages industriels. Il refuse de faire quoi que ce soit d'autre. Cette expertise pointue devient un problème budgétaire dès lors que votre application a besoin d'une reconnaissance optique de caractères (OCR) générale pour les documents, car vous devez alors acquérir une licence pour Reconnaissance d'étiquettes Dynamsoft pour la reconnaissance de zones modifiées (MRZ), Dynamsoft Barcode Reader pour les codes QR, Dynamsoft Document Normalizer pour la détection des contours, et vous devez encore rechercher une quatrième bibliothèque pour gérer les documents pleine page. IronOCR couvre chacune de ces capacités dans un seul package NuGet à $999 perpétuelle.
Comprendre Dynamsoft Label Recognizer
La société Dynamsoft Corporation, dont le siège social est situé à Vancouver, au Canada, a conçu son produit Label Recognizer autour d'une proposition spécifique : la reconnaissance fiable de textes structurés lisibles par machine dans des formats contraints. Le produit NuGet package est Dynamsoft.DotNet.LabelRecognizer, et sa licence commerciale fonctionne exclusivement sur des abonnements annuels — aucune option perpétuelle n'existe. Contactez Dynamsoft pour connaître les prix actuels.
Le modèle de reconnaissance de la bibliothèque est basé sur des modèles. Vous configurez les tâches de reconnaissance via une API de paramètres JSON (AppendSettingsFromString) puis appelez RecognizeFile ou RecognizeByFile sur les fichiers image. Les résultats sont renvoyés sous forme de collections de lignes contenant des chaînes de texte brutes. L'analyse de ces chaînes de caractères en données structurées et significatives (décalages de champs, conversions de dates, validation des chiffres de contrôle) est entièrement de votre responsabilité.
Principales caractéristiques architecturales de Dynamsoft Label Recognizer :
- Moteur de reconnaissance basé sur des modèles : les modèles MRZ, VIN et d'étiquettes nécessitent une configuration de modèle JSON avant la reconnaissance
- Sortie de texte brut uniquement :
RecognizeFilerenvoie des objetsLineResultavec des chaînes de texte ; pas d'analyse des champs structurés - Entrée d'images uniquement : aucune prise en charge native du format PDF ; Les fichiers PDF nécessitent une conversion externe en images avant traitement.
- Licences par abonnement annuel : Niveaux par appareil et par serveur disponibles ; contactez Dynamsoft pour connaître les prix actuels ; no one-time purchase
- Un produit distinct pour chaque fonctionnalité : la lecture de codes-barres, la normalisation de documents et l'optimisation de la caméra nécessitent chacune un produit sous licence distinct.
- Couverture linguistique limitée : axée sur les formats MRZ à caractères latins ; manque d'une large prise en charge des documents multilingues
L'API des paramètres d'exécution JSON
Chaque flux de travail de Reconnaissance d'étiquettes Dynamsoft commence par une étape de configuration de modèle. La reconnaissance MRZ, par exemple, nécessite le chargement d'un document JSON qui déclare les paramètres de reconnaissance, les modèles de caractères et les références de région avant tout traitement d'image :
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
La sortie de RecognizeFile est un texte brut MRZ tel que P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<<<. Pour obtenir Surname = "SMITH", GivenNames = "JOHN", DocumentNumber, DateOfBirth, et ExpiryDate en tant que propriétés typées, vous implémentez un analyseur TD1/TD2/TD3 vous-même. La documentation Dynamsoft et les fichiers source de ce dépôt estiment cet analyseur à environ 150 lignes de code d'analyse — gérant les décalages de caractères, << les séparateurs de nom, la désambiguïsation de l'année sur deux chiffres, et la validation des chiffres de contrôle — rien de tout cela n'est fourni par Dynamsoft.
Comprendre IronOCR
IronOCR est une bibliothèque OCR .NET commerciale construite sur un moteur Tesseract 5 optimisé avec une couche API gérée qui prend en charge le prétraitement, les formats d'entrée, la sortie structurée et l'analyse de documents spécialisés. L'installation est une seule commande NuGet : dotnet add package IronOcr. Aucune gestion binaire native, aucune configuration de dossier tessdata, aucun fichier de configuration de modèle.
Caractéristiques principales :
- Polyvalent et spécialisé : Prend en charge la reconnaissance optique de caractères (OCR) de documents pleine page, de PDF multipages, de lots d'images numérisées et de formats spécialisés (passeports, codes-barres, plaques d'immatriculation) à partir d'un seul et même logiciel.
- Pipeline de prétraitement automatique : les opérations de redressement, de débruitage, de contraste, de binarisation et d'amélioration de la résolution s'exécutent sans configuration manuelle sur des entrées de mauvaise qualité.
- Prise en charge native du format PDF : lecture directe des fichiers PDF numérisés et numériques, y compris les fichiers protégés par mot de passe, sans conversion externe.
- Hiérarchie de sortie structurée : les résultats affichent les pages, les paragraphes, les lignes, les mots et les cadres de délimitation des caractères avec leurs scores de confiance.
- Lecture de codes-barres intégrée : Activez
ocr.Configuration.ReadBarCodes = trueet les codes-barres sont extraits en même temps que le texte dans la même passe - Plus de 125 modules linguistiques : chaque langue s'installe en tant que package NuGet distinct ; aucune gestion de dossier de données de test n'est requise
- Licence perpétuelle : $999 Lite, $1,499 Plus, $2,999 Professional — achat unique, toutes plateformes, toutes fonctionnalités incluses
- Déploiement multiplateforme : Windows, Linux, macOS, Docker, AWS et Azure fonctionnent tous à partir du même package, sans configuration spécifique à la plateforme.
Comparaison des fonctionnalités
| Fonction | Reconnaissance d'étiquettes Dynamsoft | IronOCR |
|---|---|---|
| OCR de documents généraux | Non pris en charge | Prise en charge complète |
| Extraction de MRZ | Spécialisé (texte brut) | Intégré avec des champs analysés |
| Entrée PDF native | Non pris en charge | Oui |
| Lecture de codes-barres | Produit séparé (lecteur de codes-barres Dynamsoft) | Intégré (ReadBarCodes) |
| Sortie PDF consultable | Non pris en charge | Oui |
| Soutien linguistique | Limité (Latin MRZ) | plus de 125 langues |
| Modèle de licence | Abonnement annuel uniquement | Options d'abonnement perpétuel + |
| Produits nécessaires pour une couverture complète | 3+ | 1 |
Comparaison détaillée des fonctionnalités
| Fonction | Reconnaissance d'étiquettes Dynamsoft | IronOCR |
|---|---|---|
| Portée de la reconnaissance | ||
| OCR de documents généraux | Non pris en charge | Oui |
| Reconnaissance de la MRZ | Spécialisé | Oui (ReadPassport) |
| Reconnaissance du NIV | Spécialisé | Oui (via OCR standard) |
| lecture d'étiquettes industrielles | Spécialisé | Oui |
| Reconnaissance de l'écriture manuscrite | Non pris en charge | Oui |
| Extraction de tableaux | Non pris en charge | Oui |
| Formats d'entrée | ||
| Fichiers image (JPG, PNG, TIFF) | Oui | Oui |
| PDF (natif) | Non pris en charge | Oui |
| PDF protégé par mot de passe | Non pris en charge | Oui |
| Tableau d'octets / flux | Oui | Oui |
| Documents de plusieurs pages | Agrégation manuelle | Oui (natif) |
| Formats de sortie | ||
| Texte brut | Oui (lignes brutes) | Oui |
| Champs structurés (analysés) | Non fourni | Oui (Pages, Lignes, Mots) |
| PDF consultable | Non pris en charge | Oui |
| hOCR | Non pris en charge | Oui |
| scores de confiance | Par ligne | Par mot, par ligne et par page |
| Prétraitement | ||
| Prétraitement automatique | Basique | Oui (pipeline intelligent) |
| Correction de redressement/rotation | Limité | Oui |
| suppression du bruit | Limité | Oui |
| Amélioration du contraste | Limité | Oui |
| Normalisation DPI | Non fourni | Oui |
| Capacités d'intégration | ||
| Lecture de codes-barres | Produit séparé | Intégré |
| Normalisation des documents | Produit séparé | Non requis |
| OCR basé sur la région | Oui (via des modèles) | Oui (CropRectangle) |
| Traitement parallèle sécurisé pour les threads | Oui | Oui |
| Plateforme et déploiement | ||
| Fenêtres | Oui | Oui |
| Linux | Oui | Oui |
| macOS | Oui | Oui |
| Docker | Oui | Oui |
| Azure / AWS | Oui | Oui |
| Isolation physique / hors ligne | Oui | Oui |
| Licences et coûts | ||
| Abonnement annuel | Oui (contactez Dynamsoft pour les prix) | En option |
| Licence perpétuelle | Non disponible | Oui ($999 une fois) |
| Un seul package pour toutes les fonctionnalités | Non (3 produits ou plus) | Oui |
| Essai gratuit | 30 jours | Oui |
Spécialiste vs généraliste Champ d'application
La décision architecturale la plus importante prise par Dynamsoft a été de concevoir un logiciel spécialisé, et non généraliste. Ce choix a des conséquences directes pour toute application qui, partant de la lecture de zones de mémoire tampon (MRZ) ou d'étiquettes, nécessite par la suite des fonctionnalités plus avancées.
Approche Dynamsoft
Dynamsoft Label Recognizer gère exactement ce que décrivent ses modèles JSON, et rien de plus. Une application de traitement des passeports construite sur Dynamsoft a besoin de trois produits avant de pouvoir gérer un flux de travail documentaire réel :
// 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: Extraction de 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: Extraction de 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: Extraction de 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
Le code ci-dessus ne gère toujours pas les entrées PDF. Si le scan du passeport arrive au format PDF plutôt qu'en JPEG, vous devez ajouter une bibliothèque de rendu PDF avant toute autre opération. L'intégration totale pour un véritable flux de travail de passeport : quatre produits, quatre clés de licence, quatre interfaces de maintenance.
Approche d'IronOCR
IronOCR gère le même flux de travail de passeport (analyse MRZ, OCR pleine page, codes-barres et saisie PDF) à partir d'un seul package :
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
Un seul package, une seule clé de licence, une seule API. Pour le guide de lecture des passeports et la fonction de lecture des codes-barres , la documentation IronOCR les traite tous deux dans le même contexte produit car il s'agit du même produit.
Coût et complexité multiproduits
La construction d'un scanner d'inventaire d'entrepôt illustre le plus clairement la divergence du modèle de coûts. Le système doit lire les étiquettes des produits (texte), scanner les codes-barres (QR/EAN) et traiter les fichiers PDF d'expédition joints. Avec Dynamsoft, cela représente trois produits sous licence distincte avec des modèles d'initialisation différents.
Approche 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
Les fichiers PDF d'expédition nécessitent toujours un quatrième produit : Dynamsoft ne dispose pas de fonctionnalité OCR native pour les PDF. Licence annuelle pour trois produits Dynamsoft au niveau par serveur : 5 997 $+/an. Ajoutez une bibliothèque PDF et vous en êtes à plus de 6 300 $ par an avant même d'avoir écrit une seule ligne de logique métier.
Approche d'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
Pour la documentation OCR régionale et le guide d'importation PDF , IronOCR couvre les deux sans aucun produit supplémentaire.
Modèle de déploiement
Les deux bibliothèques fonctionnent sur site, sans transmission de données documentaires via le cloud. Les principales différences de déploiement concernent les modèles d'initialisation, la gestion des fichiers de configuration et le contenu de l'artefact de déploiement de chaque bibliothèque.
Approche Dynamsoft
Dynamsoft exige des appels d'initialisation statiques sur la classe SDK avant de créer une instance. Chaque produit possède son propre modèle d'initialisation, et la clé de licence active uniquement ce produit spécifique. Les fichiers de configuration de modèles — les documents de paramètres JSON pour MRZ, VIN, ou motifs d'étiquettes personnalisés — doivent être présents et correctement référencés lors de l'exécution. Un déploiement qui inclut Recognizer d'étiquettes et Reader de codes-barres gère deux flux d'activation, deux ensembles de modèles et deux chaînes Dispose.
Pour les déploiements en entrepôt ou sur borne interactive, la dépendance du fichier de configuration ajoute un artefact de déploiement en plus des fichiers binaires. Les modèles JSON sont des fichiers séparés, non compilés dans le package. Mal configurer le chemin du modèle sur un nouveau serveur et la reconnaissance renvoie silencieusement des résultats vides ou déclenche une erreur à l'exécution lors de l'appel AppendSettingsFromString.
Approche d'IronOCR
IronOCR se déploie sous la forme d'un seul package NuGet . L'activation de la licence consiste en l'affectation d'une chaîne de caractères sur une seule ligne :
// 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")
Aucun fichier modèle. Aucune gestion binaire native. Aucun dossier tessdata. Le guide de déploiement Docker nécessite seulement libgdiplus sur Linux— une %@--CODE-766--@@ ligne dans le 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"]
Ce même package prend en charge Linux , AWS Lambda et Azure App Service sans configuration spécifique à la plateforme. Pour les équipes utilisant des pipelines CI/CD, il n'existe pas de fichiers modèles à versionner ou à déployer séparément pour les artefacts.
Référence de mappage d'API
| Reconnaissance d'étiquettes Dynamsoft | Équivalent d'IronOCR |
|---|---|
LabelRecognizer.InitLicense(key) |
IronOcr.License.LicenseKey = key |
new LabelRecognizer() |
new IronTesseract() |
_recognizer.AppendSettingsFromString(json) |
Non requis — configuration automatique du moteur |
_recognizer.RecognizeFile(path) |
ocr.Read(path) |
_recognizer.RecognizeByFile(path, "") |
ocr.Read(path) |
result.LineResults[i].Text |
result.Lines[i].Text |
| Analyseur manuel TD3 MRZ (plus de 150 lignes) | ocr.ReadPassport(path).Surname etc. |
BarcodeReader.InitLicense(key) (produit distinct) |
ocr.Configuration.ReadBarCodes = true |
_barcodeReader.DecodeFile(path) |
result.Barcodes (même appel que OCR) |
barcode.BarcodeFormatString |
barcode.Format.ToString() |
barcode.BarcodeText |
barcode.Value |
DocumentNormalizer.InitLicense(key) (produit distinct) |
Non requis |
| Prise en charge des fichiers PDF non disponible | ocr.Read("document.pdf") |
| Aucun fichier PDF consultable | result.SaveAsSearchablePdf(path) |
recognizer.Dispose() |
using var ocr = new IronTesseract() |
Quand les équipes envisagent de passer de Dynamsoft à IronOCR
Le champ d'application s'étend au-delà des zones de gestion des déchets (MRZ) ou des étiquettes
La plupart des migrations ont lieu lorsqu'un projet débute de manière ciblée — par exemple, " lecture des passeports MRZ " — et que des exigences produit apparaissent ensuite. Le client souhaite archiver les passeports numérisés sous forme de PDF consultables. L'équipe de conformité souhaite effectuer une reconnaissance optique de caractères (OCR) sur les tampons de visa. La file d'attente du support technique contient des tickets concernant des fichiers PDF que Dynamsoft ne parvient pas à traiter. Dans ce cas, l'équipe assure la maintenance de Dynamsoft pour MRZ, Plus que d'une seconde bibliothèque OCR pour tous les autres types de documents. Deux contrats de licence, deux procédures de maintenance, deux modèles d'API dans le même code source. IronOCR gère la demande MRZ initiale via ReadPassport() et les exigences élargies via la même instance IronTesseract. Les équipes qui passent d'un système à deux bibliothèques à un seul package constatent généralement une réduction de 30 à 40 % du code de la couche d'intégration.
Les coûts d'abonnement annuels ne sont pas durables
Les coûts de licence Dynamsoft multi-produits se cumulent annuellement — contactez Dynamsoft pour connaître les prix actuels. Sur plusieurs années, les frais d'abonnement annuels combinés pour plusieurs produits peuvent largement dépasser le coût $999 unique d'IronOCR. Le modèle de licence perpétuelle est le plus important pour les produits avec une durée de vie commerciale définie — un système de traitement de documents gouvernementaux qui fonctionnera pendant sept ans ne veut pas d'une dépendance de renouvellement annuel sur un fournisseur spécialisé pour un composant central.
Saisie PDF requise
Dynamsoft Label Recognizer ne prend pas en charge nativement le format PDF. Chaque document livré au format PDF nécessite une étape de prétraitement : convertir chaque page en image, traiter l'image avec Dynamsoft, puis collecter et réassembler les résultats. Ce pipeline ajoute une dépendance de rendu PDF, une boucle d'itération de page et un problème de mappage de coordonnées si vous devez corréler les résultats de reconnaissance à la géométrie PDF originale. IronOCR lit les PDF nativement — ocr.Read("passport-scans.pdf") traite chaque page, et result.Pages vous donne accès par page au texte, aux mots, et aux scores de confiance. Pour les équipes où 20 % ou plus des données d'entrée arrivent sous forme de PDF, la solution de contournement de Dynamsoft ajoute une charge de maintenance importante à chaque mise à jour de la bibliothèque de rendu PDF.
La taxe sur l'intégration multiproduits est trop élevée.
Chaque produit Dynamsoft supplémentaire est un appel d'initialisation statique distinct, une chaîne Dispose distincte, et un fichier de configuration JSON distinct à gérer. Les équipes qui ont intégré trois produits Dynamsoft indiquent que la surface d'intégration représente le principal coût de maintenance, et non la qualité de la reconnaissance. La rotation des clés de licence, les mises à jour des versions du SDK et le déploiement des fichiers modèles doivent être coordonnés simultanément pour les trois produits. Le modèle à package unique d'IronOCR signifie une seule version à mettre à jour, une seule clé de licence à renouveler et une seule interface API à maintenir, quel que soit le nombre de fonctionnalités OCR utilisées par l'application.
Des types de documents internationaux sont nécessaires
Dynamsoft Label Recognizer est conçu autour des formats MRZ à caractères latins conformément au document 9303 de l'OACI. Les applications traitant des documents d'identité en langue CJK, des passeports en écriture arabe ou des étiquettes d'expédition multilingues atteignent rapidement les limites de couverture linguistique. IronOCR propose plus de 125 packs de langue sous forme de packages NuGet individuels : arabe, chinois simplifié, chinois traditionnel, japonais, coréen, et bien d'autres. Chacun s'installe via dotnet add package IronOcr.Languages.Arabic sans changer le code de reconnaissance. Le guide multilingue couvre la reconnaissance multilingue simultanée en quelques lignes de configuration.
Considérations courantes en matière de migration
Remplacement de l'analyseur MRZ
L'étape de migration la plus immédiate est de remplacer la combinaison RecognizeFile de Dynamsoft + analyseur TD3 manuel avec ReadPassport. Le chemin d'extraction Dynamsoft renvoie du texte brut comme P<GBRSMITH<<JOHN<<<<<<<<<<<<<<<<<<<<<<<<<< et nécessite plus de 150 lignes d'analyse de décalage de caractères pour le format TD3. Le remplaçant 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
L'analyseur syntaxique manuel a été entièrement supprimé. La détection des formats TD1 (cartes d'identité), TD2 (visas) et TD3 (passeports) est automatique dans ReadPassport. Le manuel de lecture du passeport indique comment remplir chaque champ renvoyé.
Consolidation de l'initialisation multiproduit
Les applications multi-produits Dynamsoft ont plusieurs appels statiques InitLicense au démarrage, chacun nécessitant sa propre clé. Regroupez ces éléments en une seule ligne de licence IronOCR et supprimez les blocs d'initialisation par produit :
// 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
Les appels Dynamsoft Dispose existants dans les classes de service devraient être remplacés par des blocs standard using sur des instances IronTesseract, ou une seule instance réutilisée enregistrée dans le conteneur DI. Le guide d'installation d'IronTesseract couvre les deux configurations.
Ajout de la prise en charge des fichiers PDF
La nouvelle fonctionnalité la plus couramment acquise par les équipes de migration est l'importation native de fichiers PDF — une fonctionnalité que Dynamsoft n'a jamais proposée. Après la suppression de la boucle de conversion PDF-image, la lecture native des PDF ne nécessite aucune modification du code au-delà du chemin d'entrée :
// 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")
Pour les équipes qui ont également besoin de produire des archives PDF interrogeables à partir d'entrées numérisées, SaveAsSearchablePdf est un appel de méthode unique. Le guide PDF consultable détaille les options de sortie.
Prétraitement pour la qualité des étiquettes industrielles
Le moteur de modèles de Dynamsoft est optimisé pour des conditions d'étiquetage contrôlées. Pour les images dégradées (étiquettes usées, emballages à faible contraste, numérisations industrielles déformées), le pipeline de prétraitement d'IronOCR comble les lacunes. Le guide de correction de la qualité d'image couvre chaque filtre. Pour les flux de travail spécifiques aux étiquettes, Deskew et Contrast sont les plus utiles :
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
Fonctionnalités supplémentaires d'IronOCR
Fonctionnalités non abordées dans les sections précédentes mais fréquemment utilisées par les équipes après la migration :
- Reconnaissance de l'écriture manuscrite : Traitement des notes et annotations manuscrites en parallèle du texte imprimé – une fonctionnalité que Dynamsoft ne propose pas.
- Traitement des documents numérisés : PDF numérisés multipages avec prétraitement automatique par page
- Extraction de données tabulaires : Détection et extraction de données tabulaires à partir de factures, de manifestes et de feuilles de données.
- Exportation hOCR : Exporter les résultats de reconnaissance au format HTML avec les coordonnées du cadre de délimitation pour l'analyse de mise en page ultérieure
- OCR asynchrone : reconnaissance non bloquante pour les applications serveur ASP.NET et à haut débit
- Suivi de la progression : Surveillez les tâches par lots multipages grâce aux rappels de progression.
- Index de plus de 125 langues : Liste complète des packages NuGet pour les langues prises en charge, y compris les alphabets non latins
- Lecture MICR/chèques : Reconnaissance de caractères magnétiques pour le traitement des documents financiers — un autre cas d'utilisation spécialisé géré dans un seul package
- Scores de confiance par mot : Signaux de qualité précis pour les chaînes de traitement automatisées des documents
Compatibilité .NET et préparation à l'avenir
IronOCR cible .NET 8 et .NET 9 comme environnements d'exécution de premier ordre, avec une compatibilité ascendante totale avec .NET Framework 4.6.2 et .NET Core 3.1. La bibliothèque est distribuée sous la forme d'un package NuGet unique qui résout automatiquement le binaire de la plateforme appropriée pour Fenêtresx64, Fenêtresx86, Linuxx64, macOSx64 et macOSARM grâce au graphe d'identificateurs d'exécution de NuGet — sans références de package conditionnelles ni fichiers de projet spécifiques à la plateforme. Reconnaissance d'étiquettes Dynamsoft prend également en charge les environnements d'exécution .NET modernes, mais son modèle multiproduit implique que la compatibilité .NET de chaque produit doit être vérifiée et mise à jour indépendamment. Le rythme de développement actif d'IronOCR assure des mises à jour des packages NuGet alignées sur chaque cycle de publication de .NET , et le modèle à package unique signifie que la compatibilité avec .NET 10, prévue pour fin 2026, s'appliquera uniformément à toutes les fonctionnalités sans suivi par produit.
Conclusion
Dynamsoft Label Recognizer est un logiciel spécialisé et performant. Pour une borne interactive traitant uniquement les zones de reconnaissance d'étiquettes (MRZ) des passeports, ou une station de montage lisant uniquement les codes VIN, son moteur de reconnaissance basé sur des modèles remplit cette fonction spécifique avec fiabilité. Le problème, c'est que les applications réelles restent rarement limitées à un domaine précis. Les pages de données complètes des passeports doivent être numérisées par reconnaissance optique de caractères (OCR). Les étiquettes d'expédition sont fournies au format PDF. Les systèmes d'inventaire nécessitent le code-barres et le texte lors du même passage. Chaque extension de périmètre nécessite la maintenance d'un autre produit Dynamsoft, d'une nouvelle licence annuelle et d'une nouvelle interface API.
Le modèle de coûts le concrétise. Les totaux sur plusieurs années pour la lecture MRZ plus codes-barres au sein d'une équipe de développement utilisant le modèle d'abonnement annuel de Dynamsoft se cumulent de manière significative. IronOCR couvre les deux capacités — plus PDF natif, sortie PDF interrogeable, OCR complet du document, plus de 125 langues, et prétraitement — à $999 une fois. La migration elle-même est largement mécanique : remplacez RecognizeFile par ocr.Read, supprimez l'analyseur MRZ TD3 manuel, activez ReadBarCodes = true, et retirez la boucle de rendu PDF externe.
La différence architecturale ne se limite pas au coût. La conception de Dynamsoft oblige les équipes à penser en termes de produits plutôt qu'en termes de fonctionnalités, à se demander " quel produit Dynamsoft gère cela ? " avant même d'écrire une seule ligne de code. La conception d'IronOCR inverse cela : une instance, une configuration, un objet résultat, quel que soit le contenu du document. Cette différence s'accentue tout au long de la durée de vie d'un projet, à mesure que les exigences augmentent.
Pour les équipes qui développent des applications innovantes nécessitant une combinaison de reconnaissance MRZ, de lecture de codes-barres, d'OCR de documents généraux ou de traitement PDF, le modèle tout-en-un d'IronOCR élimine dès le départ le problème de coordination multi-produits. Pour les équipes utilisant actuellement plusieurs produits Dynamsoft ainsi qu'une bibliothèque OCR distincte, le processus de migration consolide cette interface en une seule dépendance. Le centre de documentation IronOCR couvre toutes les fonctionnalités abordées ici avec des exemples de code fonctionnels et des guides de déploiement.
Questions Fréquemment Posées
Qu'est-ce que Dynamsoft OCR SDK ?
Dynamsoft OCR SDK est une solution d'OCR utilisée par les développeurs et les entreprises pour extraire du texte à partir d'images et de documents. Il s'agit de l'une des nombreuses options d'OCR évaluées aux côtés d'IronOCR pour le développement d'applications .NET.
Comment IronOCR se compare-t-il à Dynamsoft OCR SDK for .NET developers ?
IronOCR est une bibliothèque OCR .NET native de NuGet qui utilise IronTesseract comme moteur principal. Par rapport au SDK OCR de Dynamsoft, elle offre un déploiement plus simple (pas d'installateurs SDK), un prix forfaitaire et une API C# propre sans interopérabilité COM ou dépendances cloud.
IronOcr est-il plus facile à installer que Dynamsoft OCR SDK ?
IronOCR s'installe via un seul package NuGet. Il n'y a pas d'installateur SDK, de fichiers de licence à copier, de composants COM à enregistrer ou de binaires d'exécution séparés à gérer. L'ensemble du moteur d'OCR est inclus dans le package.
Quelles sont les différences de précision entre Dynamsoft OCR SDK et IronOCR ?
IronOcr atteint une grande précision de reconnaissance pour les documents commerciaux standard, les factures, les reçus et les formulaires numérisés. Pour les documents très dégradés ou les scripts peu courants, la précision varie en fonction de la qualité de la source. IronOCR comprend des filtres de prétraitement d'image pour améliorer la reconnaissance sur des entrées de faible qualité.
IronOCR prend-il en charge l'extraction de texte au format PDF ?
Oui. IronOCR extrait le texte des PDF natifs et des images PDF numérisées en un seul appel. Il prend également en charge les fichiers TIFF multipages, les images et les flux. Pour les PDF numérisés, l'OCR est appliquée page par page avec des objets de résultat par page.
Comment la licence du SDK OCR de Dynamsoft se compare-t-elle à celle d'IronOCR ?
IronOCR utilise une licence perpétuelle forfaitaire sans frais par page ou par scan. Les organisations qui traitent de gros volumes de documents paient le même coût de licence, quel que soit le volume. Les détails et la tarification au volume se trouvent sur la page de licence d'IronOCR.
Quelles langues IronOCR prend-il en charge ?
IronOcr prend en charge 127 langues via des packs linguistiques NuGet distincts. L'ajout d'une langue nécessite une seule commande "dotnet add package IronOcr.Languages.{Language}". Il n'est pas nécessaire de placer manuellement des fichiers ou de configurer des chemins d'accès.
Comment installer IronOCR dans un projet .NET ?
Installation via NuGet : 'Install-Package IronOcr' dans la console du Package Manager ou 'dotnet add package IronOcr' dans le CLI. Les packs de langues supplémentaires sont installés de la même manière. Aucun programme d'installation du SDK n'est nécessaire.
IronOCR est-il adapté à Docker et aux déploiements conteneurisés, contrairement à Dynamsoft OCR ?
Oui. IronOCR fonctionne dans les conteneurs Docker via son package NuGet. La clé de licence est définie via une variable d'environnement. Aucun fichier de licence, chemin d'accès au SDK ou montage de volume n'est nécessaire pour le moteur OCR lui-même.
Puis-je essayer IronOcr avant de l'acheter, par rapport à Dynamsoft OCR ?
Oui. Le mode d'essai d'IronOcr traite les documents et renvoie les résultats de l'OCR avec un filigrane en surimpression sur la sortie. Vous pouvez vérifier la précision sur vos propres documents avant d'acheter une licence.
IronOCR prend-il en charge la lecture de codes-barres parallèlement à l'extraction de texte ?
IronOCR se concentre sur l'extraction de texte et l'OCR. Pour la lecture de codes-barres, Iron Software propose IronBarcode comme bibliothèque d'accompagnement. Les deux sont disponibles individuellement ou dans le cadre de l'offre groupée Iron Suite.
Est-il facile de migrer du SDK OCR de Dynamsoft vers IronOCR ?
La migration du SDK OCR de Dynamsoft vers IronOCR implique généralement le remplacement des séquences d'initialisation par l'instanciation d'IronTesseract, la suppression de la gestion du cycle de vie de COM et la mise à jour des appels d'API. La plupart des migrations réduisent considérablement la complexité du code.

