Passer au contenu du pied de page
COMPARER à D'AUTRES COMPOSANTS

Tesseract C# vs IronOCR: Quelle bibliothèque OCR devriez-vous utiliser en .NET?

Si votre code source .NET Framework 4.5 exécute encore la couche OCR et que vous avez récemment découvert que le SDK Tesseract .NET de Patagames ne se compile pas avec .NET 6, .NET 8ou toute image Docker Linux, vous êtes arrivé au compromis exact examiné dans cet article. Tesseract .NET.SDK cible .NET Framework 2.0 à 4.5, fournit des binaires natifs uniquement pour Windows et facture une licence commerciale en plus du moteur Tesseract gratuit — une combinaison qui enferme les équipes dans un îlot d'infrastructure héritée de plus en plus restreint au moment précis où la plupart des organisations conteneurisent leurs charges de travail et mettent à niveau leurs environnements d'exécution.

Comprendre Tesseract .NET.SDK

Tesseract .NET.SDK est un wrapper .NET commercial autour du moteur OCR open-source Tesseract, vendu par Patagames. Le produit regroupe des binaires Tesseract précompilés pour Windows x86 et x64, enveloppe l'API C/C++ Tesseract dans une interface .NET gérée et distribue ce package via NuGet sous l'identifiant de package Tesseract.Net.SDK.

Ce produit a été conçu pour une époque où .NET Framework 4.5 était la norme de déploiement et Windows Server la seule cible. Cette époque est révolue pour la plupart des équipes, mais le SDK n'a pas suivi le rythme. La matrice de compatibilité officielle est la suivante : .NET Framework 2.0, 3.0, 3.5, 4.0 et 4.5. .NET Core, .NET Standard, .NET 5, .NET 6, .NET 7, .NET 8et .NET 9ne sont pas pris en charge. Linux n'est pas pris en charge. macOSn'est pas pris en charge. Les conteneurs Docker, qui exécutent presque exclusivement des images de base Linux, ne sont pas pris en charge.

Principales caractéristiques architecturales du kit de développement logiciel Tesseract .NET:

  • Cible d'exécution : .NET Framework 2.0-4.5exclusivement ; pas de .NET Core ni d'environnements d'exécution .NET modernes
  • Plateforme : Windows x86 et x64 uniquement ; Les appels P/Invoke vers les bibliothèques natives spécifiques à Windows lanceront DllNotFoundException sur tout hôte non Windows.
  • Gestion des données Tess : les langues ne sont pas incluses ; les développeurs téléchargent les fichiers .traineddata depuis le dépôt GitHub de Tesseract, les placent dans le dossier bin/tessdata/ et configurent l'action de génération de chaque fichier dans Visual Studio.
  • Sécurité des threads : les instances de OcrApi ne sont pas adaptées aux threads ; Les charges de travail parallèles nécessitent une instance de moteur par thread, chacune chargeant 40 à 100 Mo de données linguistiques en mémoire.
  • Prétraitement : aucun intégré ; Les images déformées, bruitées ou de faible résolution nécessitent une bibliothèque externe telle qu'OpenCV ou ImageMagick.
  • Entrée PDF : non prise en charge nativement ; Les développeurs installent une seconde bibliothèque, telle que PdfiumViewer, pour convertir les pages PDF en fichiers image temporaires avant la reconnaissance optique de caractères (OCR).
  • Développeur : Patagames est exploité par un développeur indépendant ; Il n'y a pas de SLA, pas de niveau de support Enterprise , et aucune redondance si le développeur devient indisponible.

Ciblage pratique du .NET Framework hérité

La limite stricte fixée par .NET Framework 4.5 n'est pas qu'une simple case à cocher ; elle influence toutes les décisions architecturales en aval. Un projet qui dépend de Tesseract.Net.SDK ne peut pas cibler <TargetFramework>net8.0</TargetFramework> dans son .csproj. Il ne peut pas être construit par un opérateur GitHub Actions en utilisant mcr.microsoft.com/dotnet/sdk:8.0. Il ne peut pas être déployé sur un pod Kubernetes exécutant un conteneur Linux. Dès que le reste de l'organisation franchit cette étape, le service de reconnaissance optique de caractères (OCR) devient orphelin.

Le code d'initialisation propre au SDK expose directement cette information. Le modèle d'utilisation de base dans tesseract-net-sdk-basic-ocr.cs inclut une protection explicite de la plateforme Windows :

// Install: Install-Package Tesseract.Net.SDK
// Platform: Windows ONLY (.NET Framework 2.0-4.5)
using Patagames.Ocr;

public string ExtractTextSimple(string imagePath)
{
    // Platform check — Tesseract.Net.SDK is Windows-only
    if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        throw new PlatformNotSupportedException(
            "Tesseract.Net.SDK only supports Windows.");
    }

    // Verify tessdata exists
    if (!Directory.Exists(@".\tessdata"))
    {
        throw new DirectoryNotFoundException(
            "tessdata folder not found. Download traineddata files from GitHub.");
    }

    using (var api = OcrApi.Create())
    {
        api.Init(Languages.English);       // loads eng.traineddata (~40 MB)
        return api.GetTextFromImage(imagePath);
    }
}
// Install: Install-Package Tesseract.Net.SDK
// Platform: Windows ONLY (.NET Framework 2.0-4.5)
using Patagames.Ocr;

public string ExtractTextSimple(string imagePath)
{
    // Platform check — Tesseract.Net.SDK is Windows-only
    if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        throw new PlatformNotSupportedException(
            "Tesseract.Net.SDK only supports Windows.");
    }

    // Verify tessdata exists
    if (!Directory.Exists(@".\tessdata"))
    {
        throw new DirectoryNotFoundException(
            "tessdata folder not found. Download traineddata files from GitHub.");
    }

    using (var api = OcrApi.Create())
    {
        api.Init(Languages.English);       // loads eng.traineddata (~40 MB)
        return api.GetTextFromImage(imagePath);
    }
}
Imports Patagames.Ocr
Imports System.Runtime.InteropServices
Imports System.IO

Public Function ExtractTextSimple(ByVal imagePath As String) As String
    ' Platform check — Tesseract.Net.SDK is Windows-only
    If Not RuntimeInformation.IsOSPlatform(OSPlatform.Windows) Then
        Throw New PlatformNotSupportedException("Tesseract.Net.SDK only supports Windows.")
    End If

    ' Verify tessdata exists
    If Not Directory.Exists(".\tessdata") Then
        Throw New DirectoryNotFoundException("tessdata folder not found. Download traineddata files from GitHub.")
    End If

    Using api = OcrApi.Create()
        api.Init(Languages.English) ' loads eng.traineddata (~40 MB)
        Return api.GetTextFromImage(imagePath)
    End Using
End Function
$vbLabelText   $csharpLabel

Deux contrôles de sécurité apparaissent avant chaque ligne de traitement OCR : confirmation Windows, confirmation tessdata. Sur tout système hôte non Windows, la méthode génère une exception avant d'atteindre le moteur. Sur toute machine où le dossier tessdata n'a pas été copié lors du déploiement, une autre exception est levée. Aucun de ces contrôles n'est standardisé ; tous deux représentent des modes de défaillance que les développeurs rencontrent en production.

Comprendre IronOCR

IronOCR est une bibliothèque OCR commerciale pour .NET construite autour d'un moteur Tesseract 5 optimisé avec prétraitement automatique des images, entrée PDF native et prise en charge multiplateforme sur Windows, Linux, macOS, Docker, Azure et AWS. Il est distribué sous forme d'un seul package NuGet , sans configuration de bibliothèque native externe, sans gestion du dossier tessdata et sans scripts de déploiement spécifiques à la plateforme.

Caractéristiques principales :

  • Prise en charge de l'environnement d'exécution : .NET Framework 4.6.2 et versions ultérieures, .NET Core 2.0 et versions ultérieures, .NET 5, 6, 7, 8 et 9 ; Un seul package binaire fonctionne sur tous les environnements d'exécution pris en charge.
  • Plateformes prises en charge : Windows x86/x64, Linux x64, macOS ; se déploie de manière identique sur les conteneurs Docker, Azure App Service, AWS Lambdaet les pods Kubernetes.
  • Prétraitement : Filtres intégrés — Deskew(), DeNoise(), Contrast(), Binarize(), EnhanceResolution(), Sharpen(), Rotate(), et plus — appliqués via l'objet OcrInput avant l'exécution du moteur
  • Entrée PDF : Natif ; input.LoadPdf() accepte les PDF scannés et numériques sans bibliothèque secondaire ; Les fichiers PDF protégés par mot de passe transmettent le mot de passe en tant que paramètre
  • Sortie PDF searchable : result.SaveAsSearchablePdf() convertit tout document scanné en un PDF textuellement searchable en un seul appel
  • Sécurité des threads : les instances de IronTesseract sont adaptées aux threads ; Une seule instance prend en charge tous les threads sans multiplier l'allocation de mémoire.
  • Prise en charge des langues : plus de 125 langues installées sous forme de packages NuGet distincts, téléchargés automatiquement lors de la première utilisation, aucun placement manuel de fichier requis.
  • Licences : Achat perpétuel unique à partir de $999 pour le niveau Lite ; no per-document or per-transaction billing

Comparaison des fonctionnalités

Fonction Tesseract.Net.SDK IronOCR
Prise en charge du .NET Framework 2.0–4.5 seulement 4.6.2+
.NET moderne (5/6/7/8/9) Non Oui
Déploiement de Windows Oui Oui
Déploiement Linux Non Oui
conteneurs Docker Non Oui
Entrée PDF (native) Non Oui
Prétraitement automatique Non Oui
Moteur à filetage sécurisé Non Oui

Comparaison détaillée des fonctionnalités

Fonction Tesseract.Net.SDK IronOCR
Compatibilité d'exécution
.NET Framework 2.0-4.5 Oui Non
.NET Framework 4.6.2+ Non Oui
.NET Core 2.x/3.x Non Oui
.NET 5 Non Oui
.NET 6 Non Oui
.NET 7 Non Oui
.NET 8 Non Oui
.NET 9 Non Oui
Support de la plateforme
Windows x86/x64 Oui Oui
Linux x64 Non Oui
macOS Non Oui
Docker (image Linux) Non Oui
Azure App Service (Linux) Non Oui
AWS Lambda Non Oui
Pod Kubernetes Non Oui
Sources d'entrée
Fichiers image (BMP, PNG, JPEG, TIFF) Oui Oui
Entrée PDF (native) Non Oui
PDF protégé par mot de passe Non Oui
Tableau d'octets / Flux Oui Oui
Prétraitement
Déclin Non (bibliothèque externe) Intégré
DeNoise Non (bibliothèque externe) Intégré
Amélioration du contraste Non (bibliothèque externe) Intégré
Binariser Non (bibliothèque externe) Intégré
Amélioration de la résolution Non (bibliothèque externe) Intégré
Sortir
Texte brut Oui Oui
PDF consultable Non Oui
Exportation hOCR Non Oui
Données structurées (mots, lignes, paragraphes avec coordonnées) Non Oui
score de confiance Oui (GetMeanConfidence()) Oui (result.Confidence)
Assistance linguistique
Nombre de langues 120+ (téléchargement manuel) 125+ (packs NuGet )
Téléchargement automatique de la langue Non Oui
Enfilage
instance de moteur thread-safe Non Oui
Traitement parallèle intégré Non Oui
Surcharge mémoire par thread ~40 à 100 Mo par moteur instance unique partagée
Licence
Modèle de licence Commercial à usage unique perpétuel à usage unique
Prix ​​d'entrée ~20 à 50 $ $999
Facturation par document Non Non
Support Enterprise / SLA Non Oui

Compatibilité des versions .NET et de l'environnement d'exécution

La différence la plus importante entre ces deux bibliothèques ne réside pas dans la conception ou la précision de l'API, mais dans sa compatibilité d'exécution.

Approche Tesseract .NET.SDK

Le kit de développement logiciel (SDK) Tesseract .NET cible les versions 2.0 à 4.5 du .NET Framework . Chaque projet qui en dépend doit lui-même cibler l'une de ces versions du framework. Le fichier de comparaison des migrations confirme cette contrainte dans la section configuration :

// Install: Install-Package Tesseract.Net.SDK
// License: Commercial (Patagames)
// Platform: Windows ONLY (.NET Framework 2.0-4.5)
//
// Requirements:
//   - tessdata folder must exist in bin/Debug/or bin/Release/
//   - Download traineddata files from https://github.com/tesseract-ocr/tessdata
//   - Windows operating system (no Linux/macOS support)

using Patagames.Ocr;

// Multi-language setup — all traineddata files must be manually downloaded
using (var api = OcrApi.Create())
{
    // Combine languages with bitwise OR
    api.Init(Languages.English | Languages.German | Languages.French);

    string text = api.GetTextFromImage(imagePath);
    return text;
}
// Install: Install-Package Tesseract.Net.SDK
// License: Commercial (Patagames)
// Platform: Windows ONLY (.NET Framework 2.0-4.5)
//
// Requirements:
//   - tessdata folder must exist in bin/Debug/or bin/Release/
//   - Download traineddata files from https://github.com/tesseract-ocr/tessdata
//   - Windows operating system (no Linux/macOS support)

using Patagames.Ocr;

// Multi-language setup — all traineddata files must be manually downloaded
using (var api = OcrApi.Create())
{
    // Combine languages with bitwise OR
    api.Init(Languages.English | Languages.German | Languages.French);

    string text = api.GetTextFromImage(imagePath);
    return text;
}
Imports Patagames.Ocr

' Install: Install-Package Tesseract.Net.SDK
' License: Commercial (Patagames)
' Platform: Windows ONLY (.NET Framework 2.0-4.5)
'
' Requirements:
'   - tessdata folder must exist in bin/Debug/or bin/Release/
'   - Download traineddata files from https://github.com/tesseract-ocr/tessdata
'   - Windows operating system (no Linux/macOS support)

' Multi-language setup — all traineddata files must be manually downloaded
Using api = OcrApi.Create()
    ' Combine languages with bitwise OR
    api.Init(Languages.English Or Languages.German Or Languages.French)

    Dim text As String = api.GetTextFromImage(imagePath)
    Return text
End Using
$vbLabelText   $csharpLabel

Le modèle using (var api = OcrApi.Create()) est idiomatique pour .NET Framework 2.0. Il utilise l'instruction using de C# 1.0 plutôt que la déclaration using var de C# 8.0. L'espace de noms est Patagames.Ocr. Cette combinaison de langages utilise un OU binaire sur une énumération. Aucun de ce code ne compile pour une cible net6.0 ou net8.0 dans un fichier de projet de style SDK, car Tesseract.Net.SDK lui-même ne produit pas un assembly compatible.

Les équipes bloquées sur .NET Framework 4.5 ne le sont pas par choix. Elles sont là parce que les dépendances — incluant parfois une bibliothèque OCR — ne peuvent pas être mises à jour. Choisir Tesseract .NET.SDK renforce cette chaîne de dépendances.

Approche d'IronOCR

IronOCR prend en charge .NET Framework 4.6.2 et tous les environnements d'exécution .NET modernes jusqu'à .NET 9. Le même package binaire fonctionne sur tous. La mise à niveau d'un projet de .NET Framework 4.8 vers .NET 8ne nécessite pas le remplacement de la bibliothèque OCR.

// Works on .NET Framework 4.6.2, .NET Core, .NET 5/6/7/8/9
// Same NuGet package, same API, same results
using IronOcr;

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

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.German);
ocr.AddSecondaryLanguage(OcrLanguage.French);

var result = ocr.Read("document.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
// Works on .NET Framework 4.6.2, .NET Core, .NET 5/6/7/8/9
// Same NuGet package, same API, same results
using IronOcr;

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

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
ocr.AddSecondaryLanguage(OcrLanguage.German);
ocr.AddSecondaryLanguage(OcrLanguage.French);

var result = ocr.Read("document.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

' Works on .NET Framework 4.6.2, .NET Core, .NET 5/6/7/8/9
' Same NuGet package, same API, same results

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

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English
ocr.AddSecondaryLanguage(OcrLanguage.German)
ocr.AddSecondaryLanguage(OcrLanguage.French)

Dim result = ocr.Read("document.jpg")
Console.WriteLine(result.Text)
Console.WriteLine($"Confidence: {result.Confidence}%")
$vbLabelText   $csharpLabel

Pas d'opération OU bit à bit sur les énumérations de langage. Aucun dossier tessdata. Aucune vérification de plateforme. Le guide d'installation d'IronTesseract regroupe dans un seul document les options de configuration pour tous les environnements d'exécution pris en charge.

Conséquence pratique pour les équipes en pleine migration : un projet ASP.NET Core 8 et un projet .NET Framework 4.8 existant peuvent partager la même couche de service IronOCR . Pas de compilation conditionnelle, pas de versions de bibliothèques séparées, pas de couche d'abstraction pour masquer les API incompatibles.

Couverture de la plateforme et déploiement de conteneurs

Approche Tesseract .NET.SDK

Tesseract .NET.SDK fournit des binaires natifs Windows x86 et x64. Les appels P/Invoke qui initialisent le moteur Tesseract font référence à ces DLL Windows. Sur un hôte Linux - incluant tout conteneur Docker basé sur mcr.microsoft.com/dotnet/aspnet:8.0, ubuntu, ou alpine - la DLL ne peut pas être chargée, et l'application lance DllNotFoundException à l'exécution.

L'exemple de traitement parallèle de tesseract-net-sdk-pdf-processing.cs illustre ce que cela signifie pour les charges de travail par lots sur Windows lui-même avant même de considérer Linux :

// Windows-only: Parallel.ForEach with separate engine per thread
// Each engine loads ~40-100 MB per language
Parallel.ForEach(
    imagePaths,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    imagePath =>
    {
        // WARNING: Must create separate OcrApi for each thread!
        // Memory usage: 4 threads × 100MB = 400MB minimum
        using (var api = OcrApi.Create())
        {
            api.Init(Languages.English);
            string text = api.GetTextFromImage(imagePath);
            results[imagePath] = text;
        }
    });
// Windows-only: Parallel.ForEach with separate engine per thread
// Each engine loads ~40-100 MB per language
Parallel.ForEach(
    imagePaths,
    new ParallelOptions { MaxDegreeOfParallelism = 4 },
    imagePath =>
    {
        // WARNING: Must create separate OcrApi for each thread!
        // Memory usage: 4 threads × 100MB = 400MB minimum
        using (var api = OcrApi.Create())
        {
            api.Init(Languages.English);
            string text = api.GetTextFromImage(imagePath);
            results[imagePath] = text;
        }
    });
$vbLabelText   $csharpLabel

Quatre threads parallèles, quatre instances du moteur, 400 Mo de données linguistiques chargées simultanément — et ce, rien que pour l'anglais. Ajoutez l'allemand et le français, et ce chiffre de base double. Le SDK ne propose aucun mécanisme de mise en commun pour atténuer ce problème. Cette architecture est incompatible avec les limites de ressources des conteneurs modernes, qui imposent généralement des plafonds de mémoire par pod.

Il n'existe par ailleurs aucun accès à Azure Functions sur un plan de consommation Linux, aucun accès à AWS Lambda(qui fonctionne sur Amazon Linux) et aucun accès à Google Cloud Run. Toutes les principales plateformes serverless utilisent Linux par défaut. Tesseract .NET.SDK est exclu de tous ces cas intentionnellement.

Approche d'IronOCR

IronOCR se déploie sur Docker sans configuration supplémentaire autre qu'une seule ligne apt-get pour libgdiplus sur les images basées sur Debian. Le guide de déploiement Docker couvre à la fois les conteneurs Linux et Windows. Il en va de même pour les déploiements Linux , Azure et AWS .

La sécurité des threads est intégrée dans IronTesseract. Une seule instance dessert tous les travailleurs parallèles :

// Cross-platform: Windows, Linux, macOS, Docker
// Single instance — thread-safe
using IronOcr;

var ocr = new IronTesseract();

// Single engine instance shared across all threads
// Non memory multiplication
Parallel.ForEach(imagePaths, imagePath =>
{
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    var result = ocr.Read(input);
    SaveResult(imagePath, result.Text);
});
// Cross-platform: Windows, Linux, macOS, Docker
// Single instance — thread-safe
using IronOcr;

var ocr = new IronTesseract();

// Single engine instance shared across all threads
// Non memory multiplication
Parallel.ForEach(imagePaths, imagePath =>
{
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    var result = ocr.Read(input);
    SaveResult(imagePath, result.Text);
});
Imports IronOcr

' Cross-platform: Windows, Linux, macOS, Docker
' Single instance — thread-safe
Dim ocr As New IronTesseract()

' Single engine instance shared across all threads
' Non memory multiplication
Parallel.ForEach(imagePaths, Sub(imagePath)
    Using input As New OcrInput()
        input.LoadImage(imagePath)
        Dim result = ocr.Read(input)
        SaveResult(imagePath, result.Text)
    End Using
End Sub)
$vbLabelText   $csharpLabel

Quatre threads, une instance de moteur, une copie des données linguistiques en mémoire. Pour un exemple de multithreading avec des benchmarks de débit, la documentation IronOCR couvre en détail les options de configuration.

Traitement de PDF

Approche Tesseract .NET.SDK

Tesseract .NET.SDK ne prend pas en charge le format PDF. Le fichier tesseract-net-sdk-pdf-processing.cs est franc à propos de cette limitation dans son en-tête :

// LIMITATION CRITIQUE :
// Tesseract .NET.SDK ne prend PAS en charge nativement l&#39;entrée PDF.
// Vous devez d&#39;abord utiliser une bibliothèque distincte pour convertir les pages PDF en images.
// Cet exemple utilise PdfiumViewer, mais d&#39;autres options existent :
// - iTextSharp
// - Ghostscript .NET
// - Docnet.Core

Le résultat est un pipeline multi-bibliothèque. Installez PdfiumViewer. Rendez chaque page PDF en Bitmap à 200–300 DPI. Écrivez ce bitmap dans un fichier temporaire. Exécutez api.GetTextFromImage() sur le fichier temporaire. Supprimez le fichier temporaire. Répétez pour chaque page. Mettre en œuvre une gestion des erreurs pour les échecs partiels en cours de document. Gérez la mémoire explicitement — l'exemple ProcessLargeTiff force GC.Collect() tous les dix pages pour éviter les erreurs de mémoire insuffisante sur les documents volumineux.

Il s'agit du code de production réel, et non d'un exemple simplifié. Il fonctionne uniquement sous Windows, uniquement sur .NET Framework, et il nécessite une seconde dépendance commerciale ou open source qui requiert elle-même une gestion du déploiement.

Approche d'IronOCR

IronOCR lit les fichiers PDF nativement. Pas de bibliothèque secondaire, pas de fichiers temporaires, pas de boucle de rendu de page :

// Native PDF OCR — no PdfiumViewer, no temp files
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");   // native PDF support
var result = ocr.Read(input);

// Access page-by-page results
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}

// Or produce a searchable PDF output
result.SaveAsSearchablePdf("searchable-report.pdf");
// Native PDF OCR — no PdfiumViewer, no temp files
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("scanned-report.pdf");   // native PDF support
var result = ocr.Read(input);

// Access page-by-page results
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}

// Or produce a searchable PDF output
result.SaveAsSearchablePdf("searchable-report.pdf");
Imports IronOcr

Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadPdf("scanned-report.pdf") ' native PDF support
    Dim result = ocr.Read(input)

    ' Access page-by-page results
    For Each page In result.Pages
        Console.WriteLine($"Page {page.PageNumber}: {page.Text}")
    Next

    ' Or produce a searchable PDF output
    result.SaveAsSearchablePdf("searchable-report.pdf")
End Using
$vbLabelText   $csharpLabel

Les PDF protégés par mot de passe nécessitent un paramètre supplémentaire : input.LoadPdf("encrypted.pdf", Password: "secret"). Des plages de pages spécifiques utilisent input.LoadPdfPages("document.pdf", 1, 10). Le guide de saisie PDF et le tutoriel PDF consultable couvrent toutes les variantes.

L' exemple de reconnaissance optique de caractères (OCR) de PDF illustre le modèle complet, y compris le contrôle de confiance et la sortie structurée. L' exemple de PDF consultable illustre le cas d'utilisation de l'archivage de documents où les PDF numérisés sont indexés et consultables.

Prétraitement d'images et qualité des documents en situation réelle

Approche Tesseract .NET.SDK

Les moteurs Tesseract sont sensibles à la qualité de l'image. Les documents déformés, de faible résolution ou bruités produisent un résultat considérablement dégradé sans prétraitement. Tesseract .NET.SDK n'en propose aucun.

Le fichier de comparaison des migrations quantifie directement l'écart :

// Tesseract.Net.SDK: Non preprocessing available
// Direct OCR on problematic image = garbage output
using (var api = OcrApi.Create())
{
    api.Init(Languages.English);

    // Direct OCR on problematic image — poor results
    string text = api.GetTextFromImage(imagePath);
    return text;

    // To preprocess, you need:
    // 1. Install Emgu CV or OpenCvSharp
    // 2. Implement Hough transform for skew detection
    // 3. Implement affine rotation for deskew
    // 4. Implement FastNlMeansDenoising for noise reduction
    // 5. Handle all the native OpenCV dependencies
    // This is often 200+ lines of code
}
// Tesseract.Net.SDK: Non preprocessing available
// Direct OCR on problematic image = garbage output
using (var api = OcrApi.Create())
{
    api.Init(Languages.English);

    // Direct OCR on problematic image — poor results
    string text = api.GetTextFromImage(imagePath);
    return text;

    // To preprocess, you need:
    // 1. Install Emgu CV or OpenCvSharp
    // 2. Implement Hough transform for skew detection
    // 3. Implement affine rotation for deskew
    // 4. Implement FastNlMeansDenoising for noise reduction
    // 5. Handle all the native OpenCV dependencies
    // This is often 200+ lines of code
}
Imports Tesseract.Net.SDK

' Tesseract.Net.SDK: Non preprocessing available
' Direct OCR on problematic image = garbage output
Using api = OcrApi.Create()
    api.Init(Languages.English)

    ' Direct OCR on problematic image — poor results
    Dim text As String = api.GetTextFromImage(imagePath)
    Return text

    ' To preprocess, you need:
    ' 1. Install Emgu CV or OpenCvSharp
    ' 2. Implement Hough transform for skew detection
    ' 3. Implement affine rotation for deskew
    ' 4. Implement FastNlMeansDenoising for noise reduction
    ' 5. Handle all the native OpenCV dependencies
    ' This is often 200+ lines of code
End Using
$vbLabelText   $csharpLabel

Ce commentaire n'est pas une hyperbole. Une implémentation de correction de l'angle de qualité professionnelle utilisant OpenCV dans .NET comprend 100 à 200 lignes d'initialisation, de détection d'angle, de calcul matriciel et de transformation affine. Ce code doit ensuite être testé, maintenu et déployé — avec sa propre chaîne de dépendances native qui, là encore, ne fonctionne que sous Windows.

Approche d'IronOCR

IronOCR regroupe le prétraitement comme des méthodes API de premier ordre sur OcrInput. Les mêmes opérations qui nécessitent une intégration OpenCV dans Tesseract .NET.SDK sont ici de simples appels de méthode :

// Intégré preprocessing — no external library required
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("skewed-invoice-scan.jpg");

input.Deskew();               // automatic angle detection and correction
input.DeNoise();              // scanner artifact removal
input.Contrast();             // contrast enhancement
input.Binarize();             // optimal threshold conversion
input.EnhanceResolution(300); // scale low-DPI images to 300 DPI

var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// Intégré preprocessing — no external library required
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("skewed-invoice-scan.jpg");

input.Deskew();               // automatic angle detection and correction
input.DeNoise();              // scanner artifact removal
input.Contrast();             // contrast enhancement
input.Binarize();             // optimal threshold conversion
input.EnhanceResolution(300); // scale low-DPI images to 300 DPI

var result = ocr.Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadImage("skewed-invoice-scan.jpg")

    input.Deskew()               ' automatic angle detection and correction
    input.DeNoise()              ' scanner artifact removal
    input.Contrast()             ' contrast enhancement
    input.Binarize()             ' optimal threshold conversion
    input.EnhanceResolution(300) ' scale low-DPI images to 300 DPI

    Dim result = ocr.Read(input)
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
$vbLabelText   $csharpLabel

Le guide de correction de la qualité d'image et le guide de correction des couleurs d'image documentent tous les filtres disponibles avec des comparaisons de précision avant/après. L' exemple de numérisation de faible qualité illustre les chiffres d'amélioration de la précision pour des conditions de documents typiques du monde réel.

Concernant plus particulièrement les flux de travail relatifs aux documents numérisés, le guide de traitement des documents numérisés aborde la détection de l'orientation, la gestion des documents multipages et l'optimisation du débit par lots dans un seul article.

Référence de mappage d'API

Tesseract.Net.SDK Équivalent d'IronOCR Notes
Install-Package Tesseract.Net.SDK dotnet add package IronOcr IronOCR prend en charge tous les environnements d'exécution modernes.
using Patagames.Ocr; using IronOcr;
OcrApi.Create() new IronTesseract() IronTesseract est compatible avec les threads ; une instance par application
api.Init(Languages.English) ocr.Language = OcrLanguage.English IronOCR utilise l'affectation de propriété, et non l'appel de méthode.
api.Init(Languages.English \N-)| Langues.Allemand) ocr.AddSecondaryLanguage(OcrLanguage.German) Aucune opération OU bit à bit requise
api.GetTextFromImage(path) ocr.Read("path.jpg").Text Chaînez directement ou utilisez OcrInput
OcrImage.FromFile(path) new OcrInput("path.jpg") OcrInput accepte les fichiers, les flux, les tableaux d'octets, les URL et les bitmaps.
OcrImage.FromBitmap(bmp) input.LoadImage(bitmap)
api.SetImage(img) ; api.GetText() ocr.Read(input).Text OcrInput est l'équivalent de SetImage
api.GetMeanConfidence() result.Confidence Renvoie l'objet résultat
api.SetRectangle(x, y, w, h) new CropRectangle(x, y, w, h) passé à input.LoadImage() Guide OCR par région
api.SetVariable("tessedit_char_whitelist", x) ocr.Configuration.WhiteListCharacters = x
api.SetVariable("tessedit_char_blacklist", x) ocr.Configuration.BlackListCharacters = x
(no PDF support) input.LoadPdf("file.pdf") Aucune bibliothèque secondaire requise
(no preprocessing) input.Deskew() ; input.DeNoise(); etc. Tout le prétraitement intégré
(no structured output) result.Words, result.Lines, result.Pages Coordonnées et niveau de confiance au niveau du mot
(no searchable PDF) result.SaveAsSearchablePdf("out.pdf") Sortie PDF consultable en un seul appel

Lorsque les équipes envisagent de passer de Tesseract .NET.SDK à IronOCR

La mise à niveau .NET provoque ce problème

Le déclencheur le plus fréquent n'est pas l'insatisfaction quant à la qualité de la reconnaissance optique de caractères (OCR), mais une mise à niveau planifiée du .NET Framework qui se bloque au niveau de la couche OCR. Une équipe qui met à niveau une application de gestion de documents de .NET Framework 4.7 à .NET 8découvre que Tesseract.Net.SDK ne produit aucun assembly-cible compatible. La mise à niveau se bloque ou le service OCR est isolé dans un processus distinct fonctionnant uniquement sous Windows et communiquant via HTTP, ce qui introduit un saut réseau, un artefact de déploiement distinct et une couche de compatibilité qui doit être maintenue indéfiniment. Aucune de ces solutions n'est acceptable pour la plupart des équipes engagées dans un processus de mise à niveau. Le remplacement de Tesseract .NET.SDK par IronOCR supprime l'obstacle et permet une mise à niveau sans problème, car IronOCR fonctionne simultanément sur l'ancien .NET Framework 4.6.2+et la nouvelle cible .NET 8, ce qui signifie que le service peut être migré progressivement.

Conteneurisation du pipeline de traitement

Les charges de travail de traitement de documents font partie des premières candidates à la conteneurisation : elles sont sans état, limitées par le processeur et bénéficient d'une mise à l'échelle horizontale. Une équipe qui a conteneurisé le reste de son pipeline découvre que Tesseract .NET.SDK échoue lors de l'étape de création de l'image Docker lorsque l'image de base est Linux. Les options sont soit des conteneurs Windows — qui impliquent un coût de licence, des tailles d'image plus importantes et une incompatibilité avec la plupart des services Kubernetes gérés qui utilisent par défaut des pools de nœuds Linux — soit une bibliothèque qui prend réellement en charge Linux. IronOCR se déploie sur n'importe quel conteneur Linux doté d'un Dockerfile standard. Le guide de déploiement Docker fournit la configuration Dockerfile exacte pour les images de base Debian et Alpine.

Traitement par lots parallèle à grande échelle

Un pipeline de traitement de factures gérant 50 000 documents par jour avec quatre processus parallèles utilisant Tesseract .NET.SDK alloue un minimum de 400 Mo rien que pour les quatre instances du moteur chargées de données en anglais. Ajoutez une deuxième langue et cela double. Ajoutez un prétraitement via OpenCV et la consommation de mémoire augmente encore. Sur un serveur aux ressources limitées ou dans un déploiement conteneurisé avec une limite de mémoire de 2 Go par pod, ce calcul devient un obstacle au déploiement. Le modèle à instance unique et sécurisé pour les threads d'IronOCR élimine la multiplication de la mémoire par thread. Une instance de moteur gère quatre, huit ou seize processus parallèles avec un seul modèle de langage chargé une seule fois. L' exemple de multithreading illustre la configuration.

Flux de travail natifs PDF sans dépendance secondaire

Les organisations qui reçoivent des documents principalement au format PDF (demandes d'indemnisation, contrats, factures, formulaires fiscaux) sont confrontées à un problème complexe avec Tesseract .NET.SDK : elles doivent maintenir une bibliothèque de rendu PDF en plus de la bibliothèque OCR. Lorsque PdfiumViewer ou iText publie un correctif de sécurité, les deux bibliothèques nécessitent des mises à jour coordonnées et des tests de régression. Lorsque la bibliothèque PDF présente un bug lors du rendu d'une version PDF spécifique, le pipeline OCR produit du texte illisible sans cause apparente. La prise en charge native du format PDF par IronOCR réduit cette pile de deux bibliothèques à une seule. L'installation d'un seul package remplace les deux. La page de cas d'utilisation de la reconnaissance optique de caractères (OCR) pour les PDF décrit le flux de travail complet.

Exigences de déploiement en Enterprise

La licence Patagames pour Tesseract .NET.SDK inclut une assistance par e-mail et sur forum assurée par un seul développeur. Il n'y a pas de SLA, pas de délai de réponse garanti et pas de procédure d'escalade. Pour les applications dans les secteurs réglementés (santé, finance, gouvernement), les équipes d'approvisionnement exigent de plus en plus que les fournisseurs de logiciels fournissent des SLA documentés, des processus de divulgation de sécurité et des garanties de continuité organisationnelle. Patagames, tel qu'exploité par un développeur indépendant, ne peut satisfaire à ces exigences. IronOCR est développé par Iron Software, une entité commerciale disposant d'un support dédié, de processus de sécurité et de conditions de licence compatibles avec les exigences d'approvisionnement des Enterprise . La page relative aux licences documente les niveaux de support disponibles.

Considérations courantes en matière de migration

Modèle d'espace de noms et d'instance

La modification du code entre Tesseract .NET.SDK et IronOCR est superficielle. Remplacez using Patagames.Ocr; par using IronOcr;. Remplacez OcrApi.Create() par new IronTesseract(). Remplacez api.Init(Languages.English) par ocr.Language = OcrLanguage.English. La logique fonctionnelle du code appelant reste inchangée. Une migration simple d'extraction de données peut être effectuée en moins d'une heure.

// Before: Tesseract.Net.SDK
using Patagames.Ocr;

using (var api = OcrApi.Create())
{
    api.Init(Languages.English);
    return api.GetTextFromImage(imagePath);
}

// After: IronOCR
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
// Before: Tesseract.Net.SDK
using Patagames.Ocr;

using (var api = OcrApi.Create())
{
    api.Init(Languages.English);
    return api.GetTextFromImage(imagePath);
}

// After: IronOCR
using IronOcr;

var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
Imports Patagames.Ocr

Using api = OcrApi.Create()
    api.Init(Languages.English)
    Return api.GetTextFromImage(imagePath)
End Using

Imports IronOcr

Dim ocr As New IronTesseract()
Using input As New OcrInput()
    input.LoadImage(imagePath)
    Return ocr.Read(input).Text
End Using
$vbLabelText   $csharpLabel

Le tutoriel de lecture de texte à partir d'images et l'exemple OCR de base fournissent des exemples complets et exécutables avec validation des entrées et vérification de la fiabilité.

Suppression du dossier Tessdata

Après la migration, le dossier tessdata/ complet peut être supprimé du projet. IronOCR intègre les données linguistiques dans ses packages NuGet . Supprimez toutes les références .traineddata du .csproj, supprimez le répertoire tessdata des scripts de déploiement et supprimez toutes les étapes du pipeline CI/CD qui copient des fichiers traineddata. Les packages NuGet IronOcr.Languages.* installent les données linguistiques dans le cadre de l'étape normale de restauration du package - pas de téléchargement séparé, pas de configuration manuelle de dossier, pas de paramètres d'action de génération dans Visual Studio. Le guide multilingue couvre l'installation des packs de langue.

Simplification du pipeline PDF

Tout code ayant installé PdfiumViewer, iText ou Ghostscript.NET dans le but de rendre des pages PDF avant l'OCR peut être supprimé entièrement. Remplacez l'ensemble du pipeline multi-étapes render-to-temp-file-then-OCR par input.LoadPdf(pdfPath). Effectuez des tests spécifiques pour les PDF protégés par mot de passe, les plages de pages spécifiques et les documents volumineux de plus de 100 pages — ce sont les cas limites les plus susceptibles de faire apparaître des différences de comportement lors de la validation.

Modèle de thread et durée de vie de l'instance

Le code Tesseract.Net.SDK crée généralement une instance OcrApi par requête ou par thread pour éviter les problèmes de sécurité des threads. IronOCR est sécurisé pour les threads, donc l'instance IronTesseract doit être créée une seule fois (au démarrage de l'application ou en tant que singleton dans un conteneur DI) et réutilisée pour toutes les requêtes. Créer un nouveau IronTesseract() par requête gaspille le surcoût d'initialisation. Enregistrez-le en tant que singleton dans le conteneur de services d' ASP.NET Core et injectez-le là où c'est nécessaire.

Fonctionnalités supplémentaires d'IronOCR

Au-delà des fonctionnalités comparées ci-dessus, IronOCR offre des fonctionnalités absentes du kit de développement logiciel Tesseract .NET:

Compatibilité .NET et préparation à l'avenir

IronOCR prend en charge .NET Framework 4.6.2 jusqu'à la version actuelle de .NET 9et continuera à prendre en charge les futures versions de .NET au fur et à mesure de leur sortie. La bibliothèque cible netstandard2.0 pour une large compatibilité du framework et fournit des binaires natifs spécifiques à la plateforme pour Windows, Linux et macOSau sein du même package NuGet. Les équipes qui passent de .NET Framework à .NET 8ou .NET 9n'ont pas besoin de changer la bibliothèque OCR — la même référence de package IronOcr compile et s'exécute sur les deux. Tesseract .NET.SDK cible .NET Framework 2.0 à 4.5 et ne dispose d'aucune feuille de route publiée pour la prise en charge des versions modernes de .NET ; Sa structure est incompatible avec le rythme de publication actuel de Microsoft .NET , qui prévoit la sortie d'une nouvelle version majeure chaque année en novembre. Toute équipe qui prévoit de passer à une version supérieure à .NET Framework 4.5 — que ce soit dans six mois ou dans trois ans — devra remplacer Tesseract .NET.SDK à ce stade de transition, quels que soient les autres critères d'évaluation.

Conclusion

Tesseract .NET.SDK occupe un créneau spécifique et en déclin : c'est le choix idéal pour une équipe qui s'engage en permanence dans le déploiement sur Windows Server, .NET Framework 4.5 et qui a prévu de consacrer 15 à 40 heures de temps de développement à la configuration de tessdata, à la mise en œuvre du prétraitement en externe et à la construction d'un pipeline de rendu PDF à partir d'une bibliothèque distincte. Le coût ne se limite pas aux frais de licence. Le coût englobe tout ce qui l'entoure.

Le problème évoqué en introduction de cet article — la découverte en cours de mise à niveau qu'une dépendance OCR ne peut pas cibler .NET 8— n'est pas un cas isolé. C'est le résultat prévisible du choix d'une bibliothèque qui ne prend pas explicitement en charge les environnements d'exécution .NET modernes. IronOCR supprime entièrement cette contrainte : un seul package NuGet cible tous les environnements d'exécution de .NET Framework 4.6.2 à .NET 9, fonctionne sous Windows, Linux, macOSet Docker, et inclut le prétraitement et la prise en charge des PDF qui nécessiteraient autrement deux dépendances supplémentaires et des centaines de lignes de code d'intégration.

Pour les équipes utilisant actuellement Tesseract .NET.SDK dans une application .NET Framework 4.5 stable sans projet de modernisation de l'environnement d'exécution, le statu quo reste inchangé jusqu'à ce qu'une obligation de conteneurisation, une migration vers Linux ou une mise à niveau du framework impose cette modification. Pour les équipes qui modernisent activement leurs systèmes (conteneurisation des services, adoption de .NET 8, migration vers une infrastructure Linux ou mise à l'échelle des pipelines de traitement par lots de documents), le kit de développement logiciel Tesseract .NET est un obstacle, et non une base. Le passage de l'ancienne API à IronOCR ne nécessite que quelques heures de modifications de code. L'alternative consiste à maintenir indéfiniment un service exclusivement Windows, orphelin et marginal, au sein d'une architecture par ailleurs modernisée.

Le coût de la licence IronOCR est supérieur à celui du kit de développement logiciel Patagames, mais la véritable comparaison des coûts doit inclure les 15 à 40 heures de configuration de tessdata, l'intégration de bibliothèques de prétraitement externes et l'assemblage du pipeline de rendu PDF que Tesseract .NET.SDK exige avant le traitement d'un seul document en production. Ces frais de configuration sont documentés dans la comparaison ci-dessus et ne diminuent pas à mesure que l'équipe s'agrandit ou que le volume de documents augmente.

Veuillez noterGhostscript, PDFium, 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 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.

Questions Fréquemment Posées

Qu'est-ce que Tesseract .NET SDK (officiel) ?

Tesseract .NET SDK (officiel) est une solution OCR utilisée par les développeurs et les entreprises pour extraire du texte d'images et de documents. Il s'agit de l'une des options d'OCR évaluées avec IronOCR pour le développement d'applications .NET.

Comment IronOCR se compare-t-il à Tesseract .NET SDK (official) pour les développeurs .NET ?

IronOCR est une bibliothèque OCR .NET native de NuGet qui utilise IronTesseract comme moteur de base. Par rapport au SDK .NET de Tesseract (officiel), elle offre un déploiement plus simple (pas d'installateurs SDK), un prix forfaitaire et une API C# propre sans interopérabilité COM ni dépendances cloud.

IronOCR est-il plus facile à installer que Tesseract .NET SDK (officiel) ?

IronOCR s'installe via un seul package NuGet. Il n'y a pas d'installateur SDK, de fichiers de licence à copier, de composants COM à enregistrer ou de binaires d'exécution séparés à gérer. L'ensemble du moteur d'OCR est inclus dans le package.

Quelles sont les différences de précision entre Tesseract .NET SDK (officiel) et IronOCR for .NET ?

IronOcr atteint une grande précision de reconnaissance pour les documents commerciaux standard, les factures, les reçus et les formulaires numérisés. Pour les documents très dégradés ou les scripts peu courants, la précision varie en fonction de la qualité de la source. IronOCR comprend des filtres de prétraitement d'image pour améliorer la reconnaissance sur des entrées de faible qualité.

IronOCR prend-il en charge l'extraction de texte au format PDF ?

Oui. IronOCR extrait le texte des PDF natifs et des images PDF numérisées en un seul appel. Il prend également en charge les fichiers TIFF multipages, les images et les flux. Pour les PDF numérisés, l'OCR est appliquée page par page avec des objets de résultat par page.

Comment la licence du SDK .NET (officiel) de Tesseract se compare-t-elle à celle d'IronOCR for .NET ?

IronOCR utilise une licence perpétuelle forfaitaire sans frais par page ou par scan. Les organisations qui traitent de gros volumes de documents paient le même coût de licence, quel que soit le volume. Les détails et la tarification au volume se trouvent sur la page de licence d'IronOCR.

Quelles langues IronOCR prend-il en charge ?

IronOcr prend en charge 127 langues via des packs linguistiques NuGet distincts. L'ajout d'une langue nécessite une seule commande "dotnet add package IronOcr.Languages.{Language}". Il n'est pas nécessaire de placer manuellement des fichiers ou de configurer des chemins d'accès.

Comment installer IronOCR dans un projet .NET ?

Installation via NuGet : 'Install-Package IronOcr' dans la console du Package Manager ou 'dotnet add package IronOcr' dans le CLI. Les packs de langues supplémentaires sont installés de la même manière. Aucun programme d'installation du SDK n'est nécessaire.

IronOCR est-il adapté à Docker et aux déploiements conteneurisés, contrairement à Tesseract .NET SDK ?

Oui. IronOCR fonctionne dans les conteneurs Docker via son package NuGet. La clé de licence est définie via une variable d'environnement. Aucun fichier de licence, chemin d'accès au SDK ou montage de volume n'est nécessaire pour le moteur OCR lui-même.

Puis-je essayer IronOCR for .NET avant de l'acheter, par rapport à Tesseract .NET SDK ?

Oui. Le mode d'essai d'IronOcr traite les documents et renvoie les résultats de l'OCR avec un filigrane en surimpression sur la sortie. Vous pouvez vérifier la précision sur vos propres documents avant d'acheter une licence.

IronOCR prend-il en charge la lecture de codes-barres parallèlement à l'extraction de texte ?

IronOCR se concentre sur l'extraction de texte et l'OCR. Pour la lecture de codes-barres, Iron Software propose IronBarcode comme bibliothèque d'accompagnement. Les deux sont disponibles individuellement ou dans le cadre de l'offre groupée Iron Suite.

Est-il facile de migrer de Tesseract .NET SDK (official) à IronOCR ?

La migration du SDK .NET de Tesseract (officiel) vers IronOCR implique généralement le remplacement des séquences d'initialisation par l'instanciation d'IronTesseract, la suppression de la gestion du cycle de vie de COM et la mise à jour des appels d'API. La plupart des migrations réduisent considérablement la complexité du code.

Kannaopat Udonpant
Ingénieur logiciel
Avant de devenir ingénieur logiciel, Kannapat a obtenu un doctorat en ressources environnementales à l'université d'Hokkaido au Japon. Pendant qu'il poursuivait son diplôme, Kannapat est également devenu membre du laboratoire de robotique de véhicules, qui fait partie du département de bioproduction. En 2022, il a utilisé ses compé...
Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi