IRONSOFTWAREHOME
VIDÉOS

Migration de RapidOCR.NET vers IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1 août 2026

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
});
C#

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;
C#

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.

FonctionRapidOCR.NETIronOCR
Installation de NuGetOui (RapidOcrNet)Oui (IronOcr)
Fichiers de modèles externes requisOui (4 fichiers, téléchargement manuel)Non
Configuration du chemin requiseOuiNon
Règles de copie MSBuild requisesOuiNon
Fonctionne immédiatement après l'installation de NuGetNonOui
Dépendance ONNX RuntimeOui (~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 moteurAttribution des propriétés
Prise en charge des langues européennesNonOui (30+)
Prise en charge de l'arabe et de l'hébreuNonOui
Prise en charge du cyrillique (russe, ukrainien)NonOui
Entrée PDF nativeNonOui
Fichier PDF protégé par mot de passeNonOui
Sortie PDF consultableNonOui
Entrée TIFF multipageNonOui
Entrée de flux et de tableau d'octetsLimitéOui
Prétraitement d'image intégréNonOui (filtres automatiques et manuels)
Filtres de redressement / de débruitage / de contrasteNonOui
Structure de sortie (paragraphes, lignes, WORDs)Partiel (blocs seulement)Oui, avec les coordonnées
Scores de confiance par motOui (par bloc)Oui
Lecture de codes-barres lors de la reconnaissance optique de caractères (OCR)NonOui
Exportation hOCRNonOui
Traitement parallèle sécurisé pour les threadsLimitéOui (une instance par thread)
Déploiement multiplateformeNécessite les binaires ONNX Runtime pour chaque plateformeOui (Windows, Linux, macOS, Docker)
Déploiement de DockerInstructions de COPY du modèle manuel requisesPrêt à l'emploi
Surcoût lié au démarrage à froid2 à 5 secondes (chargement du modèle)Minimal
Soutien commercialNonOui
LicenceApache 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
SHELL

Installez IronOCR depuis NuGet :

dotnet add package IronOcr

É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;
C#

É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";

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
    });
}
C#

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();
C#

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));
    }
}
C#

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;
    }
}
C#

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));
    }
}
C#

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;
    }
}
C#

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);
    }
}
C#

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);
    }
}
C#

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");
    }
}
C#

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);
    }
}
C#

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));
    }
}
C#

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);
    }
}
C#

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 RapidOcrNetusing IronOcr
new RapidOcrEngine(new RapidOcrOptions { ... })new IronTesseract()
RapidOcrOptions.DetModelPathNon nécessaire — intégré en interne
RapidOcrOptions.ClsModelPathNon nécessaire — intégré en interne
RapidOcrOptions.RecModelPathNon nécessaire — intégré en interne
RapidOcrOptions.KeysPathNon nécessaire — intégré en interne
RapidOcrOptions.UseGpuSans objet — Optimisé en interne pour le processeur
RapidOcrOptions.NumThreadsUtilisez Parallel.ForEach avec un IronTesseract par thread
engine.Run(imagePath)ocr.Read(imagePath)
engine.Dispose()using var ocr = new IronTesseract()
result.TextBlocksresult.Pages[i].Words / .Lines / .Paragraphs
result.TextBlocks[i].Textresult.Words[i].Text
result.TextBlocks[i].Confidenceresult.Words[i].Confidence
result.TextBlocks[i].BoundingBox.Topresult.Words[i].Y
result.TextBlocks[i].BoundingBox.Leftresult.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 languePas 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 imagesinput.LoadImageFrames("document.tiff")
Pas de fonctionnalité de recherche dans les PDFresult.SaveAsSearchablePdf("output.pdf")
Pas de prise en charge des BarCodesocr.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>
XML

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 :

dotnet add package IronOcr.Languages.Spanish, IronOcr.Languages.French, IronOcr.Languages.Arabic

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.Spanish;
var result = ocr.Read("spanish-document.jpg");
C#

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})");
C#

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" .
SHELL

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

  1. Supprimez la référence au package NuGet RapidOcrNet de tous les fichiers .csproj.
  2. Supprimez la référence au package NuGet Microsoft.ML.OnnxRuntime de tous les fichiers .csproj.
  3. Installez le package NuGet IronOcr.
  4. Installez les paquets NuGet de packs linguistiques pour toutes les langues autres que l'anglais requises par l'application.
  5. Supprimez le répertoire models/ du projet et du dépôt.
  6. Retirez les entrées MSBuild <Content Include="models\**\*.*"> de tous les fichiers .csproj.
  7. Retirez les méthodes de validation de modèle au démarrage (les méthodes de style EnsureModelsPresent).
  8. Remplacez using RapidOcrNet par using IronOcr dans tous les fichiers source.
  9. Remplacer new RapidOcrEngine(new RapidOcrOptions { ... })with new IronTesseract().
  10. Remplacez engine.Run(imagePath) par ocr.Read(imagePath).
  11. Remplacez les chaînes d'assemblages de result.TextBlocks (.OrderBy().Select(b => b.Text)) par result.Text.
  12. Remplacez l'extraction de champ par filtre de coordonnées par une entrée de région CropRectangle.
  13. Remplacez la construction de moteur par thread par une construction IronTesseract par thread.
  14. Remplacez les méthodes de fabrique de moteur spécifiques aux langues par des attributions ocr.Language = OcrLanguage.X.
  15. Retirez le code de conversion PDF-en-image et remplacez-le par des appels directs ocr.Read("file.pdf").
  16. Retirez le code de fractionnement de cadre TIFF multi-cadres et remplacez-le par input.LoadImageFrames("file.tiff").
  17. Ajoutez IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY" au démarrage de l'application.
  18. Supprimer les étapes de récupération et de mise en cache des fichiers de modèle des définitions de pipeline CI/CD.
  19. Supprimez les instructions COPY de 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.Text correspond à la séquence de champs attendue pour chaque type de document.
  • Testez les lectures avec changement de langue pour chaque valeur OcrLanguage utilisé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 CropRectangle par 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.

Veuillez noter: RapidOCR et Tesseract sont des marques déposées de leurs propriétaires respectifs. Ce site n'est pas affilié à, approuvé par ou sponsorisé par Google ou RapidOCR. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise