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 :
OpenCvSharp4est requis pour le chargement d'images ; changer de plateforme nécessite de remplacer le paquetOpenCvSharp4.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
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
IronTesseractfonctionnent simultanément sans état partagé ; paralléliser une charge de travail par lots est un appelParallel.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 :
- Baidu PaddlePaddle — le framework d'apprentissage profond sous-jacent. Les formats de modèles et les API d'inférence sont définis ici.
- 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.
- 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
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}%")
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
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")
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
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
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")
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)
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
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")
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
CropRectanglesans 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.
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.

