IronOCR.iOS para España: Escáner de DNI, NIE, Facturae y TicketBAI conforme con LOPDGDD
PaddleSharp (Sdcb.PaddleOCR) se sitúa a tres capas de abstracción del motor OCR que ejecuta realmente tu código: Baidu entrena los modelos de red neuronal, RapidOCR los vuelve a empaquetar para una inferencia ligera y PaddleSharp los encapsula de nuevo para su consumo .NET . Cada capa añade una dependencia de mantenimiento, y la cadena muestra sus límites en el momento en que se necesita un idioma distinto de CJK, un PDF como entrada o una implementación en producción sin CUDA. Esta comparación analiza dónde resulta rentable esa arquitectura y dónde conlleva un coste que los equipos de .NET rara vez anticipan de antemano.
Comprender el reconocimiento óptico de caracteres (OCR) de PaddleSharp
PaddleSharp es un envoltorio .NET alrededor del marco de aprendizaje profundo PaddleOCR de Baidu, publicado en NuGet como Sdcb.PaddleOCR. En lugar de utilizar algoritmos OCR tradicionales, PaddleOCR aplica una arquitectura de red neuronal de tres etapas: un modelo de detección localiza las regiones de texto en la imagen, un modelo clasificador determina la orientación del texto y un modelo de reconocimiento convierte cada región en texto. Cada etapa es un archivo de modelo independiente que usted descarga y configura por separado.
El envoltorio se creó para llevar la inferencia de PaddlePaddle a .NET sin necesidad de Python. Técnicamente, ese objetivo se logra, pero el costo es una pila de dependencias que incluye la biblioteca de procesamiento de imágenes OpenCvSharp (que a su vez requiere paquetes de tiempo de ejecución específicos de la plataforma), el tiempo de ejecución nativo de PaddleInference y los propios archivos del modelo. En Windows, la configuración requiere como mínimo cuatro paquetes NuGet antes de que se pueda reconocer un solo carácter.
Características arquitectónicas clave de PaddleSharp:
- Profundidad del contenedor: Tres capas: PaddlePaddle (Baidu) → Modelos PaddleOCR → Enlaces Sdcb.PaddleSharp .NET
- Gestión de modelos: Los modelos de detección, clasificación y reconocimiento se descargan por separado (~3 MB, ~2 MB y ~10 MB respectivamente para el conjunto V3 chino); gestiona rutas y versiones manualmente
- Dependencia de OpenCV: Se requiere
OpenCvSharp4para cargar imágenes; cambiar de plataforma requiere intercambiar el paqueteOpenCvSharp4.runtime.* - Enfoque lingüístico: Su principal fortaleza reside en el chino y el inglés; La compatibilidad con otros idiomas se limita a los paquetes de modelos de PaddleOCR disponibles y actualizados.
- Aceleración GPU: Soporte nativo de CUDA a través del paquete
Sdcb.PaddleInference.runtime.win64.cuda, que requiere un kit de herramientas CUDA compatible e instalación de cuDNN en el host - Penalización de rendimiento de la CPU: Sin GPU, la inferencia es más lenta que las alternativas optimizadas para CPU: 500–1500 ms por imagen frente a 100–400 ms para motores optimizados que no utilizan aprendizaje profundo.
- Presencia comunitaria: Pequeña comunidad de habla inglesa; La mayor parte de la documentación, las respuestas de Stack Overflow y los problemas de GitHub están en chino.
Configuración de inferencia de tres etapas
Para configurar PaddleSharp para una tarea simple de extracción de texto, es necesario conectar las tres etapas del modelo:
// 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
El constructor solo hace un trabajo real: carga binarios de modelos desde el disco e inicializa el motor de inferencia. Ese costo de inicialización se paga una vez por instancia de PaddleOcrAll, lo que hace que el objeto sea caro de crear y requiere una gestión cuidadosa del ciclo de vida en aplicaciones orientadas a servicios .NET.
Comprender IronOCR
IronOCR es una biblioteca OCR comercial para .NET basada en un motor Tesseract 5 optimizado con una canalización de preprocesamiento automático integrada. Se instala como un único paquete NuGet sin archivos de modelo externos, sin configuración binaria nativa y sin dependencias de bibliotecas de procesamiento de imágenes secundarias. El objetivo del diseño es eliminar la brecha entre "instalación" y "salida de texto precisa", una brecha que define a la mayoría de las demás opciones de OCR .NET .
Características clave de IronOCR:
- Implementación de un solo paquete:
dotnet add package IronOcr— sin descargas de modelos, sin carpetas tessdata, sin OpenCV - Preprocesamiento automático: La corrección de inclinación, la reducción de ruido, la mejora del contraste, la binarización y la normalización de la resolución se realizan automáticamente en la entrada de la imagen; se dispone de filtros de preprocesamiento explícitos cuando es necesario
- Compatibilidad nativa con PDF: Se aceptan directamente tanto archivos PDF escaneados como archivos PDF con capas de texto; Los archivos PDF protegidos con contraseña requieren un parámetro.
- 125+ idiomas: Se entrega como paquetes de lenguaje NuGet individuales (por ejemplo,
IronOcr.Languages.ChineseSimplified), gestionados de la misma manera que cualquier dependencia de paquete - Salida estructurada: Los resultados muestran páginas, párrafos, líneas, palabras y cuadros delimitadores de caracteres individuales con puntuaciones de confianza.
- Seguro para hilos: Varias instancias de
IronTesseractse ejecutan simultáneamente sin estado compartido; paralelizar una carga de trabajo en lote es una llamadaParallel.ForEach - Precios: $999 perpetua (Lite, 1 desarrollador), $1,499 (Plus, 3 desarrolladores), $2,999 (Profesional, 10 desarrolladores), $5,999 (Ilimitado)
Comparación de características
| Característica | PaddleSharp OCR | IronOCR |
|---|---|---|
| Se requieren paquetes NuGet | 3-4mínimo | 1 |
| Gestión de modelos | Manual (3 archivos separados) | None |
| Entrada de PDF | No (requiere conversión) | Nativo |
| Recuento de palabras | ~10-20 | 125+ |
| aceleración de GPU | Sí (CUDA) | Optimizado para CPU |
| Preprocesamiento | Manual (OpenCV) | Automático |
| Precios | Gratuito (Apache 2.0) | $5,999 perpetua |
Comparación detallada de características
| Característica | PaddleSharp OCR | IronOCR |
|---|---|---|
| Configuración e implementación | ||
| Se requieren paquetes NuGet | 3-4 | 1 |
| Descarga de archivos de modelos | Sí (3 archivos, ~15 MB en total) | No |
| dependencia de OpenCV | Requerido | None |
| CUDA/cuDNN para GPU | Requerido para el modo GPU | No procede |
| Despliegue de Docker | Complejo (entornos de ejecución nativos) | adición de una sola capa |
| Implementación en entorno aislado | Sí (después de descargar el modelo) | Sí |
| Reconocimiento de texto | ||
| Precisión china/japonesa/coreana | Alto (enfoque principal) | Alta |
| Precisión de la escritura latina | Moderado | Alta |
| Escritura | Limitado | Se admite |
| Manejo de escaneo de baja calidad | Se requiere preprocesamiento manual | Automático |
| Corrección automática de la inclinación | No | Sí |
| Reducción automática de ruido | No | Sí |
| Fuentes de entrada | ||
| Archivos de imagen | Sí (a través de OpenCV) | Sí |
| Archivos PDF (nativos) | No | Sí |
| PDF protegido con contraseña | No | Sí |
| Flujos y matrices de bytes | Mediante OpenCV | Sí |
| TIFF de varias páginas | Mediante OpenCV | Sí |
| Producción | ||
| Texto sin formato | Sí | Sí |
| PDF con función de búsqueda | No | Sí |
| hOCR | No | Sí |
| Cuadros delimitadores a nivel de palabra | Sí | Sí |
| Puntuaciones de confianza | Sí | Sí |
| Jerarquía estructurada de páginas/líneas/palabras | Parcial (solo regiones) | Completo |
| Idiomas disponibles | ||
| Recuento de palabras | ~10-20 | 125+ |
| Método de instalación del idioma | Descarga del paquete de modelos | Paquete NuGet |
| Documento bilingüe | Limitado | Sí |
| Formación lingüística personalizada | Sí (PaddlePaddle) | Sí |
| Soporte de Plataforma | ||
| Windows | Sí | Sí |
| Linux | Sí (configuración compleja) | Sí |
| macOS | Limitado | Sí |
| Docker | Sí (con entornos de ejecución nativos) | Sí |
| AWS Lambda | Complejo | Sí |
| Rendimiento | ||
| Imagen única de CPU | 500–1500 ms | 100–400 ms |
| Imagen única de GPU | 100–300 ms | No procede |
| Memoria (modo CPU) | Más alto | Moderado |
| Lectura de BarCodes durante el OCR | No | Sí |
| Preparación comercial | ||
| Licencia comercial | Apache 2.0 | Perpetuo por desarrollador |
| Canal de soporte | Problemas de GitHub | Soporte por correo electrónico |
| Documentación en inglés | Escaso | Documentación exhaustiva, tutoriales y guías prácticas. |
| Estudios de casos de producción | Poco frecuente (específico de .NET ) | Documentado |
Profundidad de abstracción y riesgo de mantenimiento
PaddleSharp es la única opción de OCR .NET en esta categoría que ejecuta tres proyectos upstream separados como requisitos previos. Esa profundidad es el principal riesgo para los equipos de producción.
Enfoque PaddleSharp
En la práctica, la cadena de dependencias se ve así:
- Baidu PaddlePaddle : el marco de aprendizaje profundo subyacente. Aquí se definen los formatos de modelo y las API de inferencia.
- PaddleOCR : proyecto de entrenamiento de modelos de Baidu que genera los pesos del modelo de detección, clasificación y reconocimiento.
- Sdcb.PaddleSharp : la capa de enlace .NET que llama a las bibliotecas nativas de PaddleInference y encapsula la API de carga del modelo.
Cada capa tiene su propio ritmo de lanzamiento, historial de cambios importantes y comunidad. Cuando Baidu actualiza las API de inferencia de PaddlePaddle, la capa de enlace debe actualizarse. Cuando el formato de un modelo cambia entre versiones de PaddleOCR, las rutas de descarga del modelo y el código de carga en PaddleSharp deben actualizarse. Para un equipo .NET , estos problemas son invisibles hasta que falla una implementación.
Ilustración simplificada del costo de inicialización:
// 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 sensibilidad a las versiones en este caso es real. Los equipos que se han fijado en Sdcb.PaddleOCR 2.x y necesitan actualizar para acceder a modelos más nuevos se enfrentan a cambios en la API en la capa de enlace. Los archivos del modelo ascendente no son compatibles con versiones anteriores entre las principales versiones de PaddleOCR.
Enfoque de IronOCR
IronOCR distribuye el motor y todas las dependencias incluidas en el paquete NuGet . No hay que seleccionar ninguna versión del modelo, configurar ningún sistema de inferencia ni mantener sincronizada ninguna biblioteca secundaria:
// One package: dotnet add package IronOcr
// No model downloads. No OpenCV. No 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
// No model downloads. No OpenCV. No 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
' No model downloads. No OpenCV. No 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 actualización de IronOCR se realiza simplemente actualizando la versión de NuGet . Los cambios en la interfaz de programación de aplicaciones (API) están documentados en las notas de la versión y se mantiene la compatibilidad con versiones anteriores dentro de las versiones principales. Para los equipos que trabajan con pipelines de CI/CD, la diferencia en la superficie de despliegue es sustancial: un paquete frente a cuatro paquetes, más paquetes de tiempo de ejecución específicos de la plataforma, más archivos de modelo que deben existir en el disco en las rutas correctas.
Consulte la guía de configuración de IronTesseract para conocer las opciones de configuración y el tutorial de entrada de imágenes para obtener una lista completa de las fuentes de entrada aceptadas.
Cobertura lingüística
PaddleOCR se entrenó principalmente para el chino, con el inglés como idioma secundario. La comunidad .NET en torno a PaddleSharp refleja ese origen: existen paquetes de modelos para la escritura china (simplificada y tradicional), inglés y algunos otros idiomas, pero la cobertura más allá de aproximadamente 10 a 20 idiomas es escasa, y el mantenimiento de los modelos que no son CJK depende de si el proyecto original mantiene el interés.
Enfoque PaddleSharp
Cambiar de idioma en PaddleSharp implica cambiar el conjunto de modelos. El modelo de reconocimiento es específico del idioma y no existe una opción de API sencilla; se instancia un conjunto diferente de objetos del modelo:
// 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
Para un equipo que procesa facturas en francés, contratos en alemán o formularios en árabe, la cuestión no es solo si existe un paquete de modelos hoy en día, sino si se mantendrá el próximo año y si existe la documentación en inglés para configurarlo.
Enfoque de IronOCR
IronOCR ofrece paquetes NuGet en más de 125 idiomas . Cada paquete de idioma se instala exactamente como cualquier otra dependencia y se integra con las canalizaciones CI/CD estándar sin necesidad de implementar archivos manualmente:
// 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")
La guía de múltiples idiomas cubre el reconocimiento simultáneo de múltiples idiomas para documentos que mezclan scripts, una capacidad que no requiere ninguna decisión a nivel de modelo, solo una llamada AddSecondaryLanguage.
Para los equipos cuyos documentos abarcan varios idiomas, o cuyos requisitos lingüísticos se prevé que superen el alcance inicial, un catálogo de 125 idiomas respaldado por paquetes NuGet con mantenimiento garantizado es una opción más duradera que un conjunto de 10 a 20 idiomas con un compromiso de mantenimiento variable.
Preprocesamiento y compatibilidad con PDF
El sistema de redes neuronales de PaddleOCR gestiona mejor algunas variaciones en la calidad de la imagen que el OCR tradicional para texto CJK, pero no proporciona una API de preprocesamiento de imágenes integrada para tareas como la corrección de la inclinación, la eliminación de ruido o la normalización de la resolución. Cualquier preprocesamiento debe escribirse en OpenCV, una biblioteca que PaddleSharp ya requiere, pero que añade una cantidad considerable de código para los equipos que no son especialistas en procesamiento de imágenes.
La compatibilidad con PDF es el aspecto más difícil de mejorar. PaddleSharp no tiene un lector de PDF nativo. Un sistema de procesamiento de documentos que recibe archivos PDF debe convertir cada página en una imagen antes de llamar al motor OCR, lo que requiere una biblioteca PDF independiente, añade dependencias e introduce una gestión de archivos intermedia.
Enfoque 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
Escribir este preprocesamiento es factible para equipos con experiencia en OpenCV. Para los equipos que no lo utilizan, la curva de aprendizaje no es sencilla: OpenCV tiene una amplia interfaz de programación de aplicaciones (API) y la documentación está escrita principalmente en C++.
Enfoque de IronOCR
El proceso de preprocesamiento de IronOCR no requiere ninguna biblioteca externa. El mismo objeto OcrInput que acepta imágenes también acepta PDFs, y los filtros de preprocesamiento son llamadas de método único:
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
Para la entrada de archivos PDF, la compatibilidad nativa significa que no se requiere ningún paso de conversión:
// 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")
La guía de corrección de la calidad de imagen abarca todos los filtros disponibles con ejemplos. El tutorial sobre la introducción de archivos PDF abarca la selección de páginas, la introducción de flujos de datos y la gestión de contraseñas. Para los equipos que generan archivos PDF con capacidad de búsqueda a partir de documentos escaneados, la salida de PDF con capacidad de búsqueda es un formato de salida integrado, no un paso de procesamiento independiente.
Referencia de mapeo de API
| Concepto OCR PaddleSharp | Equivalente a IronOCR |
|---|---|
Sdcb.PaddleOCR (namespace) |
IronOcr (namespace) |
PaddleOcrAll |
IronTesseract |
LocalFullModels.ChineseV3.DetectionModel |
No hay equivalente: no se necesita selección de modelo. |
LocalFullModels.ChineseV3.RecognitionModel |
No hay equivalente: no se necesita selección de modelo. |
LocalFullModels.ChineseV3.ClassifierModel |
No hay equivalente: no se necesita selección de modelo. |
Cv2.ImRead(path) (carga de imagen OpenCV) |
input.LoadImage(path) |
_ocr.Run(matImage) |
ocr.Read(input) o 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 |
| Cambio de modelo de lenguaje (nuevo conjunto de modelos) | ocr.Language = OcrLanguage.French |
PaddleConfig (configuración del backend de inferencia) |
No hay equivalente: autoconfigurado |
| Operaciones de umbral/escala de grises de OpenCvSharp | input.Binarize(), input.ToGrayScale() |
| Sin soporte para PDF: conversión previa a imagen. | input.LoadPdf("file.pdf") |
| No se genera un archivo PDF con capacidad de búsqueda. | result.SaveAsSearchablePdf("output.pdf") |
Cuando los equipos consideran cambiar de PaddleSharp OCRa IronOCR
El sistema Pipeline procesa documentos que no son CJK (chino, japonés o coreano).
PaddleSharp fue diseñado para el mercado chino. Esa herencia se hace visible en la convención de nombres del modelo (ChineseV3), el idioma principal de la documentación y la disponibilidad de paquetes de idiomas. Un equipo que comienza procesando documentos chinos y luego se expande a facturas francesas o contratos alemanes se topa con un muro infranqueable: los paquetes de modelos disponibles fuera de los idiomas CJK son escasos, el compromiso de mantenimiento para los modelos que no son CJK es incierto y la documentación en inglés para configurarlos es escasa. El catálogo de más de 125 idiomas de IronOCR a través de NuGet significa que la expansión de idiomas se realiza mediante la instalación de un paquete, no como un proyecto de investigación.
El entorno de despliegue no tiene GPU.
El sistema de aprendizaje profundo de PaddleOCR está diseñado para la inferencia mediante GPU. En cuanto al rendimiento de la CPU, las cifras son fiables: entre 500 y 1500 ms por imagen a resoluciones de documento típicas. Para un proceso por lotes que procesa miles de documentos, o para una aplicación ASP.NET que atiende solicitudes de OCR simultáneas, PaddleSharp en modo CPU agrega una latencia que se acumula a medida que aumenta la escala. El motor Tesseract 5 optimizado de IronOCR funciona a un ritmo de 100 a 400 ms por imagen en la CPU, sin necesidad de GPU. Para implementaciones en niveles de máquinas virtuales estándar, contenedores sin transferencia de GPU o trabajadores de CI, esa diferencia radica en la diferencia entre una carga de trabajo que se ajusta y una que no.
Los documentos PDF están en proceso de entrada.
El formato PDF es el formato oficial para los documentos comerciales. PaddleSharp no tiene lector de PDF. Los equipos que descubren esta limitación después de haber desarrollado soluciones basadas en PaddleSharp se enfrentan a una disyuntiva: añadir una biblioteca de PDF (gestionando así otra dependencia con sus propias consideraciones de licencia y versión), convertir los PDF a imágenes como paso de preprocesamiento (añadiendo almacenamiento y sobrecarga de E/S), o migrar a una biblioteca con soporte nativo para PDF. La entrada nativa de PDF de IronOCR, que incluye archivos PDF protegidos con contraseña y selección de rangos de páginas, lo convierte en la opción más sencilla para flujos de trabajo de documentos que comienzan con PDF.
La cadena de dependencias no supera una revisión de seguridad o cumplimiento.
Las implementaciones Enterprise (sanitarias, financieras, gubernamentales) a menudo requieren una lista de materiales de software y una auditoría de dependencias. La cadena de PaddleSharp incluye archivos de modelos originados en Baidu y un entorno de ejecución de inferencia de aprendizaje profundo de Baidu. Para las organizaciones con políticas que restringen los componentes de software a orígenes específicos, o para los equipos que necesitan un camino claro hacia las divulgaciones de seguridad de los proveedores, la dependencia de binarios originados en Baidu requiere pasos de revisión adicionales.IronOCR es un único producto comercial de un proveedor de software occidental con términos de licencia documentados y un servicio de soporte comercial estándar.
El equipo no puede cubrir los gastos operativos.
Mantener una implementación de PaddleSharp durante 18 meses implica realizar un seguimiento de la compatibilidad de las versiones del modelo, coordinar las versiones del paquete de tiempo de ejecución de OpenCV con las implementaciones específicas de la plataforma, mantener alineadas las versiones del kit de herramientas CUDA si se utiliza la GPU y supervisar los problemas de GitHub (principalmente en chino) para detectar cambios incompatibles. Se trata de una inversión operativa considerable. Para los equipos cuya competencia principal es la aplicación que están desarrollando, y no la infraestructura de aprendizaje profundo, los gastos generales de gestionar PaddleSharp no generan un valor proporcional a su coste.
Consideraciones comunes sobre la migración
Eliminando la dependencia de OpenCV
PaddleSharp requiere OpenCvSharp4 y un paquete OpenCvSharp4.runtime.* específico de la plataforma para cargar imágenes.IronOCR acepta System.Drawing.Bitmap, rutas de archivos, flujos y matrices de bytes directamente a través de OcrInput. La migración implica reemplazar llamadas Cv2.ImRead() con input.LoadImage() y eliminar por completo las referencias al paquete 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 = Cv2.ImRead(imagePath)
Dim result = _ocr.Run(image)
End Using
' IronOCR equivalent — no OpenCV
Dim result = New IronTesseract().Read(imagePath)
La guía de entrada de imágenes abarca todos los tipos de entrada aceptados, incluidos flujos de datos, URL y mapas de bits en memoria.
Mapeo de resultados a nivel regional
PaddleSharp devuelve result.Regions: una lista plana de regiones de texto detectadas con rectángulos delimitadores y cadenas de texto.IronOCR devuelve una jerarquía más rica: las páginas contienen párrafos, los párrafos contienen líneas, las líneas contienen palabras, todo ello con coordenadas y puntuaciones de confianza por elemento. Si tu código de migración usa result.Regions, el equivalente de IronOCR para la enumeración plana de palabras con datos de posición es:
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
La guía de lectura de resultados documenta la estructura completa de los resultados. La guía de puntuaciones de confianza explica los valores de confianza por elemento y cómo utilizarlos para el filtrado de calidad.
Gestión del ciclo de vida del motor OCR
La PaddleOcrAll de PaddleSharp es costosa de construir: carga binarios de modelos desde el disco al crearse y debe tratarse como un servicio único o de ámbito en ASP.NET Core. La IronTesseract de IronOCR tiene un costo de inicialización más ligero, pero se aplica el mismo principio: reutilizar instancias a través de solicitudes en una aplicación web es más eficiente que construir por solicitud. En ambos casos, la inyección de dependencias como servicio único o de ámbito por solicitud es el patrón correcto.
Instalación del paquete de idiomas
La compatibilidad con idiomas en PaddleSharp implica seleccionar diferentes conjuntos de modelos en el momento de la construcción. En IronOCR, la compatibilidad con idiomas es un paquete NuGet que se agrega al proyecto y una llamada de configuración de una sola línea:
// 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")
Para los equipos de habla china, japonesa y coreana que migran desde PaddleSharp, el chino simplificado, el chino tradicional, el japonés y el coreano están disponibles como paquetes de idiomas de IronOCR. La guía de lenguaje personalizado abarca la incorporación de datos de prueba entrenados a medida para casos de uso especializados.
Funcionalidades adicionales de IronOCR
Más allá de las características comparadas anteriormente,IronOCR ofrece capacidades que quedan completamente fuera del alcance de PaddleSharp:
- OCR por región: Apunta a zonas específicas de una imagen, como filas de cabecera, totales de facturas, campos específicos de formularios, utilizando
CropRectanglesin procesar la página completa - OCR asíncrono : Soporte asíncrono integrado para integrar OCR en las canalizaciones de solicitudes de ASP.NET Core sin bloquear subprocesos.
- Lectura de pasaportes e identificaciones : Extracción estructurada de datos de zonas legibles por máquina de documentos de viaje y tarjetas de identidad.
- Lectura de tablas : Agrupación espacial de coordenadas de palabras para reconstruir la estructura de filas y columnas a partir de diseños de documentos tabulares.
- Licencias : Licencias perpetuas por desarrollador sin regalías por tiempo de ejecución y uso de desarrollo gratuito en modo de prueba.
Compatibilidad con .NET y preparación para el futuro
IronOCR está dirigido a .NET 8 y .NET 9, con soporte completo para Windows, Linuxy macOSen arquitecturas x64 y x86, y publica guías de implementación de Docker para cargas de trabajo en contenedores. PaddleSharp es compatible con los entornos de ejecución .NET modernos, pero su compatibilidad multiplataforma se complica debido a los paquetes de tiempo de ejecución de OpenCV, que se distribuyen como paquetes NuGet separados específicos de cada plataforma, lo que requiere seleccionar e implementar el correcto para cada entorno. El modelo de implementación de paquete único de IronOCR elimina por completo esta matriz de plataformas, y sus guías de implementación para Linux , AWS y Azure reflejan configuraciones probadas y orientadas a la producción.
Conclusión
PaddleSharp presenta un argumento convincente en un escenario específico: un equipo que procesa principalmente documentos en chino en hardware con una GPU compatible con CUDA, donde el límite de precisión del aprendizaje profundo para texto CJK es más importante que la simplicidad de la implementación. Ese es un caso de uso real, y dentro de él, PaddleSharp cumple. El sistema de red neuronal de tres etapas reconoce textos chinos densos con una precisión que refleja una auténtica inversión en aprendizaje profundo.
Fuera de ese escenario, la profundidad de la abstracción se convierte en un inconveniente. Tres dependencias anteriores —el marco de inferencia de Baidu, el proyecto de entrenamiento del modelo PaddleOCR y la capa de enlace PaddleSharp .NET tienen cada una sus propios ciclos de lanzamiento, y no se garantiza la alineación de su mantenimiento. La documentación en inglés es escasa. El catálogo de idiomas más allá de los caracteres chinos, japoneses y coreanos es escaso y su mantenimiento es inconsistente. La entrada de archivos PDF requiere una biblioteca aparte. Y sin una GPU, la latencia de la CPU por imagen es de 500 a 1500 ms, frente a los 100 a 400 ms de IronOCR.
El intercambio de IronOCR es el inverso: un paquete comercial único con un precio de entrada $999, sin gestión de modelos, entrada nativa de PDF y multi-formato, más de 125 idiomas como paquetes NuGet y preprocesamiento incorporado que elimina la necesidad de OpenCV. La abstracción está diseñada y la abstracción es estable: la API no ha requerido que los equipos sigan los cambios en el formato del modelo de Baidu para mantener sus aplicaciones funcionando.
Para equipos con necesidades generales de OCR en inglés o multilingüe, flujos de trabajo con PDF o limitaciones de implementación que impiden el uso de hardware GPU,IronOCR es la opción ideal. La documentación de IronOCR abarca todos los tipos de entrada, opciones de preprocesamiento y formatos de salida, y el centro de tutoriales proporciona código funcional para tipos de documentos comunes, desde facturas y pasaportes hasta archivos escaneados.
Preguntas Frecuentes
¿Qué es PaddleSharp OCR?
PaddleSharp OCR es una solución de OCR utilizada por desarrolladores y empresas para extraer texto de imágenes y documentos. Es una de las diversas opciones de OCR evaluadas junto con IronOCR for .NET para el desarrollo de aplicaciones.
¿Cómo se compara IronOCR con PaddleSharp OCR para desarrolladores .NET?
IronOCR es una biblioteca de OCR .NET nativa de NuGet que utiliza IronTesseract como motor principal. En comparación con PaddleSharp OCR, ofrece una implementación más sencilla (sin instaladores SDK), precios de tarifa plana y una API de C# limpia sin interoperabilidad COM ni dependencias de la nube.
¿Es IronOCR más fácil de configurar que PaddleSharp OCR?
IronOCR se instala mediante un único paquete NuGet. No hay instaladores de SDK, archivos de licencia que copiar, componentes COM que registrar ni binarios de ejecución independientes que gestionar. Todo el motor de OCR está incluido en el paquete.
¿Qué diferencias de precisión existen entre PaddleSharp OCR y IronOCR?
IronOCR logra una alta precisión de reconocimiento para documentos comerciales estándar, facturas, recibos y formularios escaneados. Para documentos muy degradados o escrituras poco comunes, la precisión varía en función de la calidad de la fuente. IronOCR incluye filtros de preprocesamiento de imágenes para mejorar el reconocimiento en entradas de baja calidad.
¿Es IronOCR compatible con la extracción de texto en PDF?
Sí. IronOCR extrae texto tanto de PDF nativos como de imágenes PDF escaneadas en una sola llamada. También admite archivos TIFF de varias páginas, imágenes y secuencias. En el caso de los PDF escaneados, el OCR se aplica página a página con objetos de resultado por página.
¿Qué diferencia hay entre las licencias de PaddleSharp OCR y las de IronOCR?
IronOCR utiliza una licencia perpetua de tarifa plana sin cargos por página o por escaneo. Las organizaciones que procesan grandes volúmenes de documentos pagan el mismo coste de licencia independientemente del volumen. Encontrará más información y precios por volumen en la página de licencias de IronOCR.
¿Qué idiomas admite IronOCR?
IronOCR es compatible con 127 idiomas a través de paquetes de idiomas NuGet independientes. Para añadir un idioma, basta con ejecutar el comando 'dotnet add package IronOcr.Languages.{Language}'. No es necesaria la colocación manual de archivos ni la configuración de rutas.
¿Cómo instalo IronOCR en un proyecto .NET ?
Instalación a través de NuGet: install-Package IronOcr' en la consola del gestor de paquetes o 'dotnet add package IronOcr' en la CLI. Los paquetes de idiomas adicionales se instalan del mismo modo. No se requiere ningún instalador nativo del SDK.
¿Es IronOCR adecuado para Docker y las implementaciones en contenedores, a diferencia de PaddleSharp?
Sí. IronOCR funciona en contenedores Docker a través de su paquete NuGet. La clave de licencia se establece mediante una variable de entorno. No se requieren archivos de licencia, rutas de SDK ni montajes de volumen para el propio motor de OCR.
¿Puedo probar IronOCR antes de comprarlo, en comparación con PaddleSharp?
Sí. El modo de prueba de IronOCR procesa documentos y devuelve resultados de OCR con una marca de agua superpuesta en la salida. Puede verificar la precisión en sus propios documentos antes de adquirir una licencia.
¿Admite IronOCR la lectura de códigos de barras junto con la extracción de texto?
IronOCR se centra en la extracción de texto y el reconocimiento óptico de caracteres. Para la lectura de códigos de barras, Iron Software ofrece IronBarcode como biblioteca complementaria. Ambas están disponibles por separado o como parte del paquete Iron Suite.
¿Es fácil migrar de PaddleSharp OCR a IronOCR?
La migración de PaddleSharp OCR a IronOCR suele implicar la sustitución de las secuencias de inicialización por la instanciación de IronTesseract, la eliminación de la gestión del ciclo de vida COM y la actualización de las llamadas a la API. La mayoría de las migraciones reducen significativamente la complejidad del código.

