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

Comparaison des bibliothèques OCR iOS (outils gratuits et payants)

PaddleSharp (Sdcb.PaddleOCR) se situe à trois niveaux d'abstraction du moteur OCR que votre code exécute réellement : Baidu entraîne les modèles de réseau neuronal, RapidOCR les reconditionne pour une inférence légère, et PaddleSharp les encapsule à nouveau pour la consommation .NET . Chaque couche ajoute une dépendance de maintenance, et la chaîne montre ses limites dès que l'on a besoin d'une langue autre que CJK, d'un PDF en entrée ou d'un déploiement en production sans CUDA. Cette comparaison examine les domaines où cette architecture s'avère rentable et ceux où elle engendre des coûts que les équipes .NET anticipent rarement.

Comprendre l'OCR PaddleSharp

PaddleSharp est un wrapper .NET autour du cadre d'apprentissage profond PaddleOCR de Baidu, publié sur NuGet en tant que Sdcb.PaddleOCR. Plutôt que d'utiliser des algorithmes OCR traditionnels, PaddleOCR applique un pipeline de réseau neuronal en trois étapes : un modèle de détection localise les régions de texte dans l'image, un modèle de classification détermine l'orientation du texte et un modèle de reconnaissance convertit chaque région en texte. Chaque étape correspond à un fichier modèle distinct que vous téléchargez et configurez indépendamment.

Ce wrapper a été conçu pour apporter l'inférence PaddlePaddle à .NET sans nécessiter Python. Cet objectif est techniquement atteint, mais cela a un coût : une pile de dépendances comprenant la bibliothèque de traitement d'images OpenCvSharp (qui nécessite elle-même des packages d'exécution spécifiques à la plateforme), l'environnement d'exécution natif PaddleInference et les fichiers du modèle eux-mêmes. Sous Windows, l'installation nécessite au minimum quatre packages NuGet avant qu'un seul caractère puisse être reconnu.

Principales caractéristiques architecturales de PaddleSharp :

  • Niveau d'encapsulation : Trois couches — PaddlePaddle (Baidu) → Modèles PaddleOCR → Liaisons .NET Sdcb.PaddleSharp
  • Gestion des modèles : Les modèles de détection, de classification et de reconnaissance sont des téléchargements séparés (~3 Mo, ~2 Mo et ~10 Mo respectivement pour l'ensemble chinois V3) ; vous gérez manuellement les chemins et les versions
  • Dépendance OpenCV : OpenCvSharp4 est requis pour le chargement d'images ; changer de plateforme nécessite de remplacer le paquet OpenCvSharp4.runtime.*
  • Spécialisation linguistique : Le principal atout est le chinois et l'anglais ; La prise en charge des autres langues est limitée aux packs de modèles PaddleOCR disponibles et maintenus.
  • Accélération GPU : Support natif CUDA via le paquet Sdcb.PaddleInference.runtime.win64.cuda, qui nécessite une trousse à outils CUDA compatible et une installation cuDNN sur l'hôte
  • Pénalité liée aux performances du processeur : sans GPU, l'inférence est plus lente que les alternatives optimisées pour le processeur — 500 à 1 500 ms par image contre 100 à 400 ms pour les moteurs optimisés non dédiés à l'apprentissage profond
  • Empreinte communautaire : Petite communauté anglophone ; La plupart des documentations, des réponses Stack Overflow et des problèmes GitHub sont en chinois.

Configuration d'inférence en trois étapes

La configuration de PaddleSharp pour une tâche simple d'extraction de texte nécessite de relier les trois étapes du modèle :

// Simplified — see Sdcb.PaddleOCR documentation for full API
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using OpenCvSharp;

public class PaddleOcrService
{
    private readonly PaddleOcrAll _ocr;

    public PaddleOcrService()
    {
        // Three separate models, each downloaded independently
        var detModel = LocalFullModels.ChineseV3.DetectionModel;
        var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
        var recModel = LocalFullModels.ChineseV3.RecognitionModel;

        // GPU config: set GpuDeviceId = 0 and install CUDA runtime packages
        _ocr = new PaddleOcrAll(detModel, clsModel, recModel);
    }

    public string ExtractText(string imagePath)
    {
        // OpenCV required for image loading — not System.Drawing
        using var image = Cv2.ImRead(imagePath);
        var result = _ocr.Run(image);

        // Manual sort by position; no automatic reading-order guarantee
        return string.Join("\n", result.Regions
            .OrderBy(r => r.Rect.Center.Y)
            .ThenBy(r => r.Rect.Center.X)
            .Select(r => r.Text));
    }
}
// Simplified — see Sdcb.PaddleOCR documentation for full API
using Sdcb.PaddleOCR;
using Sdcb.PaddleOCR.Models;
using OpenCvSharp;

public class PaddleOcrService
{
    private readonly PaddleOcrAll _ocr;

    public PaddleOcrService()
    {
        // Three separate models, each downloaded independently
        var detModel = LocalFullModels.ChineseV3.DetectionModel;
        var clsModel = LocalFullModels.ChineseV3.ClassifierModel;
        var recModel = LocalFullModels.ChineseV3.RecognitionModel;

        // GPU config: set GpuDeviceId = 0 and install CUDA runtime packages
        _ocr = new PaddleOcrAll(detModel, clsModel, recModel);
    }

    public string ExtractText(string imagePath)
    {
        // OpenCV required for image loading — not System.Drawing
        using var image = Cv2.ImRead(imagePath);
        var result = _ocr.Run(image);

        // Manual sort by position; no automatic reading-order guarantee
        return string.Join("\n", result.Regions
            .OrderBy(r => r.Rect.Center.Y)
            .ThenBy(r => r.Rect.Center.X)
            .Select(r => r.Text));
    }
}
Imports Sdcb.PaddleOCR
Imports Sdcb.PaddleOCR.Models
Imports OpenCvSharp

Public Class PaddleOcrService
    Private ReadOnly _ocr As PaddleOcrAll

    Public Sub New()
        ' Three separate models, each downloaded independently
        Dim detModel = LocalFullModels.ChineseV3.DetectionModel
        Dim clsModel = LocalFullModels.ChineseV3.ClassifierModel
        Dim recModel = LocalFullModels.ChineseV3.RecognitionModel

        ' GPU config: set GpuDeviceId = 0 and install CUDA runtime packages
        _ocr = New PaddleOcrAll(detModel, clsModel, recModel)
    End Sub

    Public Function ExtractText(imagePath As String) As String
        ' OpenCV required for image loading — not System.Drawing
        Using image = Cv2.ImRead(imagePath)
            Dim result = _ocr.Run(image)

            ' Manual sort by position; no automatic reading-order guarantee
            Return String.Join(vbLf, result.Regions _
                .OrderBy(Function(r) r.Rect.Center.Y) _
                .ThenBy(Function(r) r.Rect.Center.X) _
                .Select(Function(r) r.Text))
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Le constructeur seul fait un vrai travail : il charge les binaires du modèle depuis le disque et initialise le moteur d'inférence. Ce coût d'initialisation est payé une fois par instance PaddleOcrAll, ce qui rend l'objet coûteux à créer et nécessite une gestion attentive du cycle de vie dans les applications .NET orientées services.

Comprendre IronOCR

IronOCR est une bibliothèque OCR commerciale pour .NET , basée sur un moteur Tesseract 5 optimisé et dotée d'un pipeline de prétraitement automatique. Elle s'installe sous la forme d'un unique package NuGet , sans fichier de modèle externe, sans configuration binaire native et sans dépendance à une bibliothèque de traitement d'images secondaire. L'objectif de cette conception est d'éliminer le fossé entre " l'installation " et " la sortie de texte précise " — un fossé qui caractérise la plupart des autres options OCR .NET .

Caractéristiques principales d' IronOCR:

  • Déploiement d'un seul paquet : dotnet add package IronOcr — pas de téléchargements de modèles, pas de dossiers tessdata, pas d'OpenCV
  • Prétraitement automatique : redressement, débruitage, amélioration du contraste, binarisation et normalisation de la résolution sont effectués automatiquement sur l'image d'entrée ; des filtres de prétraitement explicites sont disponibles si nécessaire
  • Prise en charge native du format PDF : les PDF numérisés et les PDF contenant uniquement du texte sont acceptés directement ; Les fichiers PDF protégés par mot de passe nécessitent un paramètre
  • Plus de 125 langues : Distribuées sous forme de packs linguistiques NuGet individuels (par ex., IronOcr.Languages.ChineseSimplified), gérés de la même manière que toute dépendance de paquet
  • Sortie structurée : les résultats affichent les pages, les paragraphes, les lignes, les mots et les cadres de délimitation de chaque caractère, accompagnés de scores de confiance.
  • Sûr pour les threads : Plusieurs instances IronTesseract fonctionnent simultanément sans état partagé ; paralléliser une charge de travail par lots est un appel Parallel.ForEach
  • Pricing: $999 perpetual (Lite, 1 developer), $1,499 (Plus, 3 developers), $2,999 (Professional, 10 developers), $5,999 (Unlimited)

Comparaison des fonctionnalités

Fonction PaddleSharp OCR IronOCR
Packages NuGet requis 3 à 4 minimum 1
Gestion des modèles Manuel (3 fichiers séparés) None
Entrée PDF Non (nécessite une conversion) Natif
Nombre de langues ~10-20 125+
Accélération GPU Oui (CUDA) optimisé pour le processeur
Prétraitement Manuel (OpenCV) Automatique
Tarification Gratuit (Apache 2.0) $5,999 perpétuelle

Comparaison détaillée des fonctionnalités

Fonction PaddleSharp OCR IronOCR
Installation et déploiement
Packages NuGet requis 3-4 1
Téléchargements de fichiers de modèles Oui (3 fichiers, ~15 Mo au total) Non
Dépendance à OpenCV Les exigences sont les suivantes None
CUDA/cuDNN pour GPU Requis pour le mode GPU Sans objet
Déploiement de Docker Complexe (environnements d'exécution natifs) Ajout d'une seule couche
Déploiement en mode air-gapped Oui (après téléchargement du modèle) Oui
Reconnaissance de texte
Précision chinoise/japonaise/coréenne Élevé (priorité principale) Haut
précision de l'écriture latine Modéré Haut
Écriture Limité Prise en charge
Gestion des numérisations de faible qualité Prétraitement manuel nécessaire Automatique
Déclinaison automatique Non Oui
Autodébruitage Non Oui
Sources d'entrée
fichiers image Oui (via OpenCV) Oui
Fichiers PDF (natifs) Non Oui
PDF protégé par mot de passe Non Oui
Flux et tableaux d'octets Via OpenCV Oui
TIFF multipage Via OpenCV Oui
Sortir
Texte brut Oui Oui
PDF consultable Non Oui
hOCR Non Oui
Cadres de délimitation au niveau des mots Oui Oui
scores de confiance Oui Oui
Hiérarchie structurée page/ligne/mot Partiellement (régions seulement) Complet
Assistance linguistique
Nombre de langues ~10-20 125+
méthode d'installation de la langue Téléchargement du pack de modèles Paquet NuGet
Document multilingue Limité Oui
Formation linguistique personnalisée Oui (PaddlePaddle) Oui
Support de la plateforme
Fenêtres Oui Oui
Linux Oui (configuration complexe) Oui
macOS Limité Oui
Docker Oui (avec les environnements d'exécution natifs) Oui
AWS Lambda Complexe Oui
Performance
Image unique du processeur 500–1500 ms 100–400 ms
Image unique GPU 100–300 ms Sans objet
Mémoire (mode CPU) Plus haut Modéré
Lecture de codes-barres lors de la reconnaissance optique de caractères (OCR) Non Oui
Préparation commerciale
Licence commerciale Apache 2.0 Perpétuel par développeur
Chaîne de soutien Problèmes GitHub Assistance par e-mail
Documentation en anglais Clairsemé Documentation complète, tutoriels et guides pratiques
études de cas de production Rare (spécifique à .NET ) Documenté

Profondeur d'abstraction et risque de maintenance

PaddleSharp est la seule option OCR .NET de cette catégorie qui exécute trois projets amont distincts comme prérequis. Cette profondeur représente le principal risque pour les équipes de production.

Approche PaddleSharp

En pratique, la chaîne de dépendances ressemble à ceci :

  1. Baidu PaddlePaddle — le framework d'apprentissage profond sous-jacent. Les formats de modèles et les API d'inférence sont définis ici.
  2. PaddleOCR — Projet d'entraînement de modèle de Baidu qui produit les poids du modèle de détection, de classification et de reconnaissance.
  3. Sdcb.PaddleSharp — la couche de liaison .NET qui appelle les bibliothèques natives de PaddleInference et encapsule l'API de chargement de modèle.

Chaque couche a son propre rythme de publication, son historique des changements importants et sa communauté. Lorsque Baidu met à jour les API d'inférence de PaddlePaddle, la couche de liaison doit être adaptée. De même, lorsqu'un format de modèle change entre les versions de PaddleOCR, les chemins de téléchargement du modèle et le code de chargement dans PaddleSharp doivent être mis à jour. Pour une équipe .NET , ces problèmes sont invisibles jusqu'à ce qu'un déploiement échoue.

Illustration simplifiée du coût d'initialisation :

// Simplified — see Sdcb.PaddleOCR documentation for full API
// This is not one line of setup; it represents several coordinated decisions:
// - Which model version to use (ChineseV3, V4, etc.)
// - Whether models are local files or downloaded on first use
// - Which inference backend (CPU, MKL, GPU)
// - Which OpenCvSharp runtime package matches the deployment OS

var detModel = LocalFullModels.ChineseV3.DetectionModel;  // Version-specific
var clsModel = LocalFullModels.ChineseV3.ClassifierModel; // Version-specific
var recModel = LocalFullModels.ChineseV3.RecognitionModel; // Version-specific

var ocr = new PaddleOcrAll(detModel, clsModel, recModel);
// If a newer model format is released, these names and classes may change
// Simplified — see Sdcb.PaddleOCR documentation for full API
// This is not one line of setup; it represents several coordinated decisions:
// - Which model version to use (ChineseV3, V4, etc.)
// - Whether models are local files or downloaded on first use
// - Which inference backend (CPU, MKL, GPU)
// - Which OpenCvSharp runtime package matches the deployment OS

var detModel = LocalFullModels.ChineseV3.DetectionModel;  // Version-specific
var clsModel = LocalFullModels.ChineseV3.ClassifierModel; // Version-specific
var recModel = LocalFullModels.ChineseV3.RecognitionModel; // Version-specific

var ocr = new PaddleOcrAll(detModel, clsModel, recModel);
// If a newer model format is released, these names and classes may change
' Simplified — see Sdcb.PaddleOCR documentation for full API
' This is not one line of setup; it represents several coordinated decisions:
' - Which model version to use (ChineseV3, V4, etc.)
' - Whether models are local files or downloaded on first use
' - Which inference backend (CPU, MKL, GPU)
' - Which OpenCvSharp runtime package matches the deployment OS

Dim detModel = LocalFullModels.ChineseV3.DetectionModel  ' Version-specific
Dim clsModel = LocalFullModels.ChineseV3.ClassifierModel ' Version-specific
Dim recModel = LocalFullModels.ChineseV3.RecognitionModel ' Version-specific

Dim ocr As New PaddleOcrAll(detModel, clsModel, recModel)
' If a newer model format is released, these names and classes may change
$vbLabelText   $csharpLabel

La sensibilité liée à la version est bien réelle. Les équipes qui ont épinglé à Sdcb.PaddleOCR 2.x et ont besoin de mettre à jour pour accéder à des modèles plus récents rencontrent des changements d'API au niveau de la liaison. Les fichiers de modèle en amont ne sont pas rétrocompatibles entre les principales versions de PaddleOCR.

Approche d'IronOCR

IronOCR distribue le moteur et toutes ses dépendances regroupés dans le package NuGet . Il n'y a pas de version de modèle à sélectionner, pas de moteur d'inférence à configurer, et pas de bibliothèque secondaire à synchroniser :

// One package: dotnet add package IronOcr
// Non model downloads. Non OpenCV. Non runtime packages.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var result = new IronTesseract().Read("document.jpg");
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
// One package: dotnet add package IronOcr
// Non model downloads. Non OpenCV. Non runtime packages.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

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

' One package: dotnet add package IronOcr
' Non model downloads. Non OpenCV. Non runtime packages.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

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

La mise à niveau IronOCR se limite à l'ajout d'une seule version NuGet . Les modifications apportées à l'API sont documentées dans les notes de version, et la compatibilité ascendante entre les versions majeures est assurée. Pour les équipes travaillant dans des pipelines CI/CD, la différence en termes de surface de déploiement est substantielle : un seul package contre quatre packages Plus des packages d'exécution spécifiques à la plateforme Plus des fichiers de modèle qui doivent exister sur le disque aux bons emplacements.

Consultez le guide d'installation d'IronTesseract pour les options de configuration et le guide d'entrée d'images pour une liste complète des sources d'entrée acceptées.

Couverture linguistique

PaddleOCR a été principalement entraîné pour le chinois, l'anglais étant une langue secondaire. La communauté .NET autour de PaddleSharp reflète cette origine : des packs de modèles existent pour l'écriture chinoise (simplifiée, traditionnelle), l'anglais et quelques autres langues, mais la couverture au-delà d'une dizaine ou d'une vingtaine de langues est faible, et la maintenance des modèles non-CJK dépend de l'intérêt que suscite le projet en amont.

Approche PaddleSharp

Changer de langue dans PaddleSharp signifie changer de modèle. Le modèle de reconnaissance est spécifique à chaque langue et il n'existe pas d'indicateur d'API simple ; vous instanciez un ensemble différent d'objets de modèle :

// Simplified — see Sdcb.PaddleOCR documentation for full API
// English model set (if available for your version)
// var recModel = LocalFullModels.EnglishV3.RecognitionModel;

// Chinese model set (primary supported use case)
var detModel = LocalFullModels.ChineseV3.DetectionModel;
var recModel = LocalFullModels.ChineseV3.RecognitionModel;
var clsModel = LocalFullModels.ChineseV3.ClassifierModel;

var ocr = new PaddleOcrAll(detModel, clsModel, recModel);
// Non-CJK languages require checking upstream PaddleOCR model availability
// Mixed CJK + Latin in the same document may require model selection decisions
// Simplified — see Sdcb.PaddleOCR documentation for full API
// English model set (if available for your version)
// var recModel = LocalFullModels.EnglishV3.RecognitionModel;

// Chinese model set (primary supported use case)
var detModel = LocalFullModels.ChineseV3.DetectionModel;
var recModel = LocalFullModels.ChineseV3.RecognitionModel;
var clsModel = LocalFullModels.ChineseV3.ClassifierModel;

var ocr = new PaddleOcrAll(detModel, clsModel, recModel);
// Non-CJK languages require checking upstream PaddleOCR model availability
// Mixed CJK + Latin in the same document may require model selection decisions
' Simplified — see Sdcb.PaddleOCR documentation for full API
' English model set (if available for your version)
' Dim recModel = LocalFullModels.EnglishV3.RecognitionModel

' Chinese model set (primary supported use case)
Dim detModel = LocalFullModels.ChineseV3.DetectionModel
Dim recModel = LocalFullModels.ChineseV3.RecognitionModel
Dim clsModel = LocalFullModels.ChineseV3.ClassifierModel

Dim ocr = New PaddleOcrAll(detModel, clsModel, recModel)
' Non-CJK languages require checking upstream PaddleOCR model availability
' Mixed CJK + Latin in the same document may require model selection decisions
$vbLabelText   $csharpLabel

Pour une équipe traitant des factures françaises, des contrats allemands ou des formulaires arabes, la question n'est pas seulement de savoir si un modèle existe aujourd'hui, mais aussi s'il sera maintenu l'année prochaine et si la documentation en anglais permettant de le configurer existe.

Approche d'IronOCR

IronOCR propose plus de 125 langues sous forme de packages NuGet . Chaque pack de langue s'installe exactement comme n'importe quelle autre dépendance et s'intègre aux pipelines CI/CD standard sans déploiement manuel de fichiers :

// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.Arabic

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English); // Mixed-language document

var result = ocr.Read("mixed-document.jpg");
// dotnet add package IronOcr.Languages.ChineseSimplified
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.Arabic

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English); // Mixed-language document

var result = ocr.Read("mixed-document.jpg");
' dotnet add package IronOcr.Languages.ChineseSimplified
' dotnet add package IronOcr.Languages.French
' dotnet add package IronOcr.Languages.Arabic

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
ocr.AddSecondaryLanguage(OcrLanguage.English) ' Mixed-language document

Dim result = ocr.Read("mixed-document.jpg")
$vbLabelText   $csharpLabel

Le guide multilingue couvre la reconnaissance simultanée multilingue pour les documents mélangeant des scripts — une capacité qui ne nécessite aucune décision au niveau du modèle, juste un appel AddSecondaryLanguage.

Pour les équipes dont les documents couvrent plusieurs langues, ou dont les besoins linguistiques devraient évoluer au-delà du périmètre initial, un catalogue de 125 langues soutenu par des packages NuGet maintenus est un choix plus durable qu'un ensemble de 10 à 20 langues avec un engagement de maintenance variable.

Prétraitement et prise en charge des fichiers PDF

Le pipeline de réseau neuronal de PaddleOCR gère mieux certaines variations de qualité d'image que l'OCR traditionnel pour le texte CJK, mais il ne fournit aucune API de prétraitement d'image intégrée pour des tâches telles que le redressement, la suppression du bruit ou la normalisation de la résolution. Tout prétraitement doit être écrit en OpenCV — une bibliothèque que PaddleSharp requiert déjà, mais qui ajoute une surface de code importante pour les équipes qui ne sont pas spécialisées dans le traitement d'images.

La prise en charge du format PDF représente la lacune la plus importante. PaddleSharp ne dispose d'aucun lecteur PDF natif. Un pipeline de traitement de documents qui reçoit des PDF doit convertir chaque page en image avant d'appeler le moteur OCR, ce qui nécessite une bibliothèque PDF distincte, ajoute des dépendances et introduit une gestion intermédiaire des fichiers.

Approche PaddleSharp

// Simplified — see Sdcb.PaddleOCR documentation for full API
// PaddleSharp has no PDF support — pages must be pre-converted to images
// Preprocessing (deskew, denoise) requires OpenCV operations:

using OpenCvSharp;

// Load image via OpenCV
using var image = Cv2.ImRead("scan.jpg");

// Manual grayscale conversion
using var gray = new Mat();
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);

// Manual threshold (binarization)
using var binary = new Mat();
Cv2.Threshold(gray, binary, 128, 255, ThresholdTypes.Binary);

// Then pass to OCR engine
var result = _ocr.Run(binary);
// Each preprocessing step requires OpenCV knowledge
// PDF pages require a separate PDF-to-image conversion step first
// Simplified — see Sdcb.PaddleOCR documentation for full API
// PaddleSharp has no PDF support — pages must be pre-converted to images
// Preprocessing (deskew, denoise) requires OpenCV operations:

using OpenCvSharp;

// Load image via OpenCV
using var image = Cv2.ImRead("scan.jpg");

// Manual grayscale conversion
using var gray = new Mat();
Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);

// Manual threshold (binarization)
using var binary = new Mat();
Cv2.Threshold(gray, binary, 128, 255, ThresholdTypes.Binary);

// Then pass to OCR engine
var result = _ocr.Run(binary);
// Each preprocessing step requires OpenCV knowledge
// PDF pages require a separate PDF-to-image conversion step first
Imports OpenCvSharp

' Load image via OpenCV
Using image As Mat = Cv2.ImRead("scan.jpg")

    ' Manual grayscale conversion
    Using gray As New Mat()
        Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY)

        ' Manual threshold (binarization)
        Using binary As New Mat()
            Cv2.Threshold(gray, binary, 128, 255, ThresholdTypes.Binary)

            ' Then pass to OCR engine
            Dim result = _ocr.Run(binary)
            ' Each preprocessing step requires OpenCV knowledge
            ' PDF pages require a separate PDF-to-image conversion step first
        End Using
    End Using
End Using
$vbLabelText   $csharpLabel

La rédaction de ce prétraitement est réalisable pour les équipes ayant une expérience d'OpenCV. Pour les équipes qui n'en disposent pas, la courbe d'apprentissage est loin d'être simple : OpenCV possède une large interface API et la documentation est principalement axée sur le C++.

Approche d'IronOCR

Le pipeline de prétraitement d'IronOCR ne nécessite aucune bibliothèque externe. Le même objet OcrInput qui accepte les images accepte également les PDFs, et les filtres de prétraitement sont des appels de méthode unique :

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

// Built-in preprocessing — no OpenCV, no manual image math
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);

var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

// Built-in preprocessing — no OpenCV, no manual image math
input.Deskew();
input.DeNoise();
input.Contrast();
input.Binarize();
input.EnhanceResolution(300);

var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

Using input As New OcrInput()
    input.LoadImage("low-quality-scan.jpg")

    ' Built-in preprocessing — no OpenCV, no manual image math
    input.Deskew()
    input.DeNoise()
    input.Contrast()
    input.Binarize()
    input.EnhanceResolution(300)

    Dim result = New IronTesseract().Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

Pour l'entrée PDF, la prise en charge native signifie qu'aucune étape de conversion n'est nécessaire :

// PDF input — no external library, no page conversion
var result = new IronTesseract().Read("scanned-document.pdf");

// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);

// Output as searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf");
// PDF input — no external library, no page conversion
var result = new IronTesseract().Read("scanned-document.pdf");

// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);

// Output as searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronTesseract

' PDF input — no external library, no page conversion
Dim result = New IronTesseract().Read("scanned-document.pdf")

' Password-protected PDFs
Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password:="secret")
    result = New IronTesseract().Read(input)
End Using

' Output as searchable PDF
result.SaveAsSearchablePdf("searchable-output.pdf")
$vbLabelText   $csharpLabel

Le guide de correction de la qualité d'image couvre tous les filtres disponibles avec des exemples. Le guide d'importation de fichiers PDF aborde la sélection des pages, l'importation de flux et la gestion des mots de passe. Pour les équipes produisant des PDF consultables à partir de documents numérisés, la sortie PDF consultable est un format de sortie intégré et non une étape de traitement distincte.

Référence de mappage d'API

Concept OCR PaddleSharp Équivalent d'IronOCR
Sdcb.PaddleOCR (espace de noms) IronOcr (espace de noms)
PaddleOcrAll IronTesseract
LocalFullModels.ChineseV3.DetectionModel Aucun équivalent — aucune sélection de modèle nécessaire
LocalFullModels.ChineseV3.RecognitionModel Aucun équivalent — aucune sélection de modèle nécessaire
LocalFullModels.ChineseV3.ClassifierModel Aucun équivalent — aucune sélection de modèle nécessaire
Cv2.ImRead(path) (chargement d'image OpenCV) input.LoadImage(path)
_ocr.Run(matImage) ocr.Read(input) ou ocr.Read("file.jpg")
result.Regions result.Words, result.Lines, result.Pages
region.Text word.Text, line.Text, page.Text
region.Rect.Center word.X, word.Y
Échange de modèle de langage (nouvel ensemble de modèles) ocr.Language = OcrLanguage.French
PaddleConfig (config backend inférence) Aucun équivalent — configuration automatique
Opérations de seuillage/niveaux de gris d'OpenCvSharp input.Binarize(), input.ToGrayScale()
Prise en charge des fichiers PDF non disponible ; pré-convertir en image. input.LoadPdf("file.pdf")
Aucun fichier PDF consultable result.SaveAsSearchablePdf("output.pdf")

Quand les équipes envisagent de passer de PaddleSharp OCRà IronOCR

Le pipeline traite les documents non-CJK

PaddleSharp a été conçu pour les Chinois. Cet héritage est visible dans la convention de nommage des modèles (ChineseV3), la langue principale de la documentation et la disponibilité des modules linguistiques. Une équipe qui commence par le traitement de documents chinois et qui s'étend ensuite aux factures françaises ou aux contrats allemands se heurte à un obstacle de taille : les packs de modèles disponibles en dehors du CJK sont peu nombreux, l'engagement de maintenance pour les modèles non-CJK est incertain et la documentation en anglais pour leur configuration est rare. Le catalogue de plus de 125 langues d'IronOCR via NuGet signifie que l'extension linguistique se fait par l'installation d'un package, et non par un projet de recherche.

L'environnement de déploiement ne possède pas de GPU.

Le pipeline d'apprentissage profond de PaddleOCR est conçu pour l'inférence GPU. Sur le processeur, les chiffres de performance sont exacts : 500 à 1 500 ms par image aux résolutions de documents typiques. Pour un pipeline de traitement par lots traitant des milliers de documents, ou pour une application ASP.NET traitant des requêtes OCR simultanées, le mode CPU de PaddleSharp ajoute une latence qui s'accumule avec l'échelle. Le moteur Tesseract 5 optimisé d'IronOCR fonctionne en 100 à 400 ms par image sur CPU sans nécessiter de GPU. Pour les déploiements sur des niveaux de VM standard, des conteneurs sans transfert GPU ou des workers CI, cette différence fait la différence entre une charge de travail adaptée et une charge de travail non adaptée.

Les documents PDF sont dans le flux d'entrée.

Le format PDF est le format de référence pour les documents commerciaux. PaddleSharp ne possède pas de lecteur PDF. Les équipes qui découvrent cette limitation après avoir développé leur application autour de PaddleSharp sont confrontées à un choix : ajouter une bibliothèque PDF (gérant ainsi une dépendance supplémentaire avec ses propres considérations de licence et de version), convertir les PDF en images comme étape de prétraitement (ajoutant une surcharge de stockage et d'E/S), ou migrer vers une bibliothèque prenant en charge nativement le format PDF. La prise en charge native des fichiers PDF par IronOCR, notamment les PDF protégés par mot de passe et la sélection de plages de pages, en fait le choix idéal pour les flux de travail documentaires qui commencent par un PDF.

La chaîne de dépendance échoue à un examen de sécurité ou de conformité

Les déploiements en Enterprise (santé, finance, gouvernement) nécessitent souvent une nomenclature logicielle et un audit des dépendances. La chaîne de PaddleSharp inclut des fichiers de modèles et un environnement d'exécution d'inférence d'apprentissage profond provenant de Baidu. Pour les organisations dont les politiques limitent l'origine des composants logiciels à des sources spécifiques, ou pour les équipes qui exigent une traçabilité claire des informations de sécurité des fournisseurs, la dépendance à des binaires provenant de Baidu nécessite des vérifications supplémentaires. IronOCR est un produit commercial unique d'un éditeur de logiciels occidental, assorti de conditions de licence documentées et d'un contrat de support commercial standard.

L'équipe ne dispose pas du personnel nécessaire pour couvrir les frais généraux opérationnels.

Maintenir un déploiement PaddleSharp pendant plus de 18 mois implique de suivre la compatibilité des versions des modèles, de coordonner les versions des packages d'exécution OpenCV avec les déploiements spécifiques à la plateforme, de maintenir l'alignement des versions du kit d'outils CUDA si un GPU est utilisé et de surveiller les problèmes GitHub en amont (principalement en chinois) pour les changements incompatibles. Il s'agit d'un investissement opérationnel non négligeable. Pour les équipes dont la compétence principale réside dans l'application qu'elles développent — et non dans l'infrastructure d'apprentissage profond —, les frais généraux liés à la gestion de PaddleSharp ne génèrent pas de valeur proportionnelle à son coût.

Considérations courantes en matière de migration

Suppression de la dépendance à OpenCV

PaddleSharp nécessite OpenCvSharp4 et un paquet OpenCvSharp4.runtime.* spécifique à la plateforme pour le chargement d'images. IronOCR accepte System.Drawing.Bitmap, les chemins de fichiers, les flux et les tableaux d'octets directement via OcrInput. La migration signifie remplacer les appels Cv2.ImRead() par input.LoadImage() et supprimer complètement les références au paquet OpenCvSharp :

// PaddleSharp pattern — requires OpenCV
using var image = Cv2.ImRead(imagePath);
var result = _ocr.Run(image);

// IronOCR equivalent — no OpenCV
var result = new IronTesseract().Read(imagePath);
// PaddleSharp pattern — requires OpenCV
using var image = Cv2.ImRead(imagePath);
var result = _ocr.Run(image);

// IronOCR equivalent — no OpenCV
var result = new IronTesseract().Read(imagePath);
Imports OpenCvSharp
Imports IronOcr

' PaddleSharp pattern — requires OpenCV
Using image As Mat = Cv2.ImRead(imagePath)
    Dim result = _ocr.Run(image)
End Using

' IronOCR equivalent — no OpenCV
Dim result = New IronTesseract().Read(imagePath)
$vbLabelText   $csharpLabel

Le guide de saisie d'images couvre tous les types d'entrée acceptés, y compris les flux, les URL et les bitmaps en mémoire.

Cartographie des résultats au niveau régional

PaddleSharp renvoie result.Regions — une liste plate de régions de texte détectées avec des rectangles de délimitation et des chaînes de texte. IronOCR renvoie une hiérarchie plus riche : les pages contiennent des paragraphes, les paragraphes contiennent des lignes, les lignes contiennent des mots, le tout avec des coordonnées et des scores de confiance par élément. Si votre code de migration utilise result.Regions, l'équivalent IronOCR pour l'énumération des mots plats avec des données de position est :

var result = new IronTesseract().Read("document.jpg");

// Per-word with position — equivalent to PaddleSharp region enumeration
foreach (var word in result.Words)
{
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence:{word.Confidence}%");
}
var result = new IronTesseract().Read("document.jpg");

// Per-word with position — equivalent to PaddleSharp region enumeration
foreach (var word in result.Words)
{
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence:{word.Confidence}%");
}
Imports System
Imports IronOcr

Dim result = New IronTesseract().Read("document.jpg")

' Per-word with position — equivalent to PaddleSharp region enumeration
For Each word In result.Words
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence:{word.Confidence}%")
Next
$vbLabelText   $csharpLabel

Le guide de lecture des résultats décrit la structure complète des résultats. Le guide des scores de confiance explique les valeurs de confiance par élément et comment les utiliser pour le filtrage de la qualité.

Gestion du cycle de vie du moteur OCR

La PaddleOcrAll de PaddleSharp est coûteuse à construire — elle charge les binaires du modèle depuis le disque lors de la création et doit être traitée comme un singleton ou un service de portée dans ASP.NET Core. La IronTesseract d'IronOCR a un coût d'initialisation plus léger, mais le même principe s'applique : réutiliser les instances à travers les requêtes dans une application web est plus efficace que de les construire par requête. Dans les deux cas, l'injection de dépendances comme un singleton ou un service à portée par requête est le bon motif.

Installation du pack de langue

Dans PaddleSharp, la prise en charge des langages implique la sélection de différents ensembles de modèles lors de la construction. Dans IronOCR, elle se présente sous la forme d'un package NuGet ajouté au projet et d'une simple ligne de configuration :

// dotnet add package IronOcr.Languages.ChineseSimplified

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
var result = ocr.Read("document.jpg");
// dotnet add package IronOcr.Languages.ChineseSimplified

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
var result = ocr.Read("document.jpg");
Imports IronOcr

Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
Dim result = ocr.Read("document.jpg")
$vbLabelText   $csharpLabel

Pour les équipes CJK migrant depuis PaddleSharp, le chinois simplifié, le chinois traditionnel, le japonais et le coréen sont tous disponibles sous forme de packs de langue IronOCR . Le guide sur les langages personnalisés explique comment intégrer des données tessdata entraînées sur mesure pour des cas d'utilisation spécifiques.

Fonctionnalités supplémentaires d'IronOCR

Outre les fonctionnalités comparées ci-dessus, IronOCR offre des capacités qui ne relèvent absolument pas du champ d'application de PaddleSharp :

  • OCR basé sur la région : Cibler des zones spécifiques d'une image — les en-têtes de lignes, les totaux des factures, les champs de formulaire spécifiques — en utilisant CropRectangle sans traiter la pleine page
  • OCR asynchrone : Prise en charge asynchrone intégrée pour l'intégration de l'OCR dans les pipelines de requêtes ASP.NET Core sans bloquer les threads.
  • Lecture de passeports et de cartes d'identité : Extraction structurée des données de zone lisibles par machine à partir des documents de voyage et des cartes d'identité
  • Lecture de tableaux : Regroupement spatial des coordonnées des mots pour reconstruire la structure lignes-colonnes à partir de la mise en page tabulaire des documents
  • Licences : Licences perpétuelles par développeur, sans redevances d'exécution et avec utilisation gratuite pour le développement en mode d'essai.

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

IronOCR cible .NET 8 et .NET 9 avec une prise en charge complète de Windows, Linuxet macOSsur les architectures x64 et x86, et publie des guides de déploiement Docker pour les charges de travail conteneurisées. PaddleSharp prend en charge les environnements d'exécution .NET modernes, mais sa compatibilité multiplateforme est compliquée par les packages d'exécution OpenCV, qui sont distribués sous forme de packages NuGet spécifiques à chaque plateforme, ce qui nécessite de sélectionner et de déployer le package approprié pour chaque environnement. Le modèle de déploiement à package unique d'IronOCR élimine entièrement cette matrice de plateformes, et ses guides de déploiement Linux , AWS et Azure reflètent des configurations testées et destinées à la production.

Conclusion

PaddleSharp présente un argument convaincant dans un scénario précis : une équipe traitant principalement des documents chinois sur un matériel doté d'un GPU compatible CUDA, où la précision maximale de l'apprentissage profond pour le texte CJK est plus importante que la simplicité de déploiement. Il s'agit là d'un cas d'utilisation concret, et PaddleSharp y répond parfaitement. Le pipeline de réseau neuronal en trois étapes reconnaît les textes chinois denses avec une précision qui témoigne d'un véritable investissement dans l'apprentissage profond.

En dehors de ce scénario, la profondeur d'abstraction devient un handicap. Trois dépendances en amont — le framework d'inférence de Baidu, le projet d'entraînement du modèle PaddleOCR et la couche de liaison .NET de PaddleSharp — ont chacune leurs propres cycles de publication, et leur alignement de maintenance n'est pas garanti. La documentation en anglais est peu abondante. Le catalogue des langues au-delà du CJK est restreint et sa mise à jour est irrégulière. L'importation de fichiers PDF nécessite une bibliothèque distincte. Et sans GPU, la latence du processeur par image est de 500 à 1500 ms contre 100 à 400 ms pour IronOCR.

Le compromis d'IronOCR est l'inverse : un seul paquet commercial avec un prix d'entrée $999, pas de gestion de modèle, entrée native PDF et multi-format, plus de 125 langues sous forme de paquets NuGet, et un prétraitement intégré qui élimine le besoin d'OpenCV. L'abstraction est intentionnelle, et l'abstraction est stable — l'API n'a pas nécessité que les équipes suivent les changements de format de modèle en amont de Baidu pour garder leurs applications en fonctionnement.

Pour les équipes ayant des besoins OCR généraux en anglais ou multilingues, des flux de travail PDF ou des contraintes de déploiement excluant l'utilisation de matériel GPU, IronOCR est la solution idéale. La documentation IronOCR couvre l'ensemble des types d'entrée, des options de prétraitement et des formats de sortie, et le centre de tutoriels propose des exemples de code fonctionnels pour les types de documents courants, des factures aux passeports en passant par les archives numérisées.

Veuillez noterPaddleOCR, 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 Baidu, Google, PaddlePaddle 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.

Questions Fréquemment Posées

Qu'est-ce que PaddleSharp OCR ?

PaddleSharp OCR est une solution d'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 nombreuses options d'OCR évaluées aux côtés d'IronOCR pour le développement d'applications .NET.

Comment IronOCR se compare-t-il à PaddleSharp OCR for .NET developers ?

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

IronOCR est-il plus facile à installer que PaddleSharp OCR ?

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 PaddleSharp OCR et IronOCR ?

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 OCR de PaddleSharp se compare-t-elle à celle d'IronOCR ?

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 à PaddleSharp ?

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 avant de l'acheter, par rapport à PaddleSharp ?

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 PaddleSharp OCR à IronOCR ?

La migration de PaddleSharp OCR 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