IRONSOFTWAREHOME
VIDÉOS

Migration de Tesseract vers IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 1 août 2026

Ce guide offre un chemin de migration direct du paquet NuGet charlesw Tesseract vers IronOCR. Il couvre les étapes spécifiques requises pour éliminer la gestion des dossiers tessdata, remplacer les modèles d'initialisation TesseractEngine et Pix, ajouter un pipeline de prétraitement intégré et débloquer le support natif du PDF — sans dupliquer le matériel déjà examiné dans l'article de comparaison pour cette bibliothèque.

Pourquoi migrer depuis Tesseract

Le paquet charlesw Tesseract expose une véritable capacité OCR, et ses 8 millions de téléchargements NuGet en sont la preuve. La difficulté ne réside pas dans le moteur, mais dans l'infrastructure que vous devez mettre en place autour de celui-ci avant de pouvoir fournir un résultat de qualité production. Quatre points faibles spécifiques motivent la plupart des décisions de migration.

La gestion des dossiers tessdata se complique avec chaque environnement. Avant qu'un seul mot ne soit reconnu, le chemin tessdata doit exister, être rempli avec les fichiers .traineddata corrects pour chaque langue dont votre application a besoin, et être accessible exactement au chemin donné à TesseractEngine. Cela implique la configuration de dossiers distincts pour les machines de développement, les builds CI, les serveurs de préproduction, les hôtes de production et les conteneurs Docker. Un fichier manquant génère TesseractException: Failed to initialise tesseract engine à l'exécution — après le déploiement — avec un message qui n'identifie pas toujours quel fichier est absent. Chaque nouvel environnement est une nouvelle occasion pour cet échec.

Tesseract 4.1.1 marque la fin du parcours. Le wrapper charlesw est verrouillé sur Tesseract 4.1.1, publié en 2019. Tesseract 5.x a introduit des améliorations du modèle LSTM qui offrent une précision nettement supérieure sur certains types de documents. Cette version n'est pas disponible via ce package, et la cadence de maintenance du wrapper a considérablement ralenti depuis 2021. Les équipes qui souhaitent bénéficier d'une précision équivalente à celle des versions actuelles de Tesseract ne disposent d'aucune voie de mise à niveau via le wrapper charlesw.

L'absence de prétraitement signifie qu'il n'est pas fiable sur des documents réels. Tesseract s'attend à des données d'entrée propres, en haute résolution et correctement orientées. Elle n'applique aucune correction intégrée pour la distorsion, le bruit, une faible résolution (DPI) ou les arrière-plans colorés. Construire le pipeline de prétraitement manuellement — conversion en niveaux de gris, amélioration du contraste, binarisation, filtrage de bruit médian, redressement — nécessite environ 180 lignes de code en utilisant System.Drawing.Common (Windows uniquement) ou requiert l'inclusion de OpenCvSharp4 pour un redressement Hough-transform approprié. Ce pipeline doit ensuite être maintenu à mesure que de nouvelles sources de documents introduisent des cas limites.

Le format PDF est une solution de secours nécessitant une deuxième chaîne de dépendances. Les contrats, factures, relevés bancaires et documents de conformité sont fournis au format PDF. Tesseract ne peut pas ouvrir un fichier PDF. Pour combler cette lacune, il faut une bibliothèque de rendu PDF distincte — PdfiumViewer, PDFtoImage ou Docnet.Core — chacune avec ses propres binaires natifs, ses étapes de déploiement spécifiques à la plateforme et ses considérations en matière de licence. GhostScript implique des implications liées à la licence AGPL. Les PDF protégés par mot de passe ajoutent une bibliothèque supplémentaire. Les équipes gérant trois chaînes de dépendances natives distinctes dans plusieurs environnements atteignent un seuil de maintenance qui les incite à évaluer directement les alternatives à package unique.

Le design du moteur non sécurisé pour les threads limite le débit parallèle. Une instance TesseractEngine ne peut pas être partagée entre les threads. Le modèle de traitement parallèle standard crée un moteur par thread, chargeant 40 à 100 Mo de données de modèle linguistique par instance. Huit threads parallèles signifient 320 à 800 Mo de surcharge d'initialisation du moteur avant le traitement de tout document. Ce n'est pas un bug — c'est l'utilisation prévue d'une API non thread-safe — mais le coût en mémoire est réel et s'accumule à mesure que la taille des lots augmente.

Le problème fondamental

Chaque application Tesseract démarre de la même manière : en spécifiant un chemin d'accès tessdata qui doit être correct sur chaque machine sur laquelle l'application s'exécute.

Approche de Tesseract :

// TessDataPath must exist and be populated — breaks on first clean deployment
private const string TessDataPath = @"./tessdata";

public static string ExtractText(string imagePath)
{
    // Runtime failure if eng.traineddata is missing from TessDataPath
    if (!Directory.Exists(TessDataPath))
        throw new DirectoryNotFoundException(
            $"Tessdata not found at {TessDataPath}. " +
            "Download from https://github.com/tesseract-ocr/tessdata");

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img   = Pix.LoadFromFile(imagePath);  // Leptonica Pix object
    using var page  = engine.Process(img);
    return page.GetText();
}
C#

Approche IronOCR :

// No tessdata folder. No path. No file check. Just OCR.
var text = new IronTesseract().Read("document.jpg").Text;
C#

L'intégralité de la constante TessDataPath, la garde Directory.Exists, l'objet Pix, et le nesting en trois niveaux using disparaissent. Les données linguistiques sont intégrées dans le package NuGet.

IronOCR vs Tesseract : comparaison des fonctionnalités

Le tableau suivant présente les fonctionnalités les plus importantes à prendre en compte lors des décisions de migration.

FonctionTesseract (charlesw)IronOCR
package NuGetTesseractIronOcr
version du moteur Tesseract4.1.1 (2019, épinglé)Tesseract 5.x optimisé
Gestion de TessdataTéléchargement du manuel et des fichiersIntégré — aucune configuration requise
Packs linguistiquesTéléchargement manuel .traineddataPackage NuGet par langue
Langues disponibles100+ (manuel)125+ (NuGet)
Multilingue simultané"eng+fra+deu" chaîneOcrLanguage.French + OcrLanguage.German
Prétraitement des imagesManuel (~180 lignes)Méthodes intégrées en une ligne
DéclinManuel (transformation de Hough requise)input.Deskew()
DeNoiseManuel (filtre médian)input.DeNoise()
Contraste / BinarisationItération manuelle des pixelsinput.Contrast(), input.Binarize()
Suppression approfondie du bruitNon disponibleinput.DeepCleanBackgroundNoise()
Entrée PDFAucun — nécessite une bibliothèque externeNative (numérisée, numérique, mixte)
PDF protégé par mot de passeNécessite une bibliothèque de déchiffrementinput.LoadPdf(path, Password: "...")
TIFF multipageItération manuelle du cadreinput.LoadImageFrames()
Sortie PDF consultableNon pris en chargeresult.SaveAsSearchablePdf()
Accès structuré aux résultatsResultIterator boucleresult.Pages, .Paragraphs, .Words
Sécurité des threadsNon compatible avec les filsinstance unique sécurisée pour les threads
Lecture de codes-barresNon pris en chargeocr.Configuration.ReadBarCodes = true
MultiplateformeDLL natives requises par plateformeNuGet unique, toutes plateformes
Déploiement DockerÉtapes de COPY pour apt-get + tessdataAucune étape supplémentaire
LicenceApache 2.0 (gratuit)Perpétuel ($999 Lite / 1 499 $ Pro / 2 999 $ Enterprise)
soutien commercialCommunauté uniquementOui (e-mail + niveaux de priorité)

Guide de démarrage rapide : migration de Tesseract vers IronOCR

Étape 1 : Remplacer le package NuGet

Supprimer le wrapper Tesseract de charlesw :

dotnet remove package Tesseract
SHELL

Installez IronOCR depuis NuGet :

dotnet add package IronOcr

Les packs de langues s'installent sous forme de paquets distincts lorsque cela est nécessaire :

dotnet add package IronOcr.Languages.French, IronOcr.Languages.German

Étape 2 : Mise à jour des espaces de noms

Remplacez l'espace de noms Tesseract par l'espace de noms IronOCR :

// Before
using Tesseract;

// After
using IronOcr;
C#

Étape 3 : initialisation de la licence

Ajoutez l'initialisation de la licence une fois au démarrage de l'application, avant tout appel IronTesseract :

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

Une version d'essai gratuite fonctionne sans clé pendant la phase de développement. Les déploiements en production nécessitent une clé valide provenant de la page des licences.

Exemples de migration de code

Élimination des chemins d'accès et initialisation du moteur Tessdata

Le changement le plus immédiat est la suppression de l'initialisation TesseractEngine et de tout le code de validation tessdata qui l'entoure.

Approche de Tesseract :

// Every class that uses OCR must handle this initialization block
private const string TessDataPath = @"./tessdata";

public string RecognizeInvoiceNumber(string imagePath)
{
    // Check tessdata presence — missing file = silent runtime failure
    foreach (var lang in new[] { "eng" })
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
            throw new FileNotFoundException(
                $"Missing {lang}.traineddata. " +
                "Download from https://github.com/tesseract-ocr/tessdata");
    }

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);

    // Pix is a Leptonica wrapper type — not a standard .NET image
    using var img  = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    string text = page.GetText();
    float  conf = page.GetMeanConfidence();

    return conf > 0.7f ? text : string.Empty;
}
C#

Approche IronOCR :

using IronOcr;

public string RecognizeInvoiceNumber(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);

    // Confidence property returns 0-100 double
    return result.Confidence > 70 ? result.Text : string.Empty;
}
C#

La garde FileNotFoundException, la constante tessdata, l'objet Pix, et le nesting en trois niveaux ont disparu. IronTesseract se construit sans arguments parce que les données linguistiques sont intégrées. Consultez le guide d'installation d'IronTesseract pour connaître les options de configuration si vous avez besoin d'un comportement non standard, et le guide des scores de confiance pour l'API de confiance complète.

Traitement de fichiers TIFF multipages avec pipeline de prétraitement

Les fichiers TIFF multi-images — courants dans les archives de documents numérisés et les systèmes de télécopie — nécessitent une itération explicite des images avec Tesseract. IronOCR charge toutes les images en un seul appel et applique le pipeline de prétraitement de manière uniforme.

Approche de Tesseract :

using Tesseract;
using System.Drawing;
using System.Drawing.Imaging;

private const string TessDataPath = @"./tessdata";

public static string ExtractFromMultiPageTiff(string tiffPath)
{
    var allText = new System.Text.StringBuilder();

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var tiffImage = Image.FromFile(tiffPath);

    int frameCount = tiffImage.GetFrameCount(FrameDimension.Page);

    for (int i = 0; i < frameCount; i++)
    {
        tiffImage.SelectActiveFrame(FrameDimension.Page, i);

        // Must save each frame to disk — Pix.LoadFromFile requires a path
        string tempPath = Path.GetTempFileName() + ".png";
        try
        {
            tiffImage.Save(tempPath, ImageFormat.Png);

            using var img  = Pix.LoadFromFile(tempPath);
            using var page = engine.Process(img);
            allText.AppendLine(page.GetText());
        }
        finally
        {
            File.Delete(tempPath); // Uncleaned temp files fill disk on failure
        }
    }

    return allText.ToString();
}
C#

Approche IronOCR :

using IronOcr;

public static string ExtractFromMultiPageTiff(string tiffPath)
{
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);  // Loads all frames at once
    input.Deskew();                   // Applied to every frame uniformly
    input.DeNoise();

    var result = new IronTesseract().Read(input);
    return result.Text;
}
C#

Pas d'itération de cadres. Aucune création de fichier temporaire. Pas de logique de nettoyage. Le pipeline de prétraitement s'applique à chaque image sans boucle supplémentaire. Le guide d'entrée TIFF et GIF couvre en détail la gestion des images multiples, y compris les plages d'images sélectives pour les fichiers d'archives volumineux.

Génération de PDF consultables

La conversion d'un PDF numérisé en un PDF consultable nécessite que Tesseract convertisse chaque page en image (via une bibliothèque PDF externe), exécute l'OCR, puis reconstitue un PDF avec une couche de texte — un processus multi-bibliothèques en plusieurs étapes. IronOCR gère l'entrée, l'OCR et la sortie dans un pipeline unique.

Approche de Tesseract :

// Requires: PdfiumViewer + Tesseract + a PDF writer library (iText, PdfSharp)
// Each library adds its own native dependencies and license considerations

using Tesseract;
// using PdfiumViewer;  // Comment: must add NuGet + deploy native pdfium.dll
// using iText.Kernel.Pdf;  // Comment: AGPL or commercial license required

private const string TessDataPath = @"./tessdata";

public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    // Step 1: Render PDF pages to images (requires PdfiumViewer)
    // Step 2: Run OCR on each image (Tesseract)
    // Step 3: Write text positions back into PDF (requires iText or PDFsharp)
    //
    // Total: ~150 lines across three libraries
    // Native binaries required: tesseract*.dll, leptonica*.dll, pdfium.dll
    // License risk: iText is AGPL unless you purchase a commercial license

    throw new NotImplementedException(
        "Requires PdfiumViewer + Tesseract + a PDF writer. " +
        "No single-package solution exists with this stack.");
}
C#

Approche IronOCR :

using IronOcr;

public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    using var input = new OcrInput();
    input.LoadPdf(inputPdfPath);
    input.Deskew();    // Correct scanned page skew before OCR
    input.DeNoise();   // Remove scanner artifacts

    var result = new IronTesseract().Read(input);
    result.SaveAsSearchablePdf(outputPdfPath);
}
C#

Un seul appel de méthode génère le PDF consultable avec une couche de texte intégrée. Pas de bibliothèque PDF externe, pas de binaire pdfium natif, pas d'enchevêtrement de licences avec des dépendances AGPL. Le guide pratique au format PDF consultable documente le format de sortie, et l'exemple d'OCR de PDF présente le processus complet de traitement d'un document numérisé. Pour un contexte plus large sur ce qu'IronOCR peut faire avec des fichiers PDF en entrée, la page des cas d'utilisation de l'OCR de PDF couvre les modèles d'architecture de production.

Extraction de données structurées à partir de documents numérisés

Tesseract expose les données au niveau des mots via ResultIterator, qui nécessite une boucle do/while avec extraction manuelle de la boîte de délimitation. IronOCR expose une hiérarchie de document — pages, paragraphes, lignes, mots — sous forme de collections fortement typées dont les coordonnées sont déjà renseignées.

Approche de Tesseract :

using Tesseract;

private const string TessDataPath = @"./tessdata";

public static void ExtractStructuredData(string imagePath)
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img    = Pix.LoadFromFile(imagePath);
    using var page   = engine.Process(img);
    using var iter   = page.GetIterator();

    iter.Begin();
    do
    {
        if (iter.IsAtBeginningOf(PageIteratorLevel.Para))
            Console.WriteLine("-- New Paragraph --");

        if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
        {
            string word       = iter.GetText(PageIteratorLevel.Word);
            float  confidence = iter.GetConfidence(PageIteratorLevel.Word);
            Console.WriteLine(
                $"Word: '{word?.Trim()}' " +
                $"at ({bounds.X1},{bounds.Y1})-({bounds.X2},{bounds.Y2}) " +
                $"conf={confidence:P0}");
        }
    }
    while (iter.Next(PageIteratorLevel.Word));
}
C#

Approche IronOCR :

using IronOcr;

public static void ExtractStructuredData(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);

    foreach (var page in result.Pages)
    {
        Console.WriteLine($"Page {page.PageNumber} — confidence: {result.Confidence}%");

        foreach (var paragraph in page.Paragraphs)
        {
            Console.WriteLine($"  Paragraph at ({paragraph.X},{paragraph.Y}):");
            Console.WriteLine($"  {paragraph.Text}");

            foreach (var word in paragraph.Words)
            {
                Console.WriteLine(
                    $"    Word: '{word.Text}' " +
                    $"at ({word.X},{word.Y}) " +
                    $"size {word.Width}x{word.Height} " +
                    $"conf={word.Confidence:P0}");
            }
        }
    }
}
C#

La boucle ResultIterator disparaît complètement. La hiérarchie du document est un ensemble de collections énumérables — pas d'état d'itérateur, pas de suivi manuel des niveaux, pas d'extraction de cadre de sélection par paramètre de sortie. Chaque objet mot possède ses propres coordonnées et son propre niveau de confiance. Le guide des résultats de lecture documente chaque niveau de la hiérarchie, et la référence de l'API OcrResult répertorie toutes les propriétés disponibles.

OCR multilingue sans gestion de fichiers Tessdata

Ajouter une langue à une application Tesseract signifie télécharger un fichier .traineddata, le placer dans le dossier tessdata, mettre à jour chaque manifeste de déploiement incluant ce dossier, et modifier la chaîne d'initialisation du moteur. Avec IronOCR, il s'agit d'une référence de package NuGet unique.

Approche de Tesseract :

using Tesseract;

private const string TessDataPath = @"./tessdata";

public static string ExtractFromEuropeanDocument(string imagePath)
{
    // Before this call works, these files must exist:
    // ./tessdata/eng.traineddata  (~15 MB, from GitHub)
    // ./tessdata/fra.traineddata  (~15 MB, from GitHub)
    // ./tessdata/deu.traineddata  (~15 MB, from GitHub)
    // ./tessdata/spa.traineddata  (~15 MB, from GitHub)
    // Total: ~60 MB to download, version-match, and deploy to every environment

    foreach (var lang in new[] { "eng", "fra", "deu", "spa" })
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
            throw new FileNotFoundException(
                $"Download {lang}.traineddata from " +
                "https://github.com/tesseract-ocr/tessdata " +
                $"and place in {TessDataPath}");
    }

    // Language string is a concatenation — order affects recognition priority
    using var engine = new TesseractEngine(TessDataPath, "eng+fra+deu+spa", EngineMode.Default);
    using var img    = Pix.LoadFromFile(imagePath);
    using var page   = engine.Process(img);
    return page.GetText();
}
C#

Approche IronOCR :

// Install language packs once per project:
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
// dotnet add package IronOcr.Languages.Spanish
using IronOcr;

public static string ExtractFromEuropeanDocument(string imagePath)
{
    var ocr = new IronTesseract();
    ocr.Language = OcrLanguage.English;
    ocr.AddSecondaryLanguage(OcrLanguage.French);
    ocr.AddSecondaryLanguage(OcrLanguage.German);
    ocr.AddSecondaryLanguage(OcrLanguage.Spanish);

    return ocr.Read(imagePath).Text;
}
C#

Le dossier tessdata, la boucle d'existence de fichier, la chaîne de concaténation du chemin et les mises à jour du manifeste de déploiement sont tous remplacés par des lignes PackageReference dans le .csproj. Ajouter une langue à Docker signifie une dotnet add package supplémentaire — pas une étape COPY Dockerfile. Le guide des langues multiples couvre l'intégralité du catalogue de plus de 125 langues et des ensembles de caractères CJK, et l'index des langues répertorie chaque pack de langues disponible.

Référence de mappage de l'API Tesseract vers IronOCR

Tesseract (charlesw)IronOCR
new TesseractEngine(tessDataPath, "eng", EngineMode.Default)new IronTesseract()
Pix.LoadFromFile(path)input.LoadImage(path) ou ocr.Read(path)
Pix.LoadFromMemory(bytes)input.LoadImage(bytes)
engine.Process(img)ocr.Read(input)
page.GetText()result.Text
page.GetMeanConfidence()result.Confidence
page.GetHOCRText(0)result.SaveAsHocrFile(path)
engine.Process(img, tessRect)input.LoadImage(path, new CropRectangle(x, y, w, h))
page.GetIterator()result.Pages / result.Paragraphs / result.Words
iter.GetText(PageIteratorLevel.Word)result.Words[i].Text
iter.GetConfidence(PageIteratorLevel.Word)result.Words[i].Confidence
iter.TryGetBoundingBox(PageIteratorLevel.Word, out bounds)word.X, word.Y, word.Width, word.Height
"eng+fra+deu" chaîne de langueocr.AddSecondaryLanguage(OcrLanguage.French)
Dossier Tessdata + fichiers .traineddataPaquet de langue NuGet (IronOcr.Languages.French)
Non applicable — nécessite PdfiumViewer ou un logiciel similaireinput.LoadPdf(path)
N/A — nécessite une bibliothèque de décryptageinput.LoadPdf(path, Password: "secret")
N/A — nécessite iText ou PDFSharpresult.SaveAsSearchablePdf(outputPath)
N/A — pipeline System.Drawing manuelinput.Deskew(), input.DeNoise(), input.Binarize()
N/A — moteur par thread dans Parallel.ForEachOrdre IronTesseract partagé par tous les threads
N/A — non pris en chargeocr.Configuration.ReadBarCodes = true

Problèmes de migration courants et solutions

Problème n° 1 : la référence au chemin d'accès Tessdata persiste après la migration

Tesseract : Les constantes TessDataPath, les gardiens Directory.Exists(TessDataPath) et les vérifications File.Exists(Path.Combine(TessDataPath, lang + ".traineddata")) apparaissent dans l'ensemble de la base de code et dans les fichiers de projet en tant qu'éléments de construction <Content Include="tessdata\**">.

Solution : Recherchez toutes les occurrences et supprimez-les ainsi que le dossier tessdata lui-même :

# Find all tessdata references in source
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .
grep -r "tessdata" --include="*.csproj" .
SHELL

Après avoir supprimé les constantes de chemin et les filtres de fichiers, supprimez le dossier tessdata du projet. Supprimez toutes les lignes <Content Include="tessdata\**" CopyToOutputDirectory="..." /> des fichiers .csproj. Les lignes COPY ./tessdata Dockerfile et les déclarations de variables d'environnement ENV TESSDATA_PREFIX sont également sûres à supprimer.

Problème n° 2 : le type d'objet Pix ne peut pas être résolu

Tesseract : Pix est un type de wrapper d'image Leptonica du namespace Tesseract. Les références apparaissent dans les déclarations de variables (using var img = Pix.LoadFromFile(...)), les signatures de méthode qui acceptent les paramètres Pix, et tout code qui appelle Pix.LoadFromMemory() ou Pix.LoadFromBitmap().

Solution : Remplacez Pix.LoadFromFile(path) par input.LoadImage(path) sur une instance OcrInput. Remplacez Pix.LoadFromMemory(bytes) par input.LoadImage(bytes). La classe OcrInput accepte les chemins de fichiers, les tableaux d'octets, les flux, et les objets System.Drawing.Bitmap directement. Aucune conversion vers un type wrapper intermédiaire n'est requise. Consultez le guide des entrées d'images et le guide des entrées de flux pour connaître l'ensemble complet des types d'entrées acceptés.

Problème n° 3 : le modèle de boucle ResultIterator n'a pas d'équivalent direct

Tesseract : Le code qui itère ResultIterator avec iter.Begin(), iter.Next(PageIteratorLevel.Word) et iter.TryGetBoundingBox() est le modèle standard pour l'extraction au niveau des mots ou des caractères. Ce modèle nécessite de suivre manuellement l'état de l'itérateur et les transitions de niveau.

Solution : Remplacez la boucle d'itérateur par LINQ sur result.Words, result.Pages ou le niveau de collection approprié :

// Before: iterator loop
using var iter = page.GetIterator();
iter.Begin();
do
{
    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
    {
        string text = iter.GetText(PageIteratorLevel.Word);
        // process text and bounds
    }
}
while (iter.Next(PageIteratorLevel.Word));

// After: enumerable collection
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
    // word.Text, word.X, word.Y, word.Width, word.Height, word.Confidence
}
C#

Pour un accès au niveau paragraphe — qui n'a pas d'analogue propre dans l'itérateur Tesseract — utilisez result.Pages[i].Paragraphs. Le guide des résultats de lecture documente tous les niveaux disponibles.

Problème n° 4 : le code de la bibliothèque PDF doit être entièrement supprimé

Tesseract : Tout code qui convertit des pages PDF en images avant de les passer à Tesseract — boucles document.Render() PdfiumViewer, appels Conversion.ToImage() PDFtoImage, motifs GetPageReader() Docnet.Core, ou invocations de processus GhostScript — existe uniquement pour contourner l'incapacité de Tesseract à ouvrir des PDF. Ces classes, boucles, modèles de fichiers temporaires et déploiements binaires natifs constituent tous une infrastructure autour de l'exigence réelle.

Solution : Supprimer entièrement le code de rendu PDF. Remplacez l'ensemble du bloc de rendu puis OCR par input.LoadPdf(path) :

// Before: ~50-150 lines of PdfiumViewer + Tesseract + temp file management
// After:
using var input = new OcrInput();
input.LoadPdf("document.pdf");
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
C#

Supprimez les références aux packages PdfiumViewer, PDFtoImage et Docnet.Core dans le .csproj. Supprimez les déploiements de binaires natifs (pdfium.dll, exécutables GhostScript) des scripts de construction et Dockerfiles. Le guide d'entrée PDF couvre la sélection de plages de pages et les PDF protégés par mot de passe.

Problème n° 5 : Modèle de moteur de traitement parallèle par thread

Tesseract : Le modèle standard pour un OCR parallèle sûr crée un nouveau TesseractEngine à l'intérieur du corps Parallel.ForEach car un seul moteur n'est pas sécurisé pour les threads. Cela charge le modèle linguistique complet par thread.

Solution : Créez IronTesseract une fois avant la boucle et référencez-le à l'intérieur :

// Before: engine per thread, 40-100 MB per language model, times thread count
Parallel.ForEach(files, file =>
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img    = Pix.LoadFromFile(file);
    using var page   = engine.Process(img);
    results[file] = page.GetText();
});

// After: single engine, thread-safe, shared pool
var ocr = new IronTesseract();
Parallel.ForEach(files, file =>
{
    var result = ocr.Read(file);
    results[file] = result.Text;
});
C#

La modification de la sécurité des threads élimine également le modèle de disposition using de l'intérieur du corps de la boucle, qui était nécessaire uniquement pour s'assurer que chaque moteur par thread était libéré rapidement.

Problème n° 6 : l'énumération EngineMode n'a pas de correspondance directe

Tesseract : EngineMode.Default, EngineMode.TesseractOnly et EngineMode.LstmOnly apparaissent dans les constructeurs TesseractEngine pour choisir si Tesseract utilise l'ancien moteur, LSTM, ou les deux. Le wrapper charlesw expose ces modes car Tesseract 4.x a conservé les deux moteurs.

Solution : IronOCR utilise exclusivement le moteur LSTM de Tesseract 5, qui est la configuration la plus précise. Aucun paramètre EngineMode n'existe parce qu'il n'y a pas d'ancien moteur sur lequel retomber. Supprimez l'argument EngineMode lors de la traduction de l'appel de constructeur. Pour l'ajustement du débit par rapport à la précision, utilisez ocr.Configuration.PageSegmentationMode et consultez le guide d'optimisation de vitesse.

Liste de contrôle pour la migration vers Tesseract

Pré-migration

Vérifier le code source pour toutes les références à Tesseract et tessdata :

# Find all using directives for the Tesseract namespace
grep -rn "using Tesseract" --include="*.cs" .

# Find TesseractEngine constructors
grep -rn "TesseractEngine\|TessDataPath\|tessdata" --include="*.cs" .

# Find Pix object usage
grep -rn "Pix\." --include="*.cs" .

# Find ResultIterator usage
grep -rn "GetIterator\|ResultIterator\|PageIteratorLevel" --include="*.cs" .

# Find PDF rendering libraries added for Tesseract
grep -rn "PdfiumViewer\|PDFtoImage\|Docnet\|GhostScript" --include="*.cs" .

# Find tessdata references in project files
grep -rn "tessdata\|traineddata" --include="*.csproj" .

# Find tessdata references in Dockerfiles
grep -rn "tessdata\|TESSDATA_PREFIX\|libtesseract" Dockerfile* .
SHELL

Résultats de l'inventaire pour estimer l'ampleur de la migration :

  • Comptez les fichiers avec using Tesseract pour déterminer combien de classes nécessitent des modifications
  • Identifiez quelle bibliothèque de rendu PDF est utilisée (PdfiumViewer, PDFtoImage, Docnet.Core, GhostScript)
  • Notez quelles langues sont référencées dans les chaînes de constructeur TesseractEngine pour déterminer quels paquets de langue NuGet IronOCR ajouter

Migration de code

  1. Supprimez la référence au paquet NuGet Tesseract de tous les fichiers .csproj
  2. Supprimer les références NuGet aux bibliothèques de rendu PDF ajoutées uniquement pour la prise en charge de Tesseract (PdfiumViewer, PDFtoImage, Docnet.Core)
  3. Installez le paquet NuGet IronOcr
  4. Installez les paquets de langue NuGet requis (IronOcr.Languages.French, etc.)
  5. Ajoutez IronOcr.License.LicenseKey = "YOUR-KEY"; au démarrage de l'application
  6. Remplacez using Tesseract; par using IronOcr; dans tous les fichiers affectés
  7. Supprimez les constantes TessDataPath et tous les gardiens tessdata Directory.Exists / File.Exists
  8. Remplacez new TesseractEngine(...) par new IronTesseract()
  9. Remplacez Pix.LoadFromFile(path) par input.LoadImage(path) sur une instance OcrInput
  10. Remplacez Pix.LoadFromMemory(bytes) par input.LoadImage(bytes)
  11. Remplacez engine.Process(img) par ocr.Read(input)
  12. Remplacez page.GetText() par result.Text
  13. Remplacez page.GetMeanConfidence() par result.Confidence
  14. Remplacez les boucles ResultIterator par l'énumération sur result.Words ou result.Pages[i].Paragraphs
  15. Remplacez les boucles de rendu PDF par input.LoadPdf(path) — supprimez entièrement le code de la bibliothèque de rendu
  16. Remplacez les chaînes de langue "eng+fra+deu" par les appels ocr.AddSecondaryLanguage(OcrLanguage.X)
  17. Supprimez le dossier tessdata et ses éléments de projet <Content Include="..."> build
  18. Supprimer les étapes de déploiement des binaires natifs des scripts de compilation et des fichiers Dockerfile (tessdata COPY, TESSDATA_PREFIX ENV, apt-get libtesseract-dev)

Après la migration

  • Vérifiez l'extraction de texte de base sur les mêmes images d'exemple que celles utilisées lors du développement avec le wrapper Tesseract
  • Vérifiez que les scores de confiance sont raisonnables (70 %+ pour les documents lisibles, 85 %+ pour les numérisations de haute qualité)
  • Testez si l'entrée TIFF multipages produit le nombre correct de pages dans result.Pages
  • Vérifier que l'entrée PDF lit les PDF numérisés sans nécessiter PdfiumViewer ni aucune bibliothèque externe
  • Testez la lecture de PDF protégés par mot de passe avec input.LoadPdf(path, Password: "...") contre un fichier chiffré connu
  • Vérifiez que le fichier PDF généré s'ouvre dans Adobe Reader et prend en charge la recherche de texte
  • Testez le traitement parallèle : créez une instance IronTesseract avant une boucle Parallel.ForEach et confirmez l'absence d'exceptions de sécurité des threads
  • Vérifier que chaque pack linguistique produit un résultat correct pour l'ensemble de documents de la langue cible
  • Exécutez la construction Docker sans COPY tessdata et apt-get libtesseract-dev — confirmez que le conteneur démarre et traite les documents
  • Vérifiez que le dossier tessdata et les fichiers DLL natifs sont absents du répertoire de sortie publié
  • Vérifiez qu'aucun TesseractException ou System.DllNotFoundException n'apparaît dans les journaux après avoir supprimé les références binaires natives

Principaux avantages de la migration vers IronOCR

Le déploiement se réduit à un seul paquet. Le dossier tessdata, les bibliothèques natives spécifiques à la plateforme (tesseract50.dll, leptonica-1.82.0.dll, libtesseract.so.5), et tous les binaires de rendu PDF natifs ont disparu de l'artefact de déploiement. L'ajout d'un nouvel environnement — un conteneur Linux, une fonction AWS Lambda, une machine de développement macOS — ne nécessite aucune étape de configuration spécifique à la plateforme. Les guides de déploiement Docker et Linux confirment la procédure : installer le paquet, ajouter la clé de licence, exécuter. Pas d'apt-get, pas de COPY, pas de variables d'environnement.

Les ajouts de langues prennent des secondes, pas des minutes. Ajouter le support de l'OCR espagnol passe de " télécharger spa.traineddata, placer dans le dossier tessdata, mettre à jour le manifeste de déploiement, vérifier le chemin dans le constructeur du moteur " à dotnet add package IronOcr.Languages.Spanish et ocr.AddSecondaryLanguage(OcrLanguage.Spanish). Ces deux étapes s'appliquent à toutes les plateformes. Les équipes prenant en charge plus de 10 langues — ce qui est courant dans les workflows de traitement de documents multinationaux — voient ainsi le temps de maintenance passer de plusieurs heures à quelques minutes pour une configuration unique. Parcourez le catalogue complet dans l'index des langues.

Les workflows PDF ne nécessitent aucune bibliothèque externe. Il n'est plus nécessaire de déployer et de maintenir les binaires natifs de PdfiumViewer, de gérer la version 32 ou 64 bits de pdfium.dll, de prendre en compte les considérations relatives à la licence AGPL de GhostScript, ni d'écrire des boucles de rendu page par page. input.LoadPdf() lit les PDF scannés, les PDF numériques, les PDF au contenu mixte, et les PDF protégés par mot de passe nativement. result.SaveAsSearchablePdf() produit un résultat consultable sans impliquer de bibliothèque secondaire. Le cycle complet — chargement d'un PDF numérisé, redressement et débruitage, OCR, enregistrement d'un fichier consultable — nécessite moins de 10 lignes de code. Consultez l'article de blog sur les PDF consultables pour découvrir les modèles de pipeline de production.

Le prétraitement est intégré, pas conçu par vous. Les environ 180 lignes de code de prétraitement manuel — matrice de couleur en niveaux de gris, amélioration du contraste par itération de pixels, suppression de bruit par filtre médian, redressement Hough-transform, mise à l'échelle DPI — deviennent une séquence d'appels de méthode en une ligne : input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize(). Pour la plupart des documents réels, la lecture par défaut applique un prétraitement automatique intelligent sans aucun appel de filtre explicite. Le guide de correction de la qualité d'image et le tutoriel sur les filtres d'image couvrent l'ensemble du catalogue de filtres.

La précision de Tesseract 5 est disponible immédiatement. Le wrapper charlesw est verrouillé sur Tesseract 4.1.1. IronOCR intègre un moteur LSTM Tesseract 5 optimisé sans aucune intervention de votre part. Les équipes qui ont constaté une perte de précision sur des types de documents difficiles (scans à faible résolution, fax, formulaires remplis à la main) bénéficient des améliorations de Tesseract 5 dès qu'elles changent de package. L'écart de précision est particulièrement notable sur les documents où la reconnaissance LSTM surpasse le moteur traditionnel, ce qui correspond à la majorité des charges de travail OCR réelles.

L'assistance commerciale remplace le dépannage communautaire. Le wrapper charlesw est un projet open source maintenu par la communauté, sans délais de réponse garantis ni SLA. IronOCR propose un support par e-mail, un support prioritaire pour les niveaux supérieurs et une base de code maintenue commercialement avec des mises à jour régulières de compatibilité .NET. Pour les équipes soumises à des accords de niveau de service (SLA) de production sur les pipelines de traitement de documents, ce modèle de prise en charge est essentiel. La page produit IronOCR et le centre de documentation couvrent l'ensemble des fonctionnalités et des options de déploiement.

Veuillez noter: Ghostscript, PDFium, PDFSharp, Tesseract, et iText sont des marques déposées de leurs propriétaires respectifs. Ce site n'est affilié, approuvé ou sponsorisé ni par Artifex Software, le Projet Chromium, Google, empira Software GmbH, ou iText Group. 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