Migration d'Aspose.OCR vers IronOCR
Ce guide accompagne les développeurs .NET tout au long d'une migration complète d'Aspose.OCR vers IronOCR . Il couvre l'échange de packages, les changements d'espace de noms, l'initialisation de la licence et quatre exemples concrets de migration de code tirés de modèles d'utilisation réels d'Aspose.OCR : la configuration des paramètres de reconnaissance, les modes de détection de zone, la reconnaissance par lots avec filtrage basé sur la confiance et la gestion des sorties structurées. Chaque exemple illustre l'approche Aspose.OCR ainsi que son équivalent IronOCR , vous permettant ainsi de traduire votre code existant sans tâtonnement.
Pourquoi migrer depuis Aspose.OCR ?
Les raisons pour lesquelles les équipes quittent Aspose.OCR se concentrent autour de deux points faibles : le modèle de facturation par abonnement et la charge de configuration imposée par le pipeline de reconnaissance manuelle.
Les coûts d'abonnement augmentent sans limite. Aspose.OCR ne propose pas de licence perpétuelle. La licence Développeur Petite Entreprise coûte 999 $ par développeur et par an. Une équipe de cinq personnes qui renouvelle son contrat pour trois ans paie 14 985 $ avant même d'écrire une seule ligne de logique métier. L'abonnement Professional d'IronOCR coûte 2 999 $ une seule fois — la même couverture, pour toujours, sans obligation de renouvellement. Le calcul devient incontournable lorsque le service financier se demande pourquoi une dépendance à un logiciel de reconnaissance optique de caractères (OCR) se renouvelle annuellement comme un abonnement SaaS.
Chaque appel de reconnaissance nécessite une cérémonie d'objets de paramètres. Aspose.OCR sépare sa surface de configuration entre RecognitionSettings, DocumentRecognitionSettings, DetectAreasMode, et la collection PreprocessingFilter. Avant de pouvoir appeler RecognizeImage, vous construisez un objet de paramètres, le remplissez et le passez explicitement. IronOCR intègre cela dans .Read(). La différence est faible par appel ; Elle s'accumule dans l'ensemble du code source.
La sélection du mode de détection de zone est manuelle et conséquente. Aspose.OCR expose les valeurs DetectAreasMode (COMBINE, DOCUMENT, TABLE, NONE) que le développeur doit choisir pour chaque type de document. Un mode incorrect sur un formulaire structuré diminue la précision de la reconnaissance. IronOCR analyse automatiquement la mise en page du document et expose le résultat structuré (paragraphes, lignes, mots) sans nécessiter de déclaration préalable du mode.
Le traitement par lots nécessite une gestion manuelle des listes de résultats. Enregistrer un lot de pages reconnues en PDF consultable ou fichier de données structuré dans Aspose.OCR signifie accumuler des objets RecognitionResult dans un List<RecognitionResult>, puis passer cette liste à SaveMultipageDocument. L'enchaînement des listes est de votre responsabilité. IronOCR accepte plusieurs entrées via un seul objet OcrInput et produit un OcrResult couvrant toutes les pages.
Le changement de format de sortie touche plusieurs surfaces de l'API. Exporter au format JSON, XML ou texte brut dans Aspose.OCR nécessite une valeur d'énumération SaveFormat distincte passée à SaveMultipageDocument. Filtrer ces résultats par confiance avant de les enregistrer nécessite de parcourir la liste et d'inspecter chaque tableau RecognitionAreasConfidence. IronOCR expose result.Text, result.Confidence, et result.Pages sur un seul objet de résultat — le filtrage par confiance est une expression LINQ d'une ligne.
Le modèle de licence IronOCR élimine totalement le risque de renouvellement. Une licence achetée vous appartient définitivement. Les mises à jour sont incluses pendant un an ; Après cela, la dernière version reçue continue de fonctionner en production sans risque de non-conformité. Il n'existe aucun scénario où un paiement manqué interrompt votre déploiement.
Le problème fondamental
Aspose.OCR associe la configuration de reconnaissance à un objet de paramètres qui doit être construit, rempli et transmis à chaque appel. Le mode, la langue, les filtres et la stratégie de zone sont toutes des propriétés de cet objet :
// Aspose.OCR: build a settings object for every recognition call
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT, // must choose the right mode
RecognizeSingleLine = false,
AutoSkew = true
};
var result = api.RecognizeImage("form.jpg", settings);
string text = result.RecognitionText;
// Aspose.OCR: build a settings object for every recognition call
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT, // must choose the right mode
RecognizeSingleLine = false,
AutoSkew = true
};
var result = api.RecognizeImage("form.jpg", settings);
string text = result.RecognitionText;
Imports Aspose.OCR
' Aspose.OCR: build a settings object for every recognition call
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT, ' must choose the right mode
.RecognizeSingleLine = False,
.AutoSkew = True
}
Dim result = api.RecognizeImage("form.jpg", settings)
Dim text As String = result.RecognitionText
IronOCR utilise un seul appel .Read(). La configuration réside sur l'instance IronTesseract lorsque nécessaire, et non sur un objet par appel :
// IronOCR: one call, no settings object required
var text = new IronTesseract().Read("form.jpg").Text;
// IronOCR: one call, no settings object required
var text = new IronTesseract().Read("form.jpg").Text;
Imports IronOcr
Dim text As String = New IronTesseract().Read("form.jpg").Text
IronOCR vs Aspose.OCR : Comparaison des fonctionnalités
Le tableau ci-dessous compare les deux bibliothèques selon les dimensions les plus importantes lors d'une décision de migration.
| Fonction | Aspose.OCR | IronOCR |
|---|---|---|
| Modèle de licence | Abonnement annuel (pas d'option perpétuelle) | Achat unique perpétuel |
| 1-coût du développeur | 999 $/an | $999 une fois |
| 10-coût du développeur | 4 995 $/an (Licence de site) | 2 999 $ une fois (Professional) |
| Conséquences de l'expiration du permis | Impossible de déployer de nouvelles versions, aucun correctif de sécurité disponible. | Aucun — la version achetée fonctionne indéfiniment |
| Cours de base en reconnaissance optique de caractères (OCR) | AsposeOcr |
IronTesseract |
| Objet de paramètres requis | Oui (RecognitionSettings ou DocumentRecognitionSettings) |
Non — optionnel OcrInput pour des scénarios avancés |
| Détection de zone | Sélection manuelle de l'énumération DetectAreasMode |
Analyse automatique de la mise en page |
| Prétraitement | Collection manuelle PreprocessingFilter |
Automatique avec possibilité de modification explicite |
| Entrée PDF | PDF standard via RecognizePdf() |
Natif via .Read() ou OcrInput.LoadPdf() |
| PDF protégé par mot de passe | Nécessite Aspose.PDF (licence séparée) | Paramètre Password: intégré |
| Sortie PDF consultable | SaveMultipageDocument(path, SaveFormat.Pdf, list) |
result.SaveAsSearchablePdf(path) |
| Valeur de confiance | result.RecognitionAreasConfidence.Average() (tableau) |
result.Confidence (double unique, 0–100) |
| Données structurées au niveau des mots | Géométrie au niveau de la zone via RecognitionAreasRectangles |
result.Words avec X, Y, Largeur, Hauteur, Confiance |
| Données structurées au niveau de la page | Non exposé | result.Pages avec paragraphes, lignes, mots, caractères |
| Multilingue simultané | Une seule langue par appel | OcrLanguage.French + OcrLanguage.German |
| Langues incluses | Plus de 130 dans le paquet principal | Plus de 125 modules linguistiques disponibles via NuGet |
| Lecture de codes-barres | Non disponible | Intégré (ocr.Configuration.ReadBarCodes = true) |
| Sécurité des threads | Nouvelle instance par fil recommandée | instance unique partagée et entièrement sécurisée pour les threads |
| TIFF multi-images | Pas nativement | input.LoadImageFrames("file.tiff") |
| Exportation hOCR | Limité | result.SaveAsHocrFile(path) |
| NuGet multiplateforme | Oui | Oui (Windows, Linux, macOS, Docker, Azure, AWS) |
| Nombre de packages NuGet | 1 langue principale + packs linguistiques optionnels | 1 langue principale + packs linguistiques optionnels |
Démarrage rapide : Migration d'Aspose.OCR vers IronOCR
Étape 1 : Remplacer le package NuGet
Supprimer Aspose.OCR :
dotnet remove package Aspose.OCR
dotnet remove package Aspose.OCR
Installez IronOCR depuis NuGet :
dotnet add package IronOcr
Étape 2 : Mise à jour des espaces de noms
Remplacez toutes les importations de namespace Aspose.OCR :
// Before (Aspose.OCR)
using Aspose.OCR;
using Aspose.OCR.Models;
using Aspose.OCR.Models.PreprocessingFilters;
// After (IronOCR)
using IronOcr;
// Before (Aspose.OCR)
using Aspose.OCR;
using Aspose.OCR.Models;
using Aspose.OCR.Models.PreprocessingFilters;
// After (IronOCR)
using IronOcr;
Imports IronOcr
Étape 3 : initialisation de la licence
Supprimez l'appel de licence Aspose basé sur un fichier et remplacez-le par la clé de chaîne IronOCR . Placez ceci au démarrage de l'application — une fois par processus, et non une fois par requête :
// Remove Aspose license setup
// var license = new Aspose.OCR.License();
// license.SetLicense("Aspose.OCR.lic");
// Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Remove Aspose license setup
// var license = new Aspose.OCR.License();
// license.SetLicense("Aspose.OCR.lic");
// Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
// Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' Remove Aspose license setup
' Dim license As New Aspose.OCR.License()
' license.SetLicense("Aspose.OCR.lic")
' Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
' Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
Exemples de migration de code
Configuration des paramètres de reconnaissance
Aspose.OCR centralise tout le comportement de reconnaissance dans un objet RecognitionSettings. La langue, le mode de détection de zone, l'indicateur à ligne unique et le seuil sont tous disponibles en tant que propriétés. Vous le construisez de manière inédite pour chaque type de document ou modèle d'appel.
Approche Aspose.OCR :
// Configuring recognition settings for a structured form
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT,
RecognizeSingleLine = false,
AutoSkew = true,
RecognitionAreas = new List<Rectangle>
{
new Rectangle(0, 0, 800, 100) // header zone
}
};
var result = api.RecognizeImage("structured-form.jpg", settings);
Console.WriteLine(result.RecognitionText);
// Configuring recognition settings for a structured form
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT,
RecognizeSingleLine = false,
AutoSkew = true,
RecognitionAreas = new List<Rectangle>
{
new Rectangle(0, 0, 800, 100) // header zone
}
};
var result = api.RecognizeImage("structured-form.jpg", settings);
Console.WriteLine(result.RecognitionText);
Imports System
Imports System.Collections.Generic
Imports AsposeOcr
' Configuring recognition settings for a structured form
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT,
.RecognizeSingleLine = False,
.AutoSkew = True,
.RecognitionAreas = New List(Of Rectangle) From {
New Rectangle(0, 0, 800, 100) ' header zone
}
}
Dim result = api.RecognizeImage("structured-form.jpg", settings)
Console.WriteLine(result.RecognitionText)
Approche IronOCR :
// Recognition behavior configured once on the IronTesseract instance
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
// Region targeting replaces RecognitionAreas in RecognitionSettings
var headerRegion = new CropRectangle(0, 0, 800, 100);
using var input = new OcrInput();
input.LoadImage("structured-form.jpg", headerRegion);
var result = ocr.Read(input);
Console.WriteLine(result.Text);
// Recognition behavior configured once on the IronTesseract instance
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
// Region targeting replaces RecognitionAreas in RecognitionSettings
var headerRegion = new CropRectangle(0, 0, 800, 100);
using var input = new OcrInput();
input.LoadImage("structured-form.jpg", headerRegion);
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
' Recognition behavior configured once on the IronTesseract instance
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
' Region targeting replaces RecognitionAreas in RecognitionSettings
Dim headerRegion As New CropRectangle(0, 0, 800, 100)
Using input As New OcrInput()
input.LoadImage("structured-form.jpg", headerRegion)
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Il n'existe pas d'objet de configuration à créer pour chaque appel. La langue est sur l'instance IronTesseract ; le ciblage de la région est sur OcrInput au moment du chargement. Les décisions DetectAreasMode et RecognizeSingleLine sont gérées automatiquement par le moteur. Pour des instructions détaillées sur la reconnaissance optique de caractères (OCR) basée sur les régions, consultez le guide pratique sur l'OCR basée sur les régions .
Migration du mode de détection de zone
Aspose.OCR vous oblige à choisir une valeur DetectAreasMode avant chaque appel de reconnaissance. COMBINE fusionne le texte de différentes régions de mise en page, DOCUMENT traite l'image comme un document standard, TABLE optimise pour les mises en page en grille. Choisir le mauvais mode pour le type de document entraîne un affichage incorrect ou manquant.
Approche Aspose.OCR :
// Three separate calls with different modes for different document types
var api = new AsposeOcr();
// For a document with mixed prose and table content
var docSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.COMBINE,
Language = Language.Eng
};
// For a pure tabular document
var tableSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.TABLE,
Language = Language.Eng
};
// For a single-column text document
var linearSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.DOCUMENT,
Language = Language.Eng
};
string mixedResult = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText;
string tableResult = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText;
string linearResult = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText;
// Three separate calls with different modes for different document types
var api = new AsposeOcr();
// For a document with mixed prose and table content
var docSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.COMBINE,
Language = Language.Eng
};
// For a pure tabular document
var tableSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.TABLE,
Language = Language.Eng
};
// For a single-column text document
var linearSettings = new RecognitionSettings
{
DetectAreasMode = DetectAreasMode.DOCUMENT,
Language = Language.Eng
};
string mixedResult = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText;
string tableResult = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText;
string linearResult = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText;
Imports AsposeOcr
' Three separate calls with different modes for different document types
Dim api As New AsposeOcr()
' For a document with mixed prose and table content
Dim docSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.COMBINE,
.Language = Language.Eng
}
' For a pure tabular document
Dim tableSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.TABLE,
.Language = Language.Eng
}
' For a single-column text document
Dim linearSettings As New RecognitionSettings With {
.DetectAreasMode = DetectAreasMode.DOCUMENT,
.Language = Language.Eng
}
Dim mixedResult As String = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText
Dim tableResult As String = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText
Dim linearResult As String = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText
Approche IronOCR :
// Single API surface handles all layout types automatically
var ocr = new IronTesseract();
// Same code path for every document type
var mixedResult = ocr.Read("mixed-layout.jpg").Text;
var tableResult = ocr.Read("data-table.jpg").Text;
var linearResult = ocr.Read("text-document.jpg").Text;
// For table documents, structured data is immediately available
var result = ocr.Read("data-table.jpg");
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
// Single API surface handles all layout types automatically
var ocr = new IronTesseract();
// Same code path for every document type
var mixedResult = ocr.Read("mixed-layout.jpg").Text;
var tableResult = ocr.Read("data-table.jpg").Text;
var linearResult = ocr.Read("text-document.jpg").Text;
// For table documents, structured data is immediately available
var result = ocr.Read("data-table.jpg");
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
Imports System
' Single API surface handles all layout types automatically
Dim ocr As New IronTesseract()
' Same code path for every document type
Dim mixedResult As String = ocr.Read("mixed-layout.jpg").Text
Dim tableResult As String = ocr.Read("data-table.jpg").Text
Dim linearResult As String = ocr.Read("text-document.jpg").Text
' For table documents, structured data is immediately available
Dim result = ocr.Read("data-table.jpg")
For Each page In result.Pages
For Each paragraph In page.Paragraphs
Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}")
Next
Next
IronOCR élimine complètement la nécessité de choisir le mode de reconnaissance faciale. Le moteur analyse la mise en page et expose le résultat à travers la hiérarchie Pages, Paragraphs, Lines, et Words. Le guide sur les résultats de lecture explique comment naviguer dans le modèle de résultats structurés complet pour l'analyse de la mise en page des documents. Pour connaître les modèles d'extraction spécifiques à chaque tableau, consultez le guide de lecture des tableaux .
Reconnaissance par lots avec filtrage basé sur la confiance
Les flux de travail par lots d'Aspose.OCR accumulent les objets RecognitionResult dans une liste. Filtrer par confiance nécessite de parcourir cette liste et de calculer la moyenne par région avant d'accepter un résultat. La liste doit être maintenue explicitement et passée à SaveMultipageDocument si vous souhaitez sortir plusieurs pages en un seul fichier.
Approche Aspose.OCR :
// Batch recognition with confidence filtering before output
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT
};
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<RecognitionResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = api.RecognizeImage(path, settings);
// Confidence is an array of per-region values — must average manually
float avgConfidence = result.RecognitionAreasConfidence != null
? result.RecognitionAreasConfidence.Average()
: 0f;
if (avgConfidence >= 0.70f)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)");
}
}
// Save accepted pages as a single searchable PDF
if (acceptedResults.Any())
{
api.SaveMultipageDocument("high-confidence-invoices.pdf",
SaveFormat.Pdf, acceptedResults);
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
// Batch recognition with confidence filtering before output
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.DOCUMENT
};
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<RecognitionResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = api.RecognizeImage(path, settings);
// Confidence is an array of per-region values — must average manually
float avgConfidence = result.RecognitionAreasConfidence != null
? result.RecognitionAreasConfidence.Average()
: 0f;
if (avgConfidence >= 0.70f)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)");
}
}
// Save accepted pages as a single searchable PDF
if (acceptedResults.Any())
{
api.SaveMultipageDocument("high-confidence-invoices.pdf",
SaveFormat.Pdf, acceptedResults);
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
Imports System
Imports System.IO
Imports System.Linq
Imports Aspose.OCR
' Batch recognition with confidence filtering before output
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.DOCUMENT
}
Dim documentPaths As String() = Directory.GetFiles("invoice-archive", "*.jpg")
Dim acceptedResults As New List(Of RecognitionResult)()
Dim rejectedPaths As New List(Of String)()
For Each path In documentPaths
Dim result = api.RecognizeImage(path, settings)
' Confidence is an array of per-region values — must average manually
Dim avgConfidence As Single = If(result.RecognitionAreasConfidence IsNot Nothing,
result.RecognitionAreasConfidence.Average(),
0.0F)
If avgConfidence >= 0.70F Then
acceptedResults.Add(result)
Else
rejectedPaths.Add(path)
Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)")
End If
Next
' Save accepted pages as a single searchable PDF
If acceptedResults.Any() Then
api.SaveMultipageDocument("high-confidence-invoices.pdf",
SaveFormat.Pdf, acceptedResults)
End If
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}")
Approche IronOCR :
// Batch recognition with confidence filtering using unified result model
var ocr = new IronTesseract();
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<OcrResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = ocr.Read(path);
// Single confidence value — no averaging required
if (result.Confidence >= 70.0)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)");
}
}
// Save accepted pages — each result becomes a page in the output PDF
if (acceptedResults.Any())
{
using var outputInput = new OcrInput();
foreach (var path in documentPaths
.Where(p => !rejectedPaths.Contains(p)))
{
outputInput.LoadImage(path);
}
var combined = ocr.Read(outputInput);
combined.SaveAsSearchablePdf("high-confidence-invoices.pdf");
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
// Batch recognition with confidence filtering using unified result model
var ocr = new IronTesseract();
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<OcrResult>();
var rejectedPaths = new List<string>();
foreach (var path in documentPaths)
{
var result = ocr.Read(path);
// Single confidence value — no averaging required
if (result.Confidence >= 70.0)
{
acceptedResults.Add(result);
}
else
{
rejectedPaths.Add(path);
Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)");
}
}
// Save accepted pages — each result becomes a page in the output PDF
if (acceptedResults.Any())
{
using var outputInput = new OcrInput();
foreach (var path in documentPaths
.Where(p => !rejectedPaths.Contains(p)))
{
outputInput.LoadImage(path);
}
var combined = ocr.Read(outputInput);
combined.SaveAsSearchablePdf("high-confidence-invoices.pdf");
}
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
Imports IronTesseract
Imports System.IO
Imports System.Linq
' Batch recognition with confidence filtering using unified result model
Dim ocr As New IronTesseract()
Dim documentPaths As String() = Directory.GetFiles("invoice-archive", "*.jpg")
Dim acceptedResults As New List(Of OcrResult)()
Dim rejectedPaths As New List(Of String)()
For Each path In documentPaths
Dim result = ocr.Read(path)
' Single confidence value — no averaging required
If result.Confidence >= 70.0 Then
acceptedResults.Add(result)
Else
rejectedPaths.Add(path)
Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)")
End If
Next
' Save accepted pages — each result becomes a page in the output PDF
If acceptedResults.Any() Then
Using outputInput As New OcrInput()
For Each path In documentPaths.Where(Function(p) Not rejectedPaths.Contains(p))
outputInput.LoadImage(path)
Next
Dim combined = ocr.Read(outputInput)
combined.SaveAsSearchablePdf("high-confidence-invoices.pdf")
End Using
End If
Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}")
result.Confidence est un seul double allant de 0 à 100. La moyenne du tableau Aspose RecognitionAreasConfidence renvoie un float dans une plage qui varie selon la version — le seuil de comparaison a besoin d'être ajusté lors de la migration. Les scores de confiance indiquent les valeurs de confiance par mot, par ligne et par page pour les flux de travail de validation des documents. Pour les modèles de traitement par lots à volume élevé, voir l' exemple de multithreading .
Gestion structurée des sorties
Aspose.OCR sort des données structurées via SaveMultipageDocument avec des valeurs d'énum SaveFormat spécifiques au format. La sortie JSON écrit un fichier lisible par machine ; la sortie XML écrit un fichier de document annoté. Accéder aux données structurées brutes — positions des mots, limites de lignes — nécessite de parcourir RecognitionAreasRectangles, qui retourne la géométrie au niveau de la région, pas au niveau du mot.
Approche Aspose.OCR :
// Structured output: JSON and XML via SaveMultipageDocument
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.COMBINE
};
var results = new List<RecognitionResult>();
foreach (var path in new[] { "page1.jpg", "page2.jpg", "page3.jpg" })
{
results.Add(api.RecognizeImage(path, settings));
}
// Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results);
// Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results);
// Accessing area-level geometry (not word-level)
foreach (var result in results)
{
var areas = result.RecognitionAreasRectangles;
if (areas != null)
{
foreach (var area in areas)
{
Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}");
}
}
// No direct word-level collection with individual confidence values
}
// Structured output: JSON and XML via SaveMultipageDocument
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
Language = Language.Eng,
DetectAreasMode = DetectAreasMode.COMBINE
};
var results = new List<RecognitionResult>();
foreach (var path in new[] { "page1.jpg", "page2.jpg", "page3.jpg" })
{
results.Add(api.RecognizeImage(path, settings));
}
// Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results);
// Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results);
// Accessing area-level geometry (not word-level)
foreach (var result in results)
{
var areas = result.RecognitionAreasRectangles;
if (areas != null)
{
foreach (var area in areas)
{
Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}");
}
}
// No direct word-level collection with individual confidence values
}
Imports System
Imports System.Collections.Generic
Imports AsposeOcr
' Structured output: JSON and XML via SaveMultipageDocument
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
.Language = Language.Eng,
.DetectAreasMode = DetectAreasMode.COMBINE
}
Dim results As New List(Of RecognitionResult)()
For Each path In New String() {"page1.jpg", "page2.jpg", "page3.jpg"}
results.Add(api.RecognizeImage(path, settings))
Next
' Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results)
' Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results)
' Accessing area-level geometry (not word-level)
For Each result In results
Dim areas = result.RecognitionAreasRectangles
If areas IsNot Nothing Then
For Each area In areas
Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}")
Next
End If
' No direct word-level collection with individual confidence values
Next
Approche IronOCR :
// Structured output: navigate a rich result object model
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("page1.jpg");
input.LoadImage("page2.jpg");
input.LoadImage("page3.jpg");
var result = ocr.Read(input);
// Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf");
// Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr");
// Word-level structured access — direct collection, no indirection
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " +
$"{page.Confidence:F1}% confidence");
foreach (var word in page.Words)
{
Console.WriteLine($" '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} — {word.Confidence:F1}%");
}
}
// Paragraph-level layout for document structure analysis
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
// Structured output: navigate a rich result object model
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("page1.jpg");
input.LoadImage("page2.jpg");
input.LoadImage("page3.jpg");
var result = ocr.Read(input);
// Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf");
// Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr");
// Word-level structured access — direct collection, no indirection
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " +
$"{page.Confidence:F1}% confidence");
foreach (var word in page.Words)
{
Console.WriteLine($" '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} — {word.Confidence:F1}%");
}
}
// Paragraph-level layout for document structure analysis
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
Imports IronTesseract
' Structured output: navigate a rich result object model
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("page1.jpg")
input.LoadImage("page2.jpg")
input.LoadImage("page3.jpg")
Dim result = ocr.Read(input)
' Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf")
' Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr")
' Word-level structured access — direct collection, no indirection
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " &
$"{page.Confidence:F1}% confidence")
For Each word In page.Words
Console.WriteLine($" '{word.Text}' at ({word.X},{word.Y}) " &
$"size {word.Width}x{word.Height} — {word.Confidence:F1}%")
Next
Next
' Paragraph-level layout for document structure analysis
For Each paragraph In result.Pages(0).Paragraphs
Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}")
Next
End Using
IronOCR expose les données au niveau des mots comme une collection Words directe sur chaque page, avec des valeurs Confidence individuelles par mot. Le RecognitionAreasRectangles d'Aspose.OCR fournit la géométrie des régions sans ventilation de confiance au niveau des mots. L'exportation hOCR produit du XHTML compatible avec les outils qui consomment une sortie annotée avec des boîtes englobantes — consultez le guide d'exportation hOCR pour plus de détails sur le format. Pour le modèle de résultat structuré complet, la référence API OcrResult documente chaque propriété sur OcrResult.Page, OcrResult.Paragraph, OcrResult.Line, et OcrResult.Word.
Référence de mappage de l'API Aspose.OCR vers IronOCR
| Aspose.OCR | Équivalent d'IronOCR |
|---|---|
AsposeOcr |
IronTesseract |
RecognitionSettings |
Propriétés sur IronTesseract + OcrInput |
DocumentRecognitionSettings |
OcrInput avec LoadPdf() / LoadPdfPages() |
api.RecognizeImage(path, settings) |
ocr.Read(path) ou ocr.Read(input) |
api.RecognizePdf(path, settings) |
ocr.Read(path) ou ocr.Read(input) |
result.RecognitionText |
result.Text |
result.RecognitionAreasConfidence.Average() |
result.Confidence (double unique, 0–100) |
result.RecognitionAreasRectangles |
result.Words (avec X, Y, Largeur, Hauteur, Confiance) |
RecognitionResult |
OcrResult |
Language.Eng |
OcrLanguage.English |
DetectAreasMode.COMBINE |
Automatique — aucune énumération requise |
DetectAreasMode.TABLE |
Automatique — utilisez result.Pages[n].Paragraphs pour la mise en page |
DetectAreasMode.DOCUMENT |
Automatique — le moteur gère l'analyse de la configuration |
settings.RecognizeSingleLine = true |
ocr.Configuration.WhiteListCharacters ou recadrage à une seule région |
settings.RecognitionAreas = new List<Rectangle> { r } |
input.LoadImage(path, cropRectangle) |
settings.AutoSkew = true |
Automatique, ou explicite input.Deskew() |
PreprocessingFilter.AutoSkew() |
input.Deskew() |
PreprocessingFilter.AutoDenoising() |
input.DeNoise() |
PreprocessingFilter.ContrastCorrectionFilter() |
input.Contrast() |
PreprocessingFilter.Binarize() |
input.Binarize() |
PreprocessingFilter.Threshold(value) |
input.Binarize() (seuil automatique) |
PreprocessingFilter.Median() |
input.DeNoise() |
PreprocessingFilter.Scale(factor) |
input.Scale(percent) |
PreprocessingFilter.Invert() |
input.Invert() |
PreprocessingFilter.Rotate(angle) |
input.Rotate(angle) |
api.SaveMultipageDocument(path, SaveFormat.Pdf, list) |
result.SaveAsSearchablePdf(path) |
api.SaveMultipageDocument(path, SaveFormat.Docx, list) |
Via export hOCR : result.SaveAsHocrFile(path) |
api.SaveMultipageDocument(path, SaveFormat.Json, list) |
Naviguez result.Pages et sérialisez directement |
api.PreprocessImage(path, filters) |
input.GetPages()[0].SaveAsImage(path) |
api.CalculateSkew(imagePath) |
input.Deskew() (applique automatiquement l'angle détecté) |
new Aspose.OCR.License().SetLicense("file.lic") |
IronOcr.License.LicenseKey = "key" |
settings.ThreadsCount = n |
Entièrement compatible avec les threads par défaut ; utilisez Parallel.ForEach |
Problèmes de migration courants et solutions
Problème 1 : DetectAreasMode n'a pas d'équivalent direct
Aspose.OCR : Le code définit settings.DetectAreasMode = DetectAreasMode.TABLE ou DetectAreasMode.COMBINE en attendant un comportement spécifique de mise en page. La suppression de l'énumération soulève la question de savoir comment IronOCR gère la même mise en page.
Solution : Supprimer complètement l'énumération. IronOCR effectue automatiquement l'analyse de la mise en page. Si vous devez inspecter la structure de mise en page détectée, naviguez result.Pages[n].Paragraphs — chaque paragraphe porte une boîte de délimitation X, Y, Largeur, Hauteur et le texte qu'il contient. Pour une extraction explicite des tableaux, consultez le guide de lecture des tableaux :
// No mode to set — read directly and inspect the structure
var result = new IronTesseract().Read("data-table.jpg");
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
// No mode to set — read directly and inspect the structure
var result = new IronTesseract().Read("data-table.jpg");
foreach (var paragraph in result.Pages[0].Paragraphs)
{
Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
Imports IronTesseract
Dim result = New IronTesseract().Read("data-table.jpg")
For Each paragraph In result.Pages(0).Paragraphs
Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}")
Next
Problème 2 : Inadéquation entre les seuils de confiance et les zones de reconnaissance
Aspose.OCR : Le code existant compare result.RecognitionAreasConfidence.Average() à un seuil tel que 0.75f. Le result.Confidence d'IronOCR est sur une échelle différente.
Solution : result.Confidence est un pourcentage de 0 à 100. Multipliez votre seuil Aspose par 100 pour convertir : 0.75f devient 75.0. Mettez ensuite à jour toute la logique de comparaison :
// Aspose.OCR threshold pattern
// if (result.RecognitionAreasConfidence.Average() >= 0.75f)
// IronOCR equivalent — multiply old threshold by 100
var result = new IronTesseract().Read("document.jpg");
if (result.Confidence >= 75.0)
{
Console.WriteLine($"High confidence result: {result.Text}");
}
// Aspose.OCR threshold pattern
// if (result.RecognitionAreasConfidence.Average() >= 0.75f)
// IronOCR equivalent — multiply old threshold by 100
var result = new IronTesseract().Read("document.jpg");
if (result.Confidence >= 75.0)
{
Console.WriteLine($"High confidence result: {result.Text}");
}
Imports IronOcr
Dim result = New IronTesseract().Read("document.jpg")
If result.Confidence >= 75.0 Then
Console.WriteLine($"High confidence result: {result.Text}")
End If
Problème 3 : La sortie JSON/XML de SaveMultipageDocument ne possède pas de méthode directe
Aspose.OCR : api.SaveMultipageDocument("out.json", SaveFormat.Json, results) écrit un fichier JSON avec des métadonnées de reconnaissance. Les équipes qui utilisent ces données en aval doivent trouver l'équivalent.
Solution : IronOCR n'a pas de méthode équivalente SaveFormat.Json. Le remplacement consiste à naviguer result.Pages et sérialiser avec System.Text.Json. Cela vous donne un contrôle total sur le schéma :
using var input = new OcrInput();
input.LoadImage("document.jpg");
var result = new IronTesseract().Read(input);
// Build your own structured JSON from the result model
var pageData = result.Pages.Select(p => new
{
PageNumber = p.PageNumber,
Confidence = p.Confidence,
Text = p.Text,
Words = p.Words.Select(w => new
{
Text = w.Text,
X = w.X,
Y = w.Y,
Width = w.Width,
Height = w.Height,
Confidence = w.Confidence
}).ToArray()
}).ToArray();
File.WriteAllText("output.json",
System.Text.Json.JsonSerializer.Serialize(pageData,
new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
using var input = new OcrInput();
input.LoadImage("document.jpg");
var result = new IronTesseract().Read(input);
// Build your own structured JSON from the result model
var pageData = result.Pages.Select(p => new
{
PageNumber = p.PageNumber,
Confidence = p.Confidence,
Text = p.Text,
Words = p.Words.Select(w => new
{
Text = w.Text,
X = w.X,
Y = w.Y,
Width = w.Width,
Height = w.Height,
Confidence = w.Confidence
}).ToArray()
}).ToArray();
File.WriteAllText("output.json",
System.Text.Json.JsonSerializer.Serialize(pageData,
new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
Imports IronOcr
Imports System.IO
Imports System.Text.Json
Using input As New OcrInput()
input.LoadImage("document.jpg")
Dim result = New IronTesseract().Read(input)
' Build your own structured JSON from the result model
Dim pageData = result.Pages.Select(Function(p) New With {
.PageNumber = p.PageNumber,
.Confidence = p.Confidence,
.Text = p.Text,
.Words = p.Words.Select(Function(w) New With {
.Text = w.Text,
.X = w.X,
.Y = w.Y,
.Width = w.Width,
.Height = w.Height,
.Confidence = w.Confidence
}).ToArray()
}).ToArray()
File.WriteAllText("output.json",
JsonSerializer.Serialize(pageData,
New JsonSerializerOptions With {.WriteIndented = True}))
End Using
Pour une sortie XHTML avec des coordonnées intégrées que les outils en aval peuvent analyser, result.SaveAsHocrFile("output.hocr") est l'équivalent sémantique le plus proche.
Problème 4 : DocumentRecognitionSettings.StartPage utilise un index à partir de 0
Aspose.OCR : DocumentRecognitionSettings.StartPage = 2 signifie la troisième page (indexé depuis 0). Il s'agit de l'erreur de décalage d'une unité la plus courante lors des migrations d'Aspose vers IronOCR.
Solution : IronOCR utilise l'indexation des pages à partir de 1. Ajoutez 1 à chaque valeur StartPage et recalculez la page de fin en conséquence. Rédigez un test ciblé sur un PDF multipage connu afin de détecter ce problème avant la mise en production :
// Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
// var settings = new DocumentRecognitionSettings { StartPage = 2, PagesNumber = 3 };
// IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
using var input = new OcrInput();
input.LoadPdfPages("document.pdf", 3, 5);
var result = new IronTesseract().Read(input);
// Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
// var settings = new DocumentRecognitionSettings { StartPage = 2, PagesNumber = 3 };
// IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
using var input = new OcrInput();
input.LoadPdfPages("document.pdf", 3, 5);
var result = new IronTesseract().Read(input);
Imports IronOcr
' Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
' Dim settings As New DocumentRecognitionSettings With {.StartPage = 2, .PagesNumber = 3}
' IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
Using input As New OcrInput()
input.LoadPdfPages("document.pdf", 3, 5)
Dim result = New IronTesseract().Read(input)
End Using
Problème 5 : RecognizeSingleLine n'a pas d'indicateur direct
Aspose.OCR : settings.RecognizeSingleLine = true ordonne au moteur de traiter toute l'image comme une seule ligne de texte. Ceci est utilisé pour la reconnaissance d'étiquettes, l'extraction de champs et d'autres entrées à format fixe.
Solution : Utilisez une CropRectangle pour isoler précisément la ligne de texte, ce qui empêche le moteur d'exécuter la détection de mise en page complète sur une image à une seule ligne. Pour les zones lisibles par machine ou les formats d'étiquettes, le guide de lecture des documents spécifiques décrit l'approche appropriée :
// Aspose.OCR: single-line flag
// var settings = new RecognitionSettings { RecognizeSingleLine = true };
// IronOCR: crop to the line region — layout detection skips automatically
var lineRegion = new CropRectangle(10, 45, 600, 30); // x, y, width, height
using var input = new OcrInput();
input.LoadImage("label.jpg", lineRegion);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text.Trim());
// Aspose.OCR: single-line flag
// var settings = new RecognitionSettings { RecognizeSingleLine = true };
// IronOCR: crop to the line region — layout detection skips automatically
var lineRegion = new CropRectangle(10, 45, 600, 30); // x, y, width, height
using var input = new OcrInput();
input.LoadImage("label.jpg", lineRegion);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text.Trim());
Imports IronOcr
Dim lineRegion As New CropRectangle(10, 45, 600, 30) ' x, y, width, height
Using input As New OcrInput()
input.LoadImage("label.jpg", lineRegion)
Dim result = New IronTesseract().Read(input)
Console.WriteLine(result.Text.Trim())
End Using
Problème 6: Instances par thread d'Aspose.OCR non requises
Aspose.OCR : La documentation recommande de créer une nouvelle instance AsposeOcr() par thread pour éviter les problèmes de sécurité des threads dans le traitement en parallèle. Le code existant crée des instances à l'intérieur des lambdas Parallel.ForEach.
Solution : IronTesseract est sécurisé pour les threads. Une seule instance gère les charges de travail parallèles. Supprimez l'instanciation par thread et partagez une seule instance :
// Aspose.OCR: per-thread instance due to thread-safety concerns
// Parallel.ForEach(paths, path => { var api = new AsposeOcr(); ... });
// IronOCR: single shared instance, fully thread-safe
var ocr = new IronTesseract();
Parallel.ForEach(documentPaths, path =>
{
var result = ocr.Read(path);
Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%");
});
// Aspose.OCR: per-thread instance due to thread-safety concerns
// Parallel.ForEach(paths, path => { var api = new AsposeOcr(); ... });
// IronOCR: single shared instance, fully thread-safe
var ocr = new IronTesseract();
Parallel.ForEach(documentPaths, path =>
{
var result = ocr.Read(path);
Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%");
});
Imports System.IO
Imports IronOcr
Imports System.Threading.Tasks
Dim ocr As New IronTesseract()
Parallel.ForEach(documentPaths, Sub(path)
Dim result = ocr.Read(path)
Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%")
End Sub)
Liste de contrôle de migration Aspose.OCR
Tâches préalables à la migration
Auditez toutes les références à Aspose.OCR dans le code source :
grep -rn "using Aspose.OCR" --include="*.cs" .
grep -rn "AsposeOcr\|RecognitionSettings\|DocumentRecognitionSettings" --include="*.cs" .
grep -rn "DetectAreasMode\|SaveFormat\|RecognitionResult" --include="*.cs" .
grep -rn "RecognitionAreasConfidence\|RecognitionText\|RecognizePdf" --include="*.cs" .
grep -rn "PreprocessingFilter\|SaveMultipageDocument" --include="*.cs" .
grep -rn "Aspose.OCR.License\|SetLicense" --include="*.cs" .
grep -rn "using Aspose.OCR" --include="*.cs" .
grep -rn "AsposeOcr\|RecognitionSettings\|DocumentRecognitionSettings" --include="*.cs" .
grep -rn "DetectAreasMode\|SaveFormat\|RecognitionResult" --include="*.cs" .
grep -rn "RecognitionAreasConfidence\|RecognitionText\|RecognizePdf" --include="*.cs" .
grep -rn "PreprocessingFilter\|SaveMultipageDocument" --include="*.cs" .
grep -rn "Aspose.OCR.License\|SetLicense" --include="*.cs" .
Documentez chaque occurrence par catégorie : appels de reconnaissance, objets de paramètres, pipelines de prétraitement, appels de sortie et initialisation de licence. Notez toutes les valeurs DetectAreasMode en cours d'utilisation — celles-ci déterminent quel chemin de migration de mise en page s'applique. Enregistrez toutes les valeurs d'énumération SaveFormat — chaque format non-PDF nécessite l'approche de sérialisation personnalisée de la solution 3 ci-dessus.
Migration de code
- Supprimez le package NuGet
Aspose.OCRde tous les projets de la solution - Installez le package NuGet
IronOcrdans tous les projets - Remplacez
using Aspose.OCR;etusing Aspose.OCR.Models;parusing IronOcr; - Remplacez
new Aspose.OCR.License().SetLicense("file.lic")parIronOcr.License.LicenseKey = "key"au démarrage de l'application - Remplacez
new AsposeOcr()parnew IronTesseract() - Supprimez tous les blocs de construction
RecognitionSettingsetDocumentRecognitionSettings - Supprimez toutes les références d'énumération
DetectAreasMode— aucune équivalence nécessaire - Remplacez
api.RecognizeImage(path, settings)parocr.Read(path) - Remplacez
api.RecognizePdf(path, settings)parocr.Read(path)ouocr.Read(input)en utilisantinput.LoadPdf() - Remplacez
result.RecognitionTextparresult.Text - Remplacez
result.RecognitionAreasConfidence.Average()parresult.Confidenceet multipliez l'ancien seuil par 100 - Remplacez
api.SaveMultipageDocument(path, SaveFormat.Pdf, list)parresult.SaveAsSearchablePdf(path) - Remplacez
api.SaveMultipageDocument(path, SaveFormat.Json, list)par la sérialisation directe deresult.Pages - Convertissez toutes les chaînes
PreprocessingFilteren appels de méthodeOcrInput(voir le tableau de mappage de l'API) - Mettez à jour
DocumentRecognitionSettings.StartPagede l'indexation 0 à l'indexation 1 (ajoutez 1 à chaque valeur) - Supprimez l'instanciation par thread
AsposeOcr— partagez une seule instanceIronTesseract
Test de post-migration
- Effectuez une reconnaissance optique de caractères (OCR) sur un échantillon représentatif de chaque type de document utilisé en production et comparez le nombre de caractères avec le résultat de référence d'Aspose.OCR.
- Vérifier les valeurs de confiance : IronOCR renvoie des valeurs de 0 à 100 ; confirmer que toutes les comparaisons de seuils utilisent la nouvelle échelle
- Tester la sélection de plage de pages sur un PDF de plus de 10 pages en utilisant une numérotation de page à partir de 1 et vérifier que les pages correctes sont renvoyées.
- Tester l'ingestion de PDF protégés par mot de passe sans Aspose.PDF installé — vérifier l'absence d'exception de dépendance
- Confirmez que
result.Textcorrespond à la sortie attendue pour chaqueDetectAreasModequi était utilisé (COMBINAISON, TABLE, DOCUMENT) - Testez le chemin de sortie JSON : sérialisez
result.Pageset validez le schéma contre tout consommateur en aval - Exécutez le processeur de lots parallèle et vérifiez l'absence d'exceptions de threads (instance partagée
IronTesseract) - Vérifiez que le fichier PDF consultable s'ouvre dans une visionneuse PDF et que le texte est sélectionnable aux emplacements appropriés.
- Vérifier que la clé de licence s'initialise sans erreur dans chaque environnement de déploiement (démarrage ASP.NET , fonction Azure, conteneur Docker).
- Vérifiez que les entrées TIFF prétraitées produisent toujours la sortie attendue via
input.LoadImageFrames()
Principaux avantages de la migration vers IronOCR
Coût total de possession prévisible dès le premier jour. La licence Professional à 2 999 $ couvre 10 développeurs répartis sur 10 projets, sans renouvellement annuel. Le service financier clôture une seule fois la ligne OCR. L'impact budgétaire de l'ajout d'ingénieurs, du lancement de nouveaux projets ou de l'extension du cycle de vie du produit est nul : il n'y a pas de calculs de niveaux de licence à effectuer, pas de date de renouvellement à suivre et aucun risque de non-conformité lié à un paiement manqué. La page de licences IronOCR détaille ce que couvre chaque niveau.
Appels de reconnaissance qui expriment une intention, pas une infrastructure. Après la migration, chaque appel de reconnaissance est ocr.Read("document"). La construction RecognitionSettings, la sélection DetectAreasMode, et la population PreprocessingFilter qui précédaient chaque appel d'Aspose.OCR disparaissent entièrement. Les nouveaux ingénieurs qui lisent la couche OCR du code source voient l'intention métier — " lire ce document " — plutôt qu'un objet de configuration assemblé avant le début du travail proprement dit. La documentation de l'API IronTesseract couvre toutes les propriétés de configuration disponibles.
Prise en charge des PDF chiffrés sans produit supplémentaire. Les systèmes de gestion documentaire Enterprise traitent couramment les PDF protégés par mot de passe. Après la migration, input.LoadPdf("doc.pdf", Password: "secret") les gèrent nativement. Il n'y a pas d'abonnement Aspose.PDF à gérer, pas de pipeline de décryptage en image à maintenir et pas de deuxième date de renouvellement à suivre. Chaque format PDF du processus passe par un seul package, une seule licence et un seul chemin de code. Le guide d'importation de fichiers PDF aborde les plages de pages, la sélection non contiguë et l'importation de flux.
Données de résultat structurées au niveau des mots et des caractères. result.Pages[n].Words renvoie une collection où chaque mot porte sa boîte de délimitation, son texte, et son score de confiance individuel. La géométrie au niveau de la zone d'Aspose.OCR couvre des régions, et non des jetons individuels. Après la migration, les analyseurs de mise en page des documents, les extracteurs de champs de formulaire et les pipelines de traitement des factures peuvent accéder au positionnement par mot sans étapes de traitement supplémentaires. Consultez la page des fonctionnalités des résultats OCR pour connaître la hiérarchie complète des résultats.
Déploiement en un seul package sur toutes les plateformes. IronOCR est distribué sous forme d'un seul package NuGet qui s'exécute sur Windows, Linux, macOS, Docker, Azure App Service et AWS Lambda sans configuration spécifique à la plateforme. Aspose.OCR fonctionne sur plusieurs plateformes, mais peut nécessiter des ajustements de la bibliothèque native dans les environnements conteneurisés. Après la migration, le Dockerfile d'un service OCR est une image de base .NET standard sans aucune étape de configuration spécifique à l'OCR au-delà de l'installation du package. Les guides de déploiement couvrent Docker , Azure , AWS et Linux .
Lecture de code-barres lors du même passage que l'OCR. La configuration ocr.Configuration.ReadBarCodes = true extrait les codes-barres, les codes QR et les symboles Code 128 de la même image en un seul passage moteur. Aspose.OCR ne prend pas en charge la lecture des codes-barres ; une bibliothèque de codes-barres distincte serait nécessaire. Après la migration, les documents qui mélangent du texte imprimé avec des codes-barres (étiquettes d'expédition, formulaires d'inventaire, billets d'événement) sont gérés par un seul appel avec des résultats sur result.Barcodes. Consultez le guide d'utilisation de la reconnaissance optique de codes-barres pour connaître les symbologies prises en charge.
Questions Fréquemment Posées
Pourquoi devrais-je migrer d'Aspose.OCR for .NET vers IronOCR ?
Parmi les motivations communes, citons l'élimination de la complexité de l'interopérabilité COM, le remplacement de la gestion des licences basée sur les fichiers, l'absence de facturation à la page, l'activation du déploiement Docker/conteneur et l'adoption d'un flux de travail NuGet-natif qui s'intègre à l'outillage .NET standard.
Quels sont les principaux changements de code lors de la migration d'Aspose.OCR for .NET vers IronOcr ?
Remplacer les séquences d'initialisation d'Aspose.OCR par l'instanciation d'IronTesseract, supprimer la gestion du cycle de vie de COM (modèles explicites Create/Load/Close) et mettre à jour les noms des propriétés des résultats. Le résultat est une réduction significative du nombre de lignes de code.
Comment installer IronOCR pour commencer la migration ?
Exécutez "Install-Package IronOcr" dans la console du Package Manager ou "dotnet add package IronOcr" dans le CLI. Les packs de langues sont des paquets distincts : 'dotnet add package IronOcr.Languages.French' pour le français, par exemple.
IronOCR offre-t-il la même précision d'OCR qu'Aspose.OCR for .NET pour les documents commerciaux standard ?
IronOcr atteint un niveau de précision élevé pour les contenus commerciaux standard, notamment les factures, les contrats, les reçus et les formulaires dactylographiés. Les filtres de prétraitement d'image (désalignement, suppression du bruit, amélioration du contraste) améliorent encore la reconnaissance sur des données dégradées.
Comment IronOCR gère-t-il les données linguistiques qu'Aspose.OCR for .NET installe séparément ?
Les données linguistiques de l'IronOcr sont distribuées sous forme de packages NuGet. 'dotnet add package IronOcr.Languages.German' installe la prise en charge de l'allemand. Il n'y a pas de placement manuel de fichiers ou de chemins d'accès aux répertoires.
La migration d'Aspose.OCR for .NET vers IronOCR nécessite-t-elle des modifications de l'infrastructure de déploiement ?
IronOCR nécessite moins de changements d'infrastructure qu'Aspose.OCR for .NET. Il n'y a pas de chemins binaires SDK, de placements de fichiers de licence ou de configurations de serveurs de licence. Le package NuGet contient le moteur d'OCR complet, et la clé de licence est une chaîne définie dans le code de l'application.
Comment configurer les licences IronOCR après la migration ?
Attribuer IronOcr.License.LicenseKey = "YOUR-KEY" dans le code de démarrage de l'application. Dans Docker ou Kubernetes, stockez la clé dans une variable d'environnement et lisez-la au démarrage. Utilisez License.IsValidLicense pour valider avant d'accepter le trafic.
IronOcr peut-il traiter les PDF de la même manière qu'Aspose.OCR ?
Oui, IronOCR lit aussi bien les PDF natifs que les PDF numérisés. Instanciez IronTesseract, appelez ocr.Read(input) où l'input est un chemin PDF ou OcrPdfInput, et itérez les pages OcrResult. Aucun pipeline de rendu PDF séparé n'est nécessaire.
Comment IronOcr gère-t-il le threading dans le cadre d'un traitement à haut volume ?
IronTesseract est sûr pour l'instanciation par thread. Créez une instance par thread dans un Parallel.ForEach ou un Task pool, exécutez l'OCR simultanément et disposez de chaque instance lorsque vous avez terminé. Aucun état global ou verrouillage n'est nécessaire.
Quels formats de sortie IronOCR prend-il en charge après l'extraction du texte ?
IronOCR renvoie des résultats structurés comprenant le texte, les coordonnées des mots, les scores de confiance et la structure des pages. Les options d'exportation comprennent le texte brut, le PDF interrogeable et les objets de résultats structurés pour le traitement en aval.
La tarification d'IronOCR est-elle plus prévisible que celle d'Aspose.OCR for .NET pour la mise à l'échelle des charges de travail ?
IronOCR utilise des licences perpétuelles forfaitaires sans frais par page ou par volume. Que vous traitiez 10 000 ou 10 millions de pages, le coût de la licence reste constant. Les options de licence en volume et en équipe sont disponibles sur la page de tarification d'IronOcr.
Qu'advient-il de mes tests existants après la migration d'Aspose.OCR for .NET vers IronOcr ?
Les tests qui vérifient le contenu du texte extrait doivent continuer à passer après la migration. Les tests qui valident les modèles d'appel d'API ou le cycle de vie des objets COM devront être mis à jour pour refléter le modèle d'initialisation et de résultat plus simple d'IronOcr.

