Une comparaison entre IronOCR et Aspose.OCR
Asprise OCR propose d'abord une bibliothèque Javaet considère .NETcomme une cible secondaire — et cette décision de conception se reflète à tous les niveaux du produit, depuis la documentation rédigée avec des exemples Javajusqu'à un modèle de déploiement binaire natif qui nécessite des DLL spécifiques à la plateforme (aocr.dll, aocr_x64.dll, libaocr.so, libaocr.dylib) sur chaque machine exécutant le logiciel. Le modèle de threads aggrave ce problème : les licences Lite et STANDARD sont contractuellement limitées à une exécution monothread et monoprocessus, ce qui signifie que chaque point de terminaison ASP.NET Core , service Windows ou fonction Azure qui appelle Asprise sur ces niveaux enfreint le contrat de licence. Pour les équipes .NETqui développent des systèmes de production, il ne s'agit pas de préoccupations théoriques, mais de véritables obstacles au déploiement qui obligent soit à acquérir des licences Enterprise coûteuses, soit à remplacer la bibliothèque avant d'atteindre la production.
Comprendre l'OCR d'Asprise
Asprise OCR est un produit OCR commercial d'Asprise Inc. Initialement conçu comme un moteur OCR Java, il a ensuite été compatible avec .NETgrâce à des bibliothèques natives assurant la liaison entre le code C# managé et les binaires OCR non managés sous-jacents. Cette architecture de pont est la caractéristique déterminante de la bibliothèque pour les développeurs .NET.
Principales caractéristiques architecturales :
- Conception axée sur Java : toute la documentation principale, les exemples de code et les exemples du SDK sont écrits en Java. Les développeurs .NETtraduisent mentalement à partir de Javaou s'appuient sur une documentation secondaire éparse.
- Dépendance binaire native : les DLL non gérées spécifiques à la plateforme doivent être présentes dans le répertoire de déploiement ou le chemin système. Le binaire correct doit correspondre à l'architecture du processus — les processus 32 bits nécessitent
aocr.dll, les processus 64 bits nécessitentaocr_x64.dll. - Cycle de vie manuel du moteur : La bibliothèque expose un schéma d'initialisation de style C (
Ocr.SetUp(),ocr.StartEngine(),ocr.StopEngine()) hérité de ses origines Java. Il n'y a pas de mise en œuvre deIDisposable. OublierStopEngine()entraîne des fuites de mémoire native. - Restrictions de threads selon le niveau de licence : les niveaux Lite (~299 $) et STANDARD (~699 $) permettent uniquement une exécution monothread et monoprocessus. Le multithreading nécessite la Enterprise, ce qui implique de contacter le service commercial.
- Codes d'erreur, pas d'exceptions : Les échecs de reconnaissance se manifestent par des retours nuls ou des chaînes de caractères préfixées avec
"ERROR:", conformément aux conventions de codes d'erreur C/Java plutôt qu'aux modèles d'exception .NET. - Plus de 20 langues OCR : nettement moins que les alternatives conçues pour l'écosystème .NET.
Le problème du cycle de vie du moteur
Chaque appel OCR d'Asprise nécessite une gestion explicite du moteur. Le processus comporte quatre étapes obligatoires : configuration globale statique, création d'une instance, démarrage du moteur avec une chaîne de caractères de langue et arrêt du moteur une fois l'opération terminée. Ignorer l'arrêt du moteur entraîne des fuites de ressources natives car le ramasse-miettes ne peut pas libérer la mémoire non gérée :
// Asprise: four required steps before reading a single image
Ocr.SetUp(); // Static global init
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST); // Allocates native engine
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine(); // Must call — no IDisposable fallback
}
// Asprise: four required steps before reading a single image
Ocr.SetUp(); // Static global init
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST); // Allocates native engine
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine(); // Must call — no IDisposable fallback
}
' Asprise: four required steps before reading a single image
Ocr.SetUp() ' Static global init
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST) ' Allocates native engine
Dim text As String = ocr.Recognize( _
imagePath, _
Ocr.RECOGNIZE_TYPE_TEXT, _
Ocr.OUTPUT_FORMAT_PLAINTEXT)
Return text
Finally
ocr.StopEngine() ' Must call — no IDisposable fallback
End Try
Ce schéma échoue silencieusement dans trois situations courantes : une exception non gérée avant que StopEngine() ne soit appelée, un chemin de code refactorisé qui ignore le nettoyage et une utilisation concurrente sur LITE/STANDARD où la licence interdit le threading qui permettrait même le parallélisme. Le bloc finally atténue le premier problème, mais la restriction de la licence rend le schéma caduc pour les charges de travail serveur de toute façon.
Comprendre IronOCR
IronOCR est une bibliothèque OCR commerciale conçue de A à Z for .NET. Il intègre un moteur Tesseract 5 optimisé avec prétraitement automatique, prise en charge native du format PDF et une API gérée qui respecte les conventions .NETstandard.
Caractéristiques principales :
- Paquet NuGet unique :
dotnet add package IronOcrinstalle tout — pas de gestion de binaire natif, pas de dossiers tessdata, pas de configuration spécifique à la plateforme. - Gestion des ressources
IDisposable:OcrInputimplémenteIDisposable. L'instructionusinggère le nettoyage automatiquement. - Gestion des threads sécurisée sur tous les niveaux de licence : aucune restriction artificielle du multithreading. Les instances
IronTesseractpeuvent être utilisées en parallèle sur la licence $999 Lite. - Prétraitement automatique : Les méthodes intégrées
Deskew(),DeNoise(),Contrast(),Binarize()etEnhanceResolution()éliminent le besoin de bibliothèques de traitement d'images externes. - Entrée PDF native : transmettez directement un chemin PDF — aucune bibliothèque de rendu externe n'est requise pour convertir au préalable les pages en images.
- Plus de 125 langues : Disponibles sous forme de packages NuGet distincts (
IronOcr.Languages.French, etc.), installés uniquement lorsque nécessaire. - Sortie PDF avec texte indexable :
result.SaveAsSearchablePdf()génère une sortie conforme à PDF/A à partir de tout résultat OCR. - Accès aux données structurées : les résultats présentent le texte au niveau du mot, de la ligne et du paragraphe avec les coordonnées en pixels et les scores de confiance par mot.
Comparaison des fonctionnalités
| Fonction | Asprise OCR | IronOCR |
|---|---|---|
| Plateforme principale | Java | .NET |
| Déploiement NuGet | Wrapper + DLL natives | Forfait unique, sans supplément |
| Enfilage (tous niveaux) | Enterprise uniquement | Tous les niveaux |
| Utilisation d'applications serveur/web | Enterprise uniquement | Tous les niveaux |
| Entrée PDF native | Non | Oui |
| Prétraitement intégré | Non | Oui |
| Langues OCR | 20+ | 125+ |
| Sortie PDF consultable | Non | Oui |
Comparaison détaillée des fonctionnalités
| Fonction | Asprise OCR | IronOCR |
|---|---|---|
| Architecture | ||
| Origine du design | Java, .NETsecondaire | .NETnatif |
| style API | Style C avec constantes entières | C# fluide |
IDisposable / modèle using |
Non mis en œuvre | Oui (OcrInput) |
| Gestion des erreurs | Les valeurs nulles ou les chaînes d'erreur sont renvoyées. | exceptions .NET |
| Propagation des exceptions depuis le natif | lacunes d'interopérabilité | Exceptions gérées |
| Utilisation des threads et du serveur | ||
| Multithreading — Niveau Lite | Interdit | Permis |
| Multithreading — Niveau STANDARD | Interdit | Permis |
| Multithreading — Enterprise/niveau supérieur | Permis | Permis |
| API Web ASP.NET Core | Nécessite une Enterprise | N'importe quel niveau |
| Azure Functions / AWS Lambda | Nécessite une Enterprise | N'importe quel niveau |
| Parallel.ForEach lot | Nécessite une Enterprise | N'importe quel niveau |
| Assistance à la saisie | ||
| Fichiers image (JPG, PNG, TIFF) | Oui | Oui |
| Entrée PDF native | Non (bibliothèque externe requise) | Oui |
| PDF protégé par mot de passe | Non | Oui |
| Entrée de tableau d'octets / flux | Limité | Oui |
| TIFF multipage | Limité | Oui |
| Prétraitement | ||
| Déclin | Manuel / externe | Intégré |
| Denoise | Manuel / externe | Intégré |
| Amélioration du contraste | Manuel / externe | Intégré |
| Binarisation | Manuel / externe | Intégré |
| Mise à l'échelle de la résolution (DPI) | Manuel / externe | Intégré |
| Sortir | ||
| Texte brut | Oui | Oui |
| Sortie PDF consultable | Non | Oui |
| Coordonnées du mot | Limité | Oui |
| Scores de confiance par mot | Non | Oui |
| Exportation hOCR | Non | Oui |
| Langues | ||
| Nombre de langues | 20+ | 125+ |
| Installation linguistique | Ensemble | packages NuGet |
| Énumération de langage fortement typé | Non (codes de chaîne) | Oui (OcrLanguage) |
| Déploiement | ||
| binaire natif requis | Oui (DLL spécifique à la plateforme) | Non |
| Gestion des dossiers Tessdata | Non | Non |
| Docker | Configuration binaire manuelle | Prêt à l'emploi |
| Linux | Nécessite libaocr.so |
NuGet gère |
| Tarification | ||
| Prix d'entrée | Contactez Asprise pour les prix (LITE, single-thread seulement) | $999 (Lite, toutes les fonctionnalités) |
| Prix d'entrée pour l'utilisation du serveur | Enterprise (contacter le service commercial) | $999 (Lite) |
Architecture de pont .NETnatif vs Java
Pour les équipes .NET, la question fondamentale n'est pas de savoir quelle bibliothèque possède le plus de fonctionnalités sur le papier, mais laquelle se comporte comme un élément .NETà part entière dans les environnements de déploiement et d'exploitation qu'elles utilisent réellement.
Approche d'entreprise
Asprise assure la communication entre le code .NETmanagé et son moteur OCR non managé via le marshaling P/Invoke. La source asprise-vs-ironocr-examples.cs montre le mécanisme sous-jacent :
// Asprise interop layer — bridging managed C# to native OCR engine
[DllImport("aocr.dll")]
private static extern IntPtr OCR(string imagePath, int type);
public string ExtractText(string imagePath)
{
// P/Invoke call into unmanaged DLL
IntPtr result = OCR(imagePath, 0);
return Marshal.PtrToStringAnsi(result); // Manual string marshal
}
// Asprise interop layer — bridging managed C# to native OCR engine
[DllImport("aocr.dll")]
private static extern IntPtr OCR(string imagePath, int type);
public string ExtractText(string imagePath)
{
// P/Invoke call into unmanaged DLL
IntPtr result = OCR(imagePath, 0);
return Marshal.PtrToStringAnsi(result); // Manual string marshal
}
Imports System.Runtime.InteropServices
' Asprise interop layer — bridging managed VB.NET to native OCR engine
Private Class OCRInterop
<DllImport("aocr.dll")>
Private Shared Function OCR(imagePath As String, type As Integer) As IntPtr
End Function
Public Function ExtractText(imagePath As String) As String
' P/Invoke call into unmanaged DLL
Dim result As IntPtr = OCR(imagePath, 0)
Return Marshal.PtrToStringAnsi(result) ' Manual string marshal
End Function
End Class
Au niveau de l'API de plus haut niveau, les développeurs font appel au même pont via un wrapper de classe, mais l'exigence de déploiement ne change pas : chaque machine cible a besoin du binaire natif correct, dans le bon chemin, correspondant à l'architecture de processus correcte. Un déploiement 64 bits qui expédie avec aocr.dll au lieu de aocr_x64.dll lance un BadImageFormatException au moment de l'exécution. Un conteneur DockerLinux sans libaocr.so dans LD_LIBRARY_PATH lance DllNotFoundException. Aucune des deux erreurs n'est détectée lors de la compilation.
Approche d'IronOCR
IronOCR s'installe sous forme d'une seule référence NuGet . Le package gère toutes les dépendances natives en interne via le mécanisme de sélection de packages spécifique à la plateforme de NuGet :
// Installation — one command, all platforms
// dotnet add package IronOcr
// License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Basic OCR — no native binary setup, no tessdata, no config files
var text = new IronTesseract().Read("document.jpg").Text;
// Installation — one command, all platforms
// dotnet add package IronOcr
// License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Basic OCR — no native binary setup, no tessdata, no config files
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr
' Installation — one command, all platforms
' dotnet add package IronOcr
' License setup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
' Basic OCR — no native binary setup, no tessdata, no config files
Dim text As String = New IronTesseract().Read("document.jpg").Text
L'instruction using sur OcrInput remplace les appels manuels de cycle de vie du moteur. Il n'y a aucun StartEngine() à appeler et aucun StopEngine() à oublier. Le ramasse-miettes et le modèle IDisposable gèrent correctement le nettoyage dans les scénarios d'exception sans nécessiter d'échafaudage try/finally autour de chaque appel OCR.
Pour des instructions d'installation détaillées, consultez le guide d'installation d'IronTesseract .
Modèle de filetage
La restriction du nombre de threads constitue la différence la plus importante entre Asprise et les alternatives pour les développeurs de serveurs .NET. Il ne s'agit pas d'un problème de performance, mais d'un problème de conformité des licences.
Approche d'entreprise
Les licences Lite et STANDARD interdisent explicitement l'exécution multithread et multiprocessus. Tout code appelant Asprise depuis plusieurs threads simultanément enfreint le contrat de licence relatif à ces niveaux. ASP.NET Core traite par défaut les requêtes sur un pool de threads. Cela fait de chaque contrôleur d'API Web standard qui appelle Asprise une violation de licence sur Lite/STANDARD :
// ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
// Web server thread pool = multiple concurrent threads = prohibited
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Two concurrent requests = two threads = license violation
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var text = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
return Ok(text);
}
}
// ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
// Web server thread pool = multiple concurrent threads = prohibited
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Two concurrent requests = two threads = license violation
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var text = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
return Ok(text);
}
}
Imports Microsoft.AspNetCore.Mvc
' ASPRISE LITE/STANDARD — violates license in ASP.NET Core context
' Web server thread pool = multiple concurrent threads = prohibited
<ApiController>
Public Class OcrController
Inherits ControllerBase
<HttpPost("extract")>
Public Function ExtractText(file As IFormFile) As IActionResult
' Two concurrent requests = two threads = license violation
Dim ocr As New Ocr()
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim text As String = ocr.Recognize(tempPath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
ocr.StopEngine()
Return Ok(text)
End Function
End Class
Le traitement par lots sur Lite/STANDARD est forcé en mode séquentiel quel que soit le nombre de cœurs de processeur disponibles :
// ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
foreach (var path in imagePaths) // Cannot use Parallel.ForEach — license violation
{
string text = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
results.Add(text);
}
}
finally
{
ocr.StopEngine();
}
// ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
foreach (var path in imagePaths) // Cannot use Parallel.ForEach — license violation
{
string text = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
results.Add(text);
}
}
finally
{
ocr.StopEngine();
}
' ASPRISE LITE/STANDARD — sequential only (100 docs at 2 sec each = 3+ minutes)
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
For Each path In imagePaths ' Cannot use Parallel.ForEach — license violation
Dim text As String = ocr.Recognize(path, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
results.Add(text)
Next
Finally
ocr.StopEngine()
End Try
ENTERPRISE supprime la limitation de thread, mais ENTERPRISE nécessite de contacter les ventes d'Asprise avec un prix non publié.
Approche d'IronOCR
IronTesseract est thread-safe et ne comporte aucune restriction de threading sur aucun niveau de licence. Le traitement par lots parallèle sur une licence $999 Lite est entièrement pris en charge :
// IronOCR — parallel batch on any license tier
// 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
var results = imagePaths
.AsParallel()
.Select(path => new IronTesseract().Read(path).Text)
.ToList();
// IronOCR — parallel batch on any license tier
// 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
var results = imagePaths
.AsParallel()
.Select(path => new IronTesseract().Read(path).Text)
.ToList();
Imports System.Linq
' IronOCR — parallel batch on any license tier
' 100 docs at 2 sec each, 8 cores = ~25 seconds vs 200 seconds sequential
Dim results = imagePaths _
.AsParallel() _
.Select(Function(path) (New IronTesseract()).Read(path).Text) _
.ToList()
Les contrôleurs ASP.NET Core fonctionnent sans configuration particulière :
// IronOCR — concurrent requests on any license tier
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
var text = new IronTesseract().Read(tempPath).Text;
return Ok(text);
}
}
// IronOCR — concurrent requests on any license tier
[ApiController]
public class OcrController : ControllerBase
{
[HttpPost("extract")]
public IActionResult ExtractText(IFormFile file)
{
// Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
var text = new IronTesseract().Read(tempPath).Text;
return Ok(text);
}
}
Imports Microsoft.AspNetCore.Mvc
<ApiController>
Public Class OcrController
Inherits ControllerBase
<HttpPost("extract")>
Public Function ExtractText(file As IFormFile) As IActionResult
' Thread-safe on Lite, Plus, Professional, Unlimited — all tiers
Dim text = New IronTesseract().Read(tempPath).Text
Return Ok(text)
End Function
End Class
Consultez l' exemple de multithreading pour les modèles de débit parallèle dans les charges de travail par lots.
Prétraitement d'images
Asprise transmet les images à son moteur natif sans prétraitement. Les numérisations de mauvaise qualité (pages déformées, artefacts de bruit, faible contraste) dégradent directement la précision de la reconnaissance optique de caractères (OCR) car il n'existe aucune couche de prétraitement pour corriger les défauts de l'image avant la reconnaissance.
Approche d'entreprise
Le prétraitement nécessite une bibliothèque d'images externe. Un développeur travaillant avec Asprise ajoute une dépendance telle que ImageMagick, SkiaSharp ou System.Drawing, exécute manuellement les opérations de prétraitement, enregistre l'image traitée dans un fichier temporaire, puis transmet ce fichier à Asprise :
// Asprise preprocessing: external dependency required
// 1. Load with external library
// 2. Apply corrections (deskew, denoise, contrast) with external library
// 3. Save to temp file
// 4. Pass temp file to Asprise
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
// preprocessedImagePath comes from your external preprocessing pipeline
string text = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
// Asprise preprocessing: external dependency required
// 1. Load with external library
// 2. Apply corrections (deskew, denoise, contrast) with external library
// 3. Save to temp file
// 4. Pass temp file to Asprise
var ocr = new Ocr();
ocr.StartEngine("eng", Ocr.SPEED_FAST);
// preprocessedImagePath comes from your external preprocessing pipeline
string text = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
ocr.StopEngine();
' Asprise preprocessing: external dependency required
' 1. Load with external library
' 2. Apply corrections (deskew, denoise, contrast) with external library
' 3. Save to temp file
' 4. Pass temp file to Asprise
Dim ocr As New Ocr()
ocr.StartEngine("eng", Ocr.SPEED_FAST)
' preprocessedImagePath comes from your external preprocessing pipeline
Dim text As String = ocr.Recognize(preprocessedImagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
ocr.StopEngine()
Cela ajoute une dépendance de compilation, une surcharge d'exécution due à la bibliothèque supplémentaire et exige que le développeur comprenne suffisamment bien le traitement d'images pour mettre en œuvre des corrections efficaces.
Approche d'IronOCR
Le prétraitement est intégré dans OcrInput. Le même pipeline qui nécessitait 50 à 100 lignes avec une bibliothèque externe et un réglage précis des paramètres se réduit désormais à cinq appels de méthode :
// IronOCR — preprocessing built in, no external dependencies
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct page rotation
input.DeNoise(); // Remove scanner artifacts
input.Contrast(); // Improve text/background separation
input.Binarize(); // Convert to black/white for cleaner engine input
input.EnhanceResolution(300); // Scale to optimal DPI
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// IronOCR — preprocessing built in, no external dependencies
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct page rotation
input.DeNoise(); // Remove scanner artifacts
input.Contrast(); // Improve text/background separation
input.Binarize(); // Convert to black/white for cleaner engine input
input.EnhanceResolution(300); // Scale to optimal DPI
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
' IronOCR — preprocessing built in, no external dependencies
Using input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")
input.Deskew() ' Correct page rotation
input.DeNoise() ' Remove scanner artifacts
input.Contrast() ' Improve text/background separation
input.Binarize() ' Convert to black/white for cleaner engine input
input.EnhanceResolution(300) ' Scale to optimal DPI
Dim result = New IronTesseract().Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
Pour les numérisations où la rotation est imprévisible, la correction automatique de l'angle de rotation gère les angles arbitraires sans que le développeur ait besoin de détecter ou de spécifier les valeurs de rotation. Le guide de correction de la qualité d'image couvre l'ensemble des filtres et explique quand appliquer chacun d'eux.
Traitement de PDF
L'importation de fichiers PDF est une exigence fréquente dans les chaînes de traitement de documents. Asprise ne prend pas en charge nativement le format PDF — la bibliothèque fonctionne avec des fichiers image. Le traitement d'un PDF avec Asprise nécessite d'abord la conversion de chaque page en image à l'aide d'une bibliothèque externe, puis le traitement individuel de chaque fichier image.
Approche d'entreprise
// Asprise PDF workaround — external library required to render PDF pages
var images = ExternalPdfLibrary.RenderPages("invoice.pdf");
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var allText = new System.Text.StringBuilder();
foreach (var imagePath in images)
{
string pageText = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
allText.Append(pageText);
}
return allText.ToString();
}
finally
{
ocr.StopEngine();
}
// Also: clean up temp image files
// Asprise PDF workaround — external library required to render PDF pages
var images = ExternalPdfLibrary.RenderPages("invoice.pdf");
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
var allText = new System.Text.StringBuilder();
foreach (var imagePath in images)
{
string pageText = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT);
allText.Append(pageText);
}
return allText.ToString();
}
finally
{
ocr.StopEngine();
}
// Also: clean up temp image files
Imports System.Text
' Asprise PDF workaround — external library required to render PDF pages
Dim images = ExternalPdfLibrary.RenderPages("invoice.pdf")
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim allText As New StringBuilder()
For Each imagePath In images
Dim pageText As String = ocr.Recognize(imagePath, Ocr.RECOGNIZE_TYPE_TEXT, Ocr.OUTPUT_FORMAT_PLAINTEXT)
allText.Append(pageText)
Next
Return allText.ToString()
Finally
ocr.StopEngine()
End Try
' Also: clean up temp image files
Cette approche ajoute une dépendance au rendu PDF (généralement iText, PDFSharp ou un moteur commercial), nécessite une gestion des fichiers temporaires, et perd les métadonnées et la structure PDF qu'un lecteur PDF natif préserverait. Les fichiers PDF protégés par mot de passe nécessitent un troisième élément.
Approche d'IronOCR
IronOCR lit directement les fichiers PDF. La méthode OcrInput.LoadPdf() gère le rendu en interne, y compris les documents multipages et les fichiers protégés par mot de passe :
// IronOCR — native PDF input, no external rendering library
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// Password-protected PDFs — same API, one parameter
using var secureInput = new OcrInput();
secureInput.LoadPdf("confidential.pdf", Password: "secret");
var secureResult = new IronTesseract().Read(secureInput);
// Generate searchable PDF from a scanned document
var scanResult = new IronTesseract().Read("scanned-contract.pdf");
scanResult.SaveAsSearchablePdf("searchable-contract.pdf");
// IronOCR — native PDF input, no external rendering library
using var input = new OcrInput();
input.LoadPdf("invoice.pdf");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
// Password-protected PDFs — same API, one parameter
using var secureInput = new OcrInput();
secureInput.LoadPdf("confidential.pdf", Password: "secret");
var secureResult = new IronTesseract().Read(secureInput);
// Generate searchable PDF from a scanned document
var scanResult = new IronTesseract().Read("scanned-contract.pdf");
scanResult.SaveAsSearchablePdf("searchable-contract.pdf");
Imports IronOcr
' IronOCR — native PDF input, no external rendering library
Using input As New OcrInput()
input.LoadPdf("invoice.pdf")
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text)
End Using
' Password-protected PDFs — same API, one parameter
Using secureInput As New OcrInput()
secureInput.LoadPdf("confidential.pdf", Password:="secret")
Dim secureResult = New IronTesseract().Read(secureInput)
End Using
' Generate searchable PDF from a scanned document
Dim scanResult = New IronTesseract().Read("scanned-contract.pdf")
scanResult.SaveAsSearchablePdf("searchable-contract.pdf")
Le guide OCR PDF aborde la sélection de la plage de pages, la gestion des types de PDF mixtes et la sortie de PDF consultables pour les flux de travail d'archivage.
Référence de mappage d'API
| Asprise OCR | Équivalent d'IronOCR |
|---|---|
Ocr.SetUp() |
Non requis |
new Ocr() |
new IronTesseract() |
ocr.StartEngine("eng", Ocr.SPEED_FAST) |
Non requis (le moteur s'initialise lors de la première utilisation) |
ocr.Recognize(path, type, format) |
ocr.Read(path) |
Ocr.RECOGNIZE_TYPE_TEXT |
Comportement par défaut |
Ocr.RECOGNIZE_TYPE_BARCODE |
ocr.Configuration.ReadBarCodes = true |
Ocr.RECOGNIZE_TYPE_ALL |
ocr.Configuration.ReadBarCodes = true |
Ocr.OUTPUT_FORMAT_PLAINTEXT |
result.Text |
Ocr.OUTPUT_FORMAT_XML |
result.Words / résultat structuré |
Ocr.OUTPUT_FORMAT_PDF |
result.SaveAsSearchablePdf() |
Ocr.SPEED_FASTEST |
ocr.Configuration réglages de vitesse |
Ocr.SPEED_FAST |
Configuration par défaut |
Ocr.SPEED_SLOW |
Configuration de plus haute précision |
ocr.StopEngine() |
Non requis (using gère le nettoyage) |
Chaîne de langue "eng+fra" |
ocr.Language = OcrLanguage.English ; ocr.AddSecondaryLanguage(OcrLanguage.French) |
| Nettoyage manuel/final | using var input = new OcrInput() |
| valeur de retour de la chaîne d'erreur | Exceptions .NETStandard |
Quand les équipes envisagent de passer d'Asprise à IronOCR
Le bloqueur de préparation à la production
La restriction du nombre de threads constitue un obstacle majeur pour la plupart des charges de travail .NETen production. Une équipe développe une fonctionnalité OCR à l'aide d'Asprise Lite — les tests monothread sont concluants, tout fonctionne. Ensuite, la fonctionnalité est déployée dans un environnement de test derrière une API ASP.NET Core , des requêtes de test simultanées arrivent et l'application génère des erreurs ou fonctionne dans un état techniquement non conforme. La solution consiste soit à passer à la Enterprise (avec les coûts et l'implication commerciale que cela implique), soit à remplacer la bibliothèque. Les équipes qui atteignent ce stade lors de la phase de préproduction plutôt qu'en production sont chanceuses ; Ceux qui le découvrent après son lancement sont confrontés à une migration plus urgente. IronOCR élimine toute cette classe de problème — la licence $999 Lite prend en charge le traitement des requêtes concurrentes, le traitement parallèle par lots, les services Windows et les fonctions cloud sans restriction.
La taxe sur la complexité du déploiement
Les équipes qui travaillent dans des environnements de déploiement modernes (conteneurs Docker, machines virtuelles Linux, pods Kubernetes) paient avec Asprise des frais de maintenance continus qui n'existent pas avec les packages NuGet purs. Chaque image de conteneur doit inclure le binaire natif approprié pour l'architecture cible. Chaque pipeline CI/CD ciblant plusieurs plateformes doit gérer l'inclusion de fichiers spécifiques à chaque plateforme. L'absence d'une bibliothèque native sur un conteneur Linuxde production est une découverte lors de l'exécution, et non une erreur de compilation. Les équipes qui ont passé des heures à déboguer une DLL 32 bits chargée dans un processus 64 bits comprennent concrètement le coût. Le déploiement d'IronOCR basé exclusivement sur NuGet élimine toute cette catégorie d'échec de déploiement.
Le problème de la documentation Java
Les équipes qui développent des applications .NETont besoin d'exemples en C#, et non en Java. La documentation principale d'Asprise, ses références API et ses ressources communautaires sont destinées aux développeurs Java. Un développeur .NETqui consulte la documentation Asprise traduit la syntaxe Java, les conventions des packages Javaet les modèles spécifiques à Javaen équivalents C# — et parfois la traduction n'est pas directe car le wrapper .NETn'expose pas toutes les fonctionnalités côté Java. La documentation, les tutoriels et les exemples de code d'IronOCR sont rédigés pour les développeurs C#. Le tutoriel sur la lecture de texte à partir d'images et le centre de tutoriels complet fournissent des exemples C# fonctionnels pour chaque fonctionnalité, sans surcharge de traduction.
Le fossé du pipeline PDF
Les équipes qui traitent des documents numérisés, des factures, des contrats ou des formulaires au format PDF ne peuvent pas utiliser Asprise sans ajouter une bibliothèque de rendu PDF à leur graphe de dépendances. Cette bibliothèque de rendu introduit ses propres considérations de licence, une charge de maintenance supplémentaire et des incompatibilités potentielles. Pour les équipes qui ont besoin de l'OCR et du PDF dans une seule et même solution, IronOCR gère les deux nativement. La possibilité de créer des PDF consultables à partir de données numérisées — une exigence courante pour les flux de travail d'archivage et de conformité — n'a pas d'équivalent dans Asprise, quel que soit le niveau de licence.
Le déficit de couverture linguistique
Asprise prend en charge plus de 20 langues OCR. IronOCR prend en charge plus de 125 technologies, chacune installable en tant que package NuGet indépendant. Les équipes traitant des documents en arabe, en hindi, en thaï ou dans l'une des dizaines d'autres langues prises en charge par IronOCR mais non par Asprise ne peuvent pas bénéficier du support multilingue via Asprise. Le guide multilingue explique comment installer et combiner les modules linguistiques, y compris la reconnaissance simultanée de plusieurs systèmes d'écriture.
Considérations courantes en matière de migration
Remplacement du code de cycle de vie du moteur
Le plus grand changement mécanique de la migration consiste à supprimer le modèle de cycle de vie du moteur Asprise et à le remplacer par une instanciation directe IronTesseract. Chaque occurrence de la séquence SetUp() / StartEngine() / Recognize() / StopEngine() devient un seul appel Read() :
// Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine();
}
// After: IronOCR (1 line)
return new IronTesseract().Read(imagePath).Text;
// Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp();
Ocr ocr = new Ocr();
try
{
ocr.StartEngine("eng", Ocr.SPEED_FAST);
string text = ocr.Recognize(
imagePath,
Ocr.RECOGNIZE_TYPE_TEXT,
Ocr.OUTPUT_FORMAT_PLAINTEXT);
return text;
}
finally
{
ocr.StopEngine();
}
// After: IronOCR (1 line)
return new IronTesseract().Read(imagePath).Text;
' Before: Asprise lifecycle (15 lines, manual cleanup)
Ocr.SetUp()
Dim ocr As New Ocr()
Try
ocr.StartEngine("eng", Ocr.SPEED_FAST)
Dim text As String = ocr.Recognize( _
imagePath, _
Ocr.RECOGNIZE_TYPE_TEXT, _
Ocr.OUTPUT_FORMAT_PLAINTEXT)
Return text
Finally
ocr.StopEngine()
End Try
' After: IronOCR (1 line)
Return New IronTesseract().Read(imagePath).Text
Pour un code sensible aux performances qui traite de nombreux documents de manière séquentielle, réutilisez l'instance IronTesseract plutôt que d'en créer une nouvelle par appel — l'initialisation du moteur entraîne des frais généraux, et une seule instance utilisée séquentiellement est plus efficace que d'en créer et en supprimer une par document.
Remplacement des codes de langage basés sur des chaînes de caractères
Asprise utilise des paramètres de chaîne pour la sélection des langues ("eng", "fra", "eng+fra"). IronOCR utilise un OcrLanguage enum fortement typé avec une API de langue secondaire. Le guide multilingue répertorie les identifiants de langue disponibles et les packages NuGet requis pour chacun :
// Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST);
// After: IronOCR strongly-typed language enum
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.French);
var result = ocr.Read(imagePath);
// Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST);
// After: IronOCR strongly-typed language enum
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.French);
var result = ocr.Read(imagePath);
Imports IronOcr
' Before: Asprise string-based language
ocr.StartEngine("eng+fra", Ocr.SPEED_FAST)
' After: IronOCR strongly-typed language enum
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
ocr.AddSecondaryLanguage(OcrLanguage.French)
Dim result = ocr.Read(imagePath)
Remplacement des vérifications de chaînes d'erreur
Asprise renvoie null ou une chaîne de caractères préfixée par une erreur en cas d'échec de la reconnaissance. IronOCR génère des exceptions .NET. Remplacez les vérifications de null et de préfixe de chaîne par des blocs try/catch standards. Cela aligne la gestion des erreurs OCR avec le reste du modèle de gestion des exceptions .NETet donne accès aux traces de pile complètes et aux hiérarchies de types d'exceptions plutôt qu'aux chaînes d'erreur analysées.
Activation du traitement parallèle
Après la migration, les boucles de traitement par lots foreach existantes peuvent être converties en Parallel.ForEach ou PLINQ sans aucun souci de licence. Pour les lots de documents qui étaient auparavant traités séquentiellement sur Lite/STANDARD, le parallélisme est un multiplicateur de débit direct. Le guide sur l'OCR asynchrone couvre les modèles asynchrones pour les contextes d'applications Web où l'OCR non bloquant est préférable à la saturation du pool de threads.
Fonctionnalités supplémentaires d'IronOCR
Au-delà des domaines abordés dans cette comparaison, IronOCR offre des fonctionnalités qui n'ont pas d'équivalent dans Asprise :
- Lecture de code-barres pendant l'OCR : Activez
ocr.Configuration.ReadBarCodes = truepour extraire les codes-barres et QR codes des documents dans le même passage que la reconnaissance de texte — pas besoin de bibliothèque secondaire. - OCR basé sur une région : Utilisez
CropRectanglepour extraire le texte de zones spécifiques d'un document, utile pour les en-têtes de factures, les champs de formulaire et les zones de données structurées. - Scores de confiance : Accédez aux valeurs de confiance de reconnaissance par mot et globales pour signaler les extractions à faible confiance nécessitant une vérification humaine.
- Extraction de données structurées : Navigation des objets de résultat par page, paragraphe, ligne et mot, chacun contenant des coordonnées en pixels — permettant une analyse de document tenant compte de la mise en page au-delà de la simple sortie de texte.
- Exportation hOCR : Exporter les résultats de reconnaissance au format hOCR pour l'intégration avec les outils de traitement de documents en aval.
- Reconnaissance de documents spécialisée : Flux de travail spécialement conçus pour les passeports, les chèques MICR, les plaques d'immatriculation et l'écriture manuscrite qui vont au-delà de la reconnaissance Tesseract générale.
- Suivi de la progression : Abonnez-vous aux événements de progression pendant les opérations par lots de longue durée pour obtenir des commentaires et une surveillance de l'interface utilisateur.
Compatibilité .NETet préparation à l'avenir
IronOCR cible .NETStandard 2.0, qui couvre .NETFramework 4.6.1+, .NETCore 2.0+ et toutes les versions de .NET5 à .NET9 et au-delà. La bibliothèque reçoit des mises à jour régulières alignées sur les cycles de publication de .NETet est testée sur Windows x64, Windows x86, Linuxx64, macOS, Docker, Azure App Service et AWS Lambda. La compatibilité .NETd'Asprise est limitée par son modèle binaire natif : les nouvelles cibles de plateforme (ARM64, WASM) nécessitent de nouvelles versions natives d'Asprise Inc., et le rythme de publication privilégiant Javasignifie que les mises à jour de la plateforme .NETpeuvent prendre du retard. Pour les équipes qui ciblent aujourd'hui .NET8 et .NET9 et qui prévoient de passer à .NET10 en 2026, l'architecture NuGet gérée d'IronOCR offre une voie de compatibilité simple sans les problèmes liés aux binaires natifs.
Conclusion
Asprise OCR est une bibliothèque OCR Javaavec un wrapper .NET. L'héritage Javan'est pas fortuit : il définit le modèle de déploiement (DLL natives spécifiques à la plateforme), le style d'API (méthodes de cycle de vie de style C avec des constantes entières), le langage de documentation (exemples Javanécessitant une traduction) et les restrictions de threading (Lite/STANDARD monothread selon le contrat de licence). Pour les équipes Javaqui travaillent également sur un projet .NET, le positionnement multilingue d'Asprise a du sens. Pour les équipes .NETqui développent des systèmes de production, ces mêmes caractéristiques introduisent des frictions à chaque étape.
La restriction relative au filetage mérite une attention particulière. Les deux niveaux Asprise les plus abordables — qui couvrent la majorité des équipes évaluant le produit — interdisent l'exécution multithread et multiprocessus. Chaque API Web ASP.NET Core, chaque service Windows avec une file d'attente de tâches, chaque fonction Azure gérant des déclencheurs concurrents : ce sont des schémas de production standard .NET, et tous nécessitent une licence ENTERPRISE d'Asprise. La licence $999 Lite de IronOCR les couvre tous sans restriction.
La complexité du déploiement est la deuxième préoccupation pratique. Les équipes exécutant des conteneurs Docker, des builds Linuxou des pipelines CI/CD multiplateformes doivent gérer les binaires natifs spécifiques à la plateforme avec Asprise. Ces échecs — DllNotFoundException, BadImageFormatException — apparaissent à l'exécution sur l'infrastructure cible, pas au moment de la construction. IronOCR déploie par le biais de la gestion standard des packages NuGet, et le mécanisme de sélection des packages gère en interne les binaires spécifiques à la plateforme. La surface de déploiement est une simple référence NuGet .
Pour les équipes .NETdébutant une nouvelle intégration OCR, le point de départ est clair : un seul dotnet add package IronOcr, une affectation de clé de licence en une ligne, et new IronTesseract().Read("document.jpg").Text pour le premier résultat. Aucune initialisation du moteur, aucune source binaire native, aucun audit de licence de multithreading.
Questions Fréquemment Posées
Qu'est-ce que Asprise OCR SDK ?
Asprise OCR SDK est une solution 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 à Asprise 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 d'Asprise, 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 qu'Asprise 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 Asprise 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 d'Asprise 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 à Asprise 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 à Asprise 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 d'Asprise OCR SDK à IronOCR ?
La migration du SDK OCR d'Asprise 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.

