Migration de RapidOCR.NET vers IronOCR
Ce guide couvre le chemin de migration complet de RapidOCR.NET (RapidOcrNet) vers IronOCR pour les développeurs .NET qui doivent éliminer la gestion des fichiers de modèles ONNX de leur pipeline OCR. Il passe en revue le remplacement de package, la traduction de code et les changements opérationnels qui suivent lorsque les dépendances de modèles externes sont entièrement supprimées.
Pourquoi migrer depuis RapidOCR.NET
RapidOCR.NET fonctionne — pour un ensemble restreint de cas d'utilisation, dans des environnements contrôlés, où quelqu'un a déjà résolu le problème de distribution du modèle. Lorsque l'une de ces conditions change, les contraintes architecturales de la bibliothèque se transforment en coûts d'ingénierie.
Les fichiers de modèle ONNX sont un artefact de déploiement, pas un package. RapidOCR.NET nécessite quatre fichiers externes — det.onnx, cls.onnx, rec.onnx, et un dictionnaire de caractères — avant qu'un seul caractère puisse être reconnu. Ces fichiers ne sont pas inclus dans le package NuGet. Ils se trouvent sur les pages de publication GitHub, nécessitent un téléchargement manuel, une configuration explicite du chemin d'accès dans le code et des règles MSBuild personnalisées pour la copie lors de la compilation. Chaque nouveau développeur, chaque pipeline d'intégration continue, chaque environnement de déploiement répète ce rituel.
Changer de langue implique le remplacement du fichier, et non une simple configuration. Pour passer de l'OCR en anglais à l'OCR en chinois dans RapidOCR.NET, il faut télécharger un modèle de reconnaissance et un dictionnaire de caractères différents, puis reconstruire l'instance du moteur. L'espagnol, le français, l'allemand, le russe, l'arabe et plus de 100 autres langues ne disposent d'aucun modèle dans le catalogue de modèles RapidOCR. Une application qui doit traiter des documents dans plusieurs langues ne dispose d'aucune solution viable au sein de RapidOCR.NET pour les langues non prises en charge.
Les mises à jour de version nécessitent une intervention manuelle. Lorsque le projet RapidOCR en amont publie des poids de modèles améliorés, les équipes doivent télécharger les nouveaux fichiers, les remplacer dans chaque environnement, valider les chemins d'accès et procéder à un nouveau déploiement. Il n'existe pas d'étape de restauration du package qui gère cela automatiquement. Dans une configuration multi-environnement comprenant les phases de développement, de préproduction et de production, cette propagation est une opération manuelle à chaque fois.
La dépendance au runtime ONNX ajoute de la complexité à la plateforme. RapidOCR.NET dépend de Microsoft.ML.OnnxRuntime, un package avec des binaires natifs spécifiques à la plateforme. Les variantes CPU et GPU nécessitent des packages différents. Une image de conteneur construite pour linux/amd64 nécessite des binaires différents de celle construite pour linux/arm64. Chaque cible de déploiement nécessite une validation pour s'assurer que la variante d'exécution correcte est présente et compatible avec les fichiers de modèle installés.
La latence au démarrage à froid et l'empreinte mémoire sont des coûts fixes. Le chargement des trois modèles ONNX au démarrage prend 2 à 5 secondes et occupe 300 à 500 Mo de mémoire pendant toute la durée du processus. Ce coût est facturé quel que soit le volume d'OCR, ce qui rend la bibliothèque peu adaptée aux fonctions sans serveur, aux conteneurs légers ou aux services à faible trafic où la pénalité de démarrage est disproportionnée par rapport au débit.
Pas de support commercial. RapidOCR.NET est maintenu par un seul développeur communautaire sous licence Apache 2.0. Les incidents de production — conflits de versions d'ONNX Runtime, échecs d'inférence sur des formats d'image inhabituels, augmentation de la mémoire sous une charge soutenue — sont envoyés vers une file d'attente de tickets GitHub sans délai de réponse garanti ni SLA.
Le problème fondamental
Trois fichiers de modèles ONNX ainsi qu'un dictionnaire de caractères, tous téléchargés séparément, tous configurés par chemin d'accès :
// RapidOcrNet: 4 external files required before any OCR can execute
var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "./models/det.onnx", // ~3 MB — downloaded from GitHub
ClsModelPath = "./models/cls.onnx", // ~1 MB — downloaded from GitHub
RecModelPath = "./models/rec_en.onnx", // ~2-10 MB — language-specific download
KeysPath = "./models/en_keys.txt" // character dictionary — language-specific
});
IronOCR ne nécessite aucun fichier de modèle, aucune configuration de chemin d'accès et aucune étape de téléchargement :
// IronOCR: install the NuGet package, write one line
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
IronOCR vs RapidOCR.NET : comparaison des fonctionnalités
IronOCR et RapidOCR.NET se recoupent en matière de reconnaissance optique de caractères (OCR) d'images de base. Le fossé se creuse sur toutes les questions connexes.
| Fonction | RapidOCR.NET | IronOCR |
|---|---|---|
| Installation de NuGet | Oui (RapidOcrNet) | Oui (IronOcr) |
| Fichiers de modèles externes requis | Oui (4 fichiers, téléchargement manuel) | Non |
| Configuration du chemin requise | Oui | Non |
| Règles de copie MSBuild requises | Oui | Non |
| Fonctionne immédiatement après l'installation de NuGet | Non | Oui |
| Dépendance ONNX Runtime | Oui (~30–50 Mo) | Non |
| Langues prises en charge | ~5 (CJK + anglais seulement) | Plus de 125 modules linguistiques disponibles via NuGet |
| Changement de langue | Échange de fichiers + reconstruction du moteur | Attribution des propriétés |
| Prise en charge des langues européennes | Non | Oui (30+) |
| Prise en charge de l'arabe et de l'hébreu | Non | Oui |
| Prise en charge du cyrillique (russe, ukrainien) | Non | Oui |
| Entrée PDF native | Non | Oui |
| Fichier PDF protégé par mot de passe | Non | Oui |
| Sortie PDF consultable | Non | Oui |
| Entrée TIFF multipage | Non | Oui |
| Entrée de flux et de tableau d'octets | Limité | Oui |
| Prétraitement d'image intégré | Non | Oui (filtres automatiques et manuels) |
| Filtres de redressement / de débruitage / de contraste | Non | Oui |
| Structure de sortie (paragraphes, lignes, WORDs) | Partiel (blocs seulement) | Oui, avec les coordonnées |
| Scores de confiance par mot | Oui (par bloc) | Oui |
| Lecture de codes-barres lors de la reconnaissance optique de caractères (OCR) | Non | Oui |
| Exportation hOCR | Non | Oui |
| Traitement parallèle sécurisé pour les threads | Limité | Oui (une instance par thread) |
| Déploiement multiplateforme | Nécessite les binaires ONNX Runtime pour chaque plateforme | Oui (Windows, Linux, macOS, Docker) |
| Déploiement de Docker | Instructions de COPY du modèle manuel requises | Prêt à l'emploi |
| Surcoût lié au démarrage à froid | 2 à 5 secondes (chargement du modèle) | Minimal |
| Soutien commercial | Non | Oui |
| Licence | Apache 2.0 (gratuit) | Perpetual ($999 Lite, $1,499 Pro, $2,999 Enterprise) |
Guide de démarrage rapide : migration de RapidOCR.NET vers IronOCR
Étape 1 : Remplacer le package NuGet
Supprimer RapidOCR.NET et la dépendance ONNX Runtime :
dotnet remove package RapidOcrNet
dotnet remove package Microsoft.ML.OnnxRuntime
Installez IronOCR depuis NuGet :
Étape 2 : Mise à jour des espaces de noms
Remplacer l'espace de noms RapidOCR.NET par l'espace de noms IronOCR :
// Before (RapidOCR.NET)
using RapidOcrNet;
// After (IronOCR)
using IronOcr;
Étape 3 : initialisation de la licence
Ajoutez l'initialisation de la licence au démarrage de l'application, avant tout appel IronTesseract :
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Une clé d'essai gratuite est disponible sur la page de licence d' IronOCR .
Exemples de migration de code
Suppression de la configuration du chemin d'accès au modèle ONNX
Le changement le plus mécanique dans cette migration est la suppression du bloc de configuration RapidOcrOptions et son remplacement par un constructeur sans argument.
Approche de RapidOCR.NET :
using RapidOcrNet;
// Startup validation — written because a missing model crashes at runtime, not at install
private static void EnsureModelsPresent(string modelDir)
{
var required = new[]
{
Path.Combine(modelDir, "det.onnx"),
Path.Combine(modelDir, "cls.onnx"),
Path.Combine(modelDir, "rec_en.onnx"),
Path.Combine(modelDir, "en_keys.txt")
};
var missing = required.Where(f => !File.Exists(f)).ToList();
if (missing.Any())
throw new FileNotFoundException(
$"Missing model files: {string.Join(", ", missing)}\n" +
"Download from: https://github.com/RapidAI/RapidOCR/releases");
}
// Engine factory — called once at startup, held for lifetime of service
public RapidOcrEngine CreateEngine(string modelDir)
{
EnsureModelsPresent(modelDir);
return new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt"),
UseGpu = false,
NumThreads = Environment.ProcessorCount
});
}
Approche IronOCR :
using IronOcr;
// Non model validation, no path configuration, no GPU flags
// IronTesseract is thread-safe; create one per thread or on demand
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
La méthode de validation EnsureModelsPresent entière, l'objet de configuration RapidOcrOptions, et la classe de fabrique de moteur peuvent être supprimés. Il n'y a pas de fichiers modèles à valider car IronOCR intègre son moteur en interne dans le package NuGet. Le guide d'installation d'IronTesseract décrit en détail les options d'initialisation et l'emplacement de la clé de licence.
Consolidation du pipeline de détection, de classification et de reconnaissance
RapidOCR.NET exécute un pipeline ONNX en trois étapes — détection, classification de la direction, puis reconnaissance — et renvoie une liste plate et non ordonnée de blocs de texte que l'appelant doit trier et assembler. IronOCR expose un seul appel .Read() soutenu par son moteur interne Tesseract 5, renvoyant une sortie structurée avec l'ordre de lecture déjà appliqué.
Approche de RapidOCR.NET :
using RapidOcrNet;
public class InvoiceTextExtractor
{
private readonly RapidOcrEngine _engine;
public InvoiceTextExtractor(string modelDir)
{
// Three separate ONNX models run in sequence on every call
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"), // Stage 1: detect text regions
ClsModelPath = Path.Combine(modelDir, "cls.onnx"), // Stage 2: classify direction
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),// Stage 3: recognize characters
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
public string ExtractInvoiceText(string imagePath)
{
var result = _engine.Run(imagePath);
// Blocks are unordered — must sort by vertical position, then horizontal
var orderedBlocks = result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left)
.ToList();
// Manual assembly — no paragraph or line structure
return string.Join(Environment.NewLine,
orderedBlocks.Select(b => b.Text));
}
}
Approche IronOCR :
using IronOcr;
public class InvoiceTextExtractor
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractInvoiceText(string imagePath)
{
// Single call — detection, recognition, reading order all internal
var result = _ocr.Read(imagePath);
return result.Text; // Already in reading order
}
public IEnumerable<string> ExtractInvoiceParagraphs(string imagePath)
{
var result = _ocr.Read(imagePath);
// Structured paragraphs with coordinates — no sorting or assembly needed
foreach (var page in result.Pages)
foreach (var paragraph in page.Paragraphs)
yield return paragraph.Text;
}
}
Le pipeline en trois étapes est entièrement interne à IronOCR. La liste result.TextBlocks avec sa chaîne manuelle OrderBy se résume à result.Text. Pour les appelants qui avaient besoin de données de cadre englobant de TextBlocks, les collections result.Pages[i].Paragraphs, .Lines et .Words fournissent des coordonnées équivalentes via une API structurée. Le guide pratique sur les résultats de lecture et la page présentant les fonctionnalités des résultats OCR documentent le modèle de sortie structuré complet.
Remplacement du chargement de modèles personnalisés
Les applications qui doivent changer les configurations OCR au-delà du temps d'exécution — par exemple, en routant les documents à travers différents paramètres de reconnaissance en fonction du type de document — doivent reconstruire l'ensemble de RapidOcrEngine dans RapidOCR.NET car la configuration est liée au constructeur. IronOCR expose la configuration du moteur sous forme de propriétés pouvant être ajustées à chaque lecture sur une instance unique.
Approche de RapidOCR.NET :
using RapidOcrNet;
public class DocumentRouter
{
private readonly string _modelDir;
public DocumentRouter(string modelDir) => _modelDir = modelDir;
// Must create separate engine instances per configuration
// Each engine holds ~300-500 MB of loaded model weights
private RapidOcrEngine BuildEnglishEngine() =>
new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "en_rec.onnx"),
KeysPath = Path.Combine(_modelDir, "en_keys.txt")
});
private RapidOcrEngine BuildChineseEngine() =>
new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "ch_rec.onnx"), // separate download
KeysPath = Path.Combine(_modelDir, "ch_keys.txt") // separate download
});
public string ProcessDocument(string imagePath, string language)
{
// Rebuild engine for each language — model reload cost on every switch
using var engine = language == "chinese"
? BuildChineseEngine()
: BuildEnglishEngine();
var result = engine.Run(imagePath);
return string.Join("\n", result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text));
}
}
Approche IronOCR :
using IronOcr;
public class DocumentRouter
{
// One instance handles all languages — language is a property, not a constructor param
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessDocument(string imagePath, string language)
{
// Language switch requires no model reload, no rebuild
_ocr.Language = language switch
{
"chinese" => OcrLanguage.ChineseSimplified,
"japanese" => OcrLanguage.Japanese,
"arabic" => OcrLanguage.Arabic,
"russian" => OcrLanguage.Russian,
_ => OcrLanguage.English
};
return _ocr.Read(imagePath).Text;
}
}
Pas de reconstruction du moteur, pas de rechargement du modèle, pas de téléchargement séparé par langue. Les packs de langue pour des cibles non anglophones s'installent via NuGet — dotnet add package IronOcr.Languages.ChineseSimplified — et l'étape de restauration gère automatiquement le déploiement. Le guide pratique multilingue couvre l'installation des packs de langues et l'index des langues répertorie l'ensemble des plus de 125 packs disponibles.
Migration du traitement par lots
RapidOCR.NET n'offre aucune garantie de sécurité de thread sur une seule instance RapidOcrEngine. Le traitement par lots nécessite soit une file d'attente à thread unique, soit l'instanciation d'un moteur par thread, chacun occupant un espace de 300 à 500 Mo pour le modèle. IronOCR est explicitement sécuritaire pour les threads : créez un IronTesseract par thread et exécutez-les en concurrence sans verrouillage.
Approche de RapidOCR.NET :
using RapidOcrNet;
public class BatchOcrProcessor
{
private readonly string _modelDir;
public BatchOcrProcessor(string modelDir) => _modelDir = modelDir;
// Thread-pool processing — each thread needs its own engine copy
// 4 threads × 300-500 MB model footprint = 1.2-2 GB RAM minimum
public Dictionary<string, string> ProcessBatch(IReadOnlyList<string> imagePaths)
{
var results = new System.Collections.Concurrent.ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, new ParallelOptions { MaxDegreeOfParallelism = 4 },
imagePath =>
{
// Each thread must create its own engine — not safe to share
using var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(_modelDir, "det.onnx"),
ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
RecModelPath = Path.Combine(_modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(_modelDir, "en_keys.txt")
});
var result = engine.Run(imagePath);
results[imagePath] = string.Join("\n",
result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text));
});
return new Dictionary<string, string>(results);
}
}
Approche IronOCR :
using IronOcr;
public class BatchOcrProcessor
{
// Thread-safe: create IronTesseract per thread, no shared state required
public Dictionary<string, string> ProcessBatch(IReadOnlyList<string> imagePaths)
{
var results = new System.Collections.Concurrent.ConcurrentDictionary<string, string>();
Parallel.ForEach(imagePaths, imagePath =>
{
// Lightweight construction — no model loading overhead per thread
var ocr = new IronTesseract();
var result = ocr.Read(imagePath);
results[imagePath] = result.Text;
});
return new Dictionary<string, string>(results);
}
}
L'instantiation par thread RapidOcrEngine disparaît. Les instances de thread IronOCR sont légères : aucun chargement de modèle externe lors de la construction. L'exemple de multithreading illustre les modèles de traitement simultané pour les pipelines à haut débit.
Traitement TIFF multi-images
RapidOCR.NET n'accepte que les fichiers image uniques. Le traitement d'un TIFF multi-pages — le format standard pour les documents reçus par télécopie et les archives numérisées — nécessite de le scinder en images individuelles avec une bibliothèque d'images distincte, enregistrer ces images en fichiers temporaires, exécuter engine.Run() sur chacun, et procéder au nettoyage par la suite. IronOCR gère les TIFF multi-cadres en natif via OcrInput.LoadImageFrames.
Approche de RapidOCR.NET :
using RapidOcrNet;
// Also requires: SixLabors.ImageSharp or System.Drawing for TIFF frame extraction
public class TiffOcrProcessor
{
private readonly RapidOcrEngine _engine;
public TiffOcrProcessor(string modelDir)
{
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
public string ProcessMultiPageTiff(string tiffPath)
{
var pageTexts = new List<string>();
var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
Directory.CreateDirectory(tempDir);
try
{
// External library required to split TIFF frames
var framePaths = SplitTiffIntoFrames(tiffPath, tempDir); // not in RapidOcrNet
foreach (var framePath in framePaths)
{
var result = _engine.Run(framePath);
pageTexts.Add(string.Join("\n",
result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text)));
}
}
finally
{
// Clean up temp frame files
Directory.Delete(tempDir, recursive: true);
}
return string.Join("\n\n", pageTexts);
}
private IEnumerable<string> SplitTiffIntoFrames(string tiffPath, string outputDir)
{
// Requires external library — implementation depends on what is installed
throw new NotImplementedException("Add SixLabors.ImageSharp or similar");
}
}
Approche IronOCR :
using IronOcr;
public class TiffOcrProcessor
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath); // All frames loaded — no external library needed
var result = _ocr.Read(input);
return result.Text; // Pages assembled in order automatically
}
public IEnumerable<(int PageNumber, string Text, double Confidence)> ProcessTiffWithPageData(string tiffPath)
{
using var input = new OcrInput();
input.LoadImageFrames(tiffPath);
var result = _ocr.Read(input);
foreach (var page in result.Pages)
yield return (page.PageNumber, page.Text, page.Confidence);
}
}
Pas de bibliothèque d'images externe, pas de fichiers temporaires, pas de logique de nettoyage. LoadImageFrames lit tous les cadres TIFF dans le pipeline OcrInput en un seul appel. Le guide pratique sur les formats TIFF et GIF couvre la sélection d'images, le filtrage par plage de pages et la gestion économe en mémoire de documents volumineux comportant plusieurs images.
Extraction de données structurées à partir de formulaires numérisés
RapidOCR.NET renvoie des blocs de texte avec des cadres de sélection, mais sans structure documentaire de niveau supérieur — il n'y a pas de notion de paragraphes, de lignes ou de mots. L'extraction de champs individuels à partir d'un formulaire numérisé nécessite l'écriture d'une logique d'intersection de coordonnées par rapport à la liste brute de blocs. IronOCR fournit une arborescence de résultats structurée jusqu'au niveau des caractères, avec des coordonnées à chaque niveau.
Approche de RapidOCR.NET :
using RapidOcrNet;
public class FormFieldExtractor
{
private readonly RapidOcrEngine _engine;
public FormFieldExtractor(string modelDir)
{
_engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelDir, "det.onnx"),
ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
KeysPath = Path.Combine(modelDir, "en_keys.txt")
});
}
// Extract text within a defined region by filtering block coordinates manually
public string ExtractFieldByRegion(string imagePath, float regionLeft, float regionTop,
float regionRight, float regionBottom)
{
var result = _engine.Run(imagePath);
// Filter blocks whose bounding box intersects the target region
var blocksInRegion = result.TextBlocks
.Where(b =>
b.BoundingBox.Left < regionRight &&
b.BoundingBox.Right > regionLeft &&
b.BoundingBox.Top < regionBottom &&
b.BoundingBox.Bottom > regionTop)
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left);
return string.Join(" ", blocksInRegion.Select(b => b.Text));
}
}
Approche IronOCR :
using IronOcr;
public class FormFieldExtractor
{
private readonly IronTesseract _ocr = new IronTesseract();
// Use CropRectangle to OCR only the target region — no post-filter needed
public string ExtractFieldByRegion(string imagePath, int x, int y, int width, int height)
{
var region = new CropRectangle(x, y, width, height);
using var input = new OcrInput();
input.LoadImage(imagePath, region);
return _ocr.Read(input).Text;
}
// Extract all fields with their coordinates from a full-page scan
public IEnumerable<(string Text, int X, int Y, double Confidence)> ExtractAllWords(string imagePath)
{
var result = _ocr.Read(imagePath);
foreach (var page in result.Pages)
foreach (var word in page.Words)
yield return (word.Text, word.X, word.Y, word.Confidence);
}
}
CropRectangle confine l'OCR à la région d'intérêt exacte, ce qui est plus rapide et plus précis que de faire un OCR pleine page et de filtrer les résultats après coup. Les coordonnées par mot et les valeurs de confiance sont disponibles directement sur result.Pages[i].Words, sans aucun code manuel d'intersection de cadre englobant. Le guide pratique sur l'OCR par zone et l'exemple de rectangle de recadrage traitent ce modèle en détail.
Référence de mappage de l'API RapidOCR.NET vers IronOCR
| RapidOCR.NET | Équivalent d'IronOCR |
|---|---|
using RapidOcrNet | using IronOcr |
new RapidOcrEngine(new RapidOcrOptions { ... }) | new IronTesseract() |
RapidOcrOptions.DetModelPath | Non nécessaire — intégré en interne |
RapidOcrOptions.ClsModelPath | Non nécessaire — intégré en interne |
RapidOcrOptions.RecModelPath | Non nécessaire — intégré en interne |
RapidOcrOptions.KeysPath | Non nécessaire — intégré en interne |
RapidOcrOptions.UseGpu | Sans objet — Optimisé en interne pour le processeur |
RapidOcrOptions.NumThreads | Utilisez Parallel.ForEach avec un IronTesseract par thread |
engine.Run(imagePath) | ocr.Read(imagePath) |
engine.Dispose() | using var ocr = new IronTesseract() |
result.TextBlocks | result.Pages[i].Words / .Lines / .Paragraphs |
result.TextBlocks[i].Text | result.Words[i].Text |
result.TextBlocks[i].Confidence | result.Words[i].Confidence |
result.TextBlocks[i].BoundingBox.Top | result.Words[i].Y |
result.TextBlocks[i].BoundingBox.Left | result.Words[i].X |
Tri manuel OrderBy(b => b.BoundingBox.Top) | Pas nécessaire — result.Text est dans l'ordre de lecture |
string.Join("\n", result.TextBlocks.Select(b => b.Text)) | result.Text |
| Changement de fichier de langue (télécharger un autre modèle) | ocr.Language = OcrLanguage.French |
| Reconstruction du moteur pour le changement de langue | Pas nécessaire — définissez ocr.Language par appel |
Conversion PDF-en-image + boucle engine.Run() | ocr.Read("document.pdf") |
| TIFF multi-images : division manuelle des images | input.LoadImageFrames("document.tiff") |
| Pas de fonctionnalité de recherche dans les PDF | result.SaveAsSearchablePdf("output.pdf") |
| Pas de prise en charge des BarCodes | ocr.Configuration.ReadBarCodes = true |
Problèmes de migration courants et solutions
Problème n° 1 : le répertoire Models existe toujours après la migration
RapidOCR.NET : Le répertoire models/ dans le projet contient det.onnx, cls.onnx, rec_en.onnx et en_keys.txt, ainsi que des entrées MSBuild <Content> qui les copient lors de la construction. Après le passage à IronOCR, ce répertoire et ces entrées subsistent et continuent d'alourdir le résultat de la compilation.
Solution : Supprimez le répertoire models/, retirez le <ItemGroup> correspondant de .csproj, et retirez toute logique de validation au démarrage qui vérifiait l'absence de fichiers. Retirez également la référence NuGet Microsoft.ML.OnnxRuntime si elle a été installée séparément. Le résultat publié d'une application .NET utilisant IronOCR ne contient aucun fichier de modèle externe.
<!-- Remove this entire block from .csproj -->
<ItemGroup>
<Content Include="models\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Problème n° 2 : Modèle de construction du moteur par thread
RapidOCR.NET : Le code de traitement parallèle qui créait un nouveau RapidOcrEngine par thread pour éviter les problèmes d'état partagé engendrait un coût mémoire significatif : chaque instance de moteur chargeait indépendamment 300 à 500 Mo de poids de modèle ONNX.
Solution : Les instances IronTesseract d'IronOCR sont sûres pour les threads et légères. Créez-en un par thread dans un Parallel.ForEach sans vous soucier du coût de chargement du modèle par instance. L'approche IronOCR est identique à l'exemple de migration de traitement par lots ci-dessus — IronTesseract gère ce scénario avec le même modèle de construction par thread, mais sans le coût de chargement de modèle de 300 à 500 Mo que chaque instance RapidOcrEngine entraînait. L'exemple de multithreading illustre le modèle standard des pipelines à haut débit.
Problème n° 3 : Exception " Langue non prise en charge "
RapidOCR.NET : le code qui acheminait des documents non CJK via RapidOCR.NET — ou qui tentait de créer un moteur avec un modèle espagnol/français/allemand inexistant — provoquait une erreur " fichier introuvable " lors de l'exécution ou produisait des résultats vides.
Solution : Installez le package NuGet de pack linguistique approprié et définissez ocr.Language à la valeur de l'énumération cible OcrLanguage. Pas de téléchargement de modèle, pas de reconstruction du moteur, pas de chemin de code supplémentaire pour chaque langue :
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.Spanish;
var result = ocr.Read("spanish-document.jpg");
Le guide des packs de langues personnalisés couvre les configurations linguistiques avancées allant au-delà des plus de 125 packs standard.
Problème n° 4 : la logique de tri des blocs de texte ne fonctionne plus après la migration
RapidOCR.NET : Parce que result.TextBlocks était une liste plate non ordonnée, les bases de code contenaient typiquement des chaînes .OrderBy(b => b.BoundingBox.Top).ThenBy(b => b.BoundingBox.Left) dispersées dans le code de traitement des résultats.
Solution : Supprimez entièrement cette logique de tri. result.Text dans IronOCR est déjà assemblé dans l'ordre de lecture naturel. Pour le code qui consommait également des coordonnées de cadre englobant à partir des blocs triés, remplacez la référence de bloc par result.Pages[i].Words[j] :
// Before: manual sort + coordinate extraction
var sorted = result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left);
foreach (var block in sorted)
Console.WriteLine($"{block.Text} at ({block.BoundingBox.Left}, {block.BoundingBox.Top})");
// After: structured access, already in order
foreach (var page in result.Pages)
foreach (var word in page.Words)
Console.WriteLine($"{word.Text} at ({word.X}, {word.Y})");
Problème n° 5 : échec du pipeline CI/CD après la suppression des fichiers de modèle
RapidOCR.NET : Les pipelines de construction qui mettaient en cache ou récupéraient le répertoire models/ comme une étape distincte — soit à partir d'un magasin d'artéfacts, d'un bucket S3 partagé ou d'un dépôt Git LFS — échoueront lorsque ces étapes ne trouveront rien à restaurer après la migration.
Solution : Supprimer entièrement les étapes de récupération et de mise en cache du fichier modèle du pipeline CI. Le moteur d'IronOCR est restauré dans le cadre de l'étape dotnet restore standard. Aucune étape supplémentaire dans le pipeline n'est requise. Pour les déploiements en conteneurs, retirez toutes les instructions Docker COPY models/ ./models/ — le guide de déploiement Docker d'IronOCR documente le seul package système requis (libgdiplus sur les images Debian/Ubuntu) et rien de plus.
Problème n° 6 : Conflits de versions d'ONNX Runtime après une migration partielle
RapidOCR.NET : Les applications qui utilisent également d'autres packages ML basés sur ONNX (ML.NET, détection d'objets ONNX, etc.) ont pu épingler Microsoft.ML.OnnxRuntime à une version spécifique pour la compatibilité avec RapidOCR.NET. La suppression de RapidOCR.NET peut entraîner des conflits de version dans ces autres paquets.
Solution : Retirez Microsoft.ML.OnnxRuntime de la liste des packages explicites. IronOCR n'a pas de dépendance au runtime ONNX, donc retirer la référence à RapidOCR.NET élimine entièrement l'épinglage de version. Les autres packages ML qui nécessitent véritablement ONNX Runtime peuvent alors résoudre leur propre version compatible via la résolution standard des dépendances NuGet sans la contrainte de RapidOCR.NET.
Liste de contrôle pour la migration vers RapidOCR.NET
Tâches préalables à la migration
Vérifiez le code source pour détecter toute utilisation de RapidOCR.NET avant d'apporter des modifications :
# Find all files that reference RapidOcrNet
grep -r "RapidOcrNet\|RapidOcrEngine\|RapidOcrOptions" --include="*.cs" .
# Find model path configuration
grep -r "DetModelPath\|ClsModelPath\|RecModelPath\|KeysPath" --include="*.cs" .
# Find MSBuild model copy entries
grep -r "det\.onnx\|cls\.onnx\|rec.*\.onnx\|keys\.txt" --include="*.csproj" .
# Find model validation logic
grep -r "ValidateModel\|models/" --include="*.cs" .
# Find ONNX Runtime references
grep -r "OnnxRuntime\|Microsoft\.ML" --include="*.csproj" .
# Find language-switching patterns (multiple engine instances per language)
grep -r "CreateEnglishEngine\|CreateChineseEngine\|rec_en\|ch_rec\|en_keys\|ch_keys" --include="*.cs" .
Inventoriez les résultats : notez chaque endroit où un moteur est créé, chaque endroit où des chemins de modèle sont configurés, chaque endroit où les blocs de texte sont triés, et chaque endroit où la conversion PDF-en-image alimente engine.Run().
Tâches de mise à jour du code
- Supprimez la référence au package NuGet
RapidOcrNetde tous les fichiers.csproj. - Supprimez la référence au package NuGet
Microsoft.ML.OnnxRuntimede tous les fichiers.csproj. - Installez le package NuGet
IronOcr. - Installez les paquets NuGet de packs linguistiques pour toutes les langues autres que l'anglais requises par l'application.
- Supprimez le répertoire
models/du projet et du dépôt. - Retirez les entrées MSBuild
<Content Include="models\**\*.*">de tous les fichiers.csproj. - Retirez les méthodes de validation de modèle au démarrage (les méthodes de style
EnsureModelsPresent). - Remplacez
using RapidOcrNetparusing IronOcrdans tous les fichiers source. - Remplacer
new RapidOcrEngine(new RapidOcrOptions { ... })withnew IronTesseract(). - Remplacez
engine.Run(imagePath)parocr.Read(imagePath). - Remplacez les chaînes d'assemblages de
result.TextBlocks(.OrderBy().Select(b => b.Text)) parresult.Text. - Remplacez l'extraction de champ par filtre de coordonnées par une entrée de région
CropRectangle. - Remplacez la construction de moteur par thread par une construction
IronTesseractpar thread. - Remplacez les méthodes de fabrique de moteur spécifiques aux langues par des attributions
ocr.Language = OcrLanguage.X. - Retirez le code de conversion PDF-en-image et remplacez-le par des appels directs
ocr.Read("file.pdf"). - Retirez le code de fractionnement de cadre TIFF multi-cadres et remplacez-le par
input.LoadImageFrames("file.tiff"). - Ajoutez
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"au démarrage de l'application. - Supprimer les étapes de récupération et de mise en cache des fichiers de modèle des définitions de pipeline CI/CD.
- Supprimez les instructions
COPYde modèle ONNX des Dockerfiles.
Test de post-migration
- Vérifiez que tous les chemins d'accès OCR des images existantes renvoient un texte dont la précision est égale ou supérieure à celle de la sortie de RapidOCR.NET.
- Confirmez que l'ordre de lecture
result.Textcorrespond à la séquence de champs attendue pour chaque type de document. - Testez les lectures avec changement de langue pour chaque valeur
OcrLanguageutilisée par l'application. - Exécutez le processeur de lots parallèle et vérifiez qu'il n'y a pas d'erreurs de contention de threads ni de problèmes de résultats obsolètes.
- Vérifiez que le traitement des fichiers TIFF multi-images renvoie le nombre correct de pages avec le texte correct par page.
- Testez l'extraction de champ de formulaire via
CropRectanglepar rapport aux régions de coordonnées attendues. - Confirmez que le répertoire
models/est absent des résultats de construction et des packages de déploiement. - Exécutez le pipeline CI de bout en bout et vérifiez qu'il ne reste aucune étape de récupération de modèle.
- Construisez et exécutez un conteneur Docker et confirmez qu'il n'y a pas de couche
COPY models/ou d'erreurs de fichier introuvable au démarrage. - Testez la mesure du temps de démarrage pour vérifier que la latence au démarrage à froid a diminué.
Principaux avantages de la migration vers IronOCR
**Le déploiement est maintenant déterministe. ** dotnet restore et dotnet publish produisent un déploiement OCR complet et fonctionnel sans dépendances de fichiers externes. La même restauration NuGet qui installe la version du package installe tout ce dont le moteur a besoin pour fonctionner. Il n'y a pas de fichiers modèles à versionner séparément, pas d'étapes de cache CI à configurer et pas de scripts de validation de déploiement à maintenir. Le pipeline est aussi simple que n'importe quelle autre dépendance de package .NET.
La couverture linguistique évolue avec les besoins de l'entreprise. L'ajout de la prise en charge d'une nouvelle langue de document signifie exécuter dotnet add package IronOcr.Languages.X et définir ocr.Language. Il n'y a pas de vérification de la disponibilité du modèle en amont, pas de téléchargement de modèle et pas de refactorisation du moteur. Les équipes qui commencent par l'OCR anglais et qui doivent ensuite traiter des contrats en allemand, des factures en arabe ou des bons de commande en russe étendent leur couverture sans toucher à l'architecture de l'application. Les plus de 125 packs de langues suivent tous le même modèle d'installation.
La sortie structurée élimine le code d'assemblage de coordonnées. La hiérarchie result.Pages, .Paragraphs, .Lines, .Words et .Characters remplace la liste plate TextBlocks et la logique de tri qui contournait son manque de structure. Le code qui extrayait le texte dans l'ordre de lecture en triant les coordonnées des blocs a été supprimé. Le code qui nécessitait des boîtes englobantes par mot les obtient de word.X, word.Y, word.Width, word.Height sans filtrage d'intersection. La page présentant les résultats de l'OCR documente le modèle de sortie complet.
Le traitement des fichiers PDF et TIFF ne nécessite aucune bibliothèque externe. Les deux formats de documents les plus courants, outre les fichiers JPG à image unique (les PDF multipages et les TIFF multi-images), sont gérés en natif par IronOCR. Chaque bibliothèque externe qui a été ajoutée à l'arbre des dépendances pour prendre en charge engine.Run() avec une entrée PDF ou TIFF peut être supprimée. Résultat net : moins de paquets à mettre à jour, moins de problèmes de compatibilité entre versions et des fichiers de projet plus simples. Les guides pratiques sur l'importation de fichiers PDF et TIFF couvrent ces deux formats en détail.
Les incidents de production bénéficient d'un support dédié. Les licences commerciales incluent un Support par e-mail avec un interlocuteur dédié pour les problèmes qui ne peuvent attendre une réponse via GitHub. Les équipes soumises à des obligations de SLA ou disposant de pipelines de traitement de documents critiques pour l'entreprise peuvent signaler les incidents aux ingénieurs chargés de la maintenance de la bibliothèque plutôt que d'attendre une réponse de la communauté. Le centre de documentation IronOCR fournit de la documentation de référence ainsi qu'un parcours d'assistance.
La Licence perpétuelle $999 est un coût unique. Il n'y a pas de tarification par page, pas de facturation par transaction, et pas de renouvellement annuel qui rouvre la conversation sur les coûts. Les équipes de développement qui ont chiffré le coût des heures d'ingénierie consacrées à la gestion des modèles, aux solutions de contournement pour la conversion de PDF, à la maintenance du pipeline d'intégration continue et aux escalades liées aux langues non prises en charge trouvent systématiquement que le rapport est favorable par rapport au coût de la licence.
