IronOCR vs LLMs para cumplimiento AEAT y Facturae: OCR determinista en .NET
Cuatro archivos de modelo. Eso es lo primero que exige RapidOCR .NET antes de poder reconocer un solo carácter: un modelo de detección, un clasificador de dirección, un modelo de reconocimiento y un diccionario de caracteres, cada uno descargado por separado de una página de lanzamientos de GitHub y conectado entre sí mediante una configuración de ruta explícita. Antes de que tu primera llamada engine.Run() devuelva un resultado, ya has gestionado una secuencia de descarga manual, editado rutas de archivos en el código, agregado reglas de copia de MSBuild a tu .csproj, y confirmado que los binarios nativos de ONNX Runtime coinciden con tu objetivo de despliegue. Para un equipo que evalúa opciones de OCR para producción, esa ceremonia de configuración resume a la perfección la historia de RapidOCR .NET .
Comprender RapidOCR .NET
RapidOCR .NET es una capa de abstracción .NET mantenida por la comunidad que envuelve el proyecto RapidOCR, el cual a su vez es una adaptación optimizada para CPU de los modelos de aprendizaje profundo PaddleOCR de Baidu al formato ONNX. El paquete de NuGet (RapidOcrNet) es mantenido por un único desarrollador (BobLd en GitHub) bajo una licencia Apache 2.0. Es importante comprender que el linaje importa: la biblioteca se encuentra a tres capas de abstracción de la tecnología original: Baidu PaddlePaddle, PaddleOCR, la conversión comunitaria RapidOCR ONNX y el envoltorio .NET .
Características arquitectónicas clave:
- Requisito de modelo de 4 archivos: La detección (
det.onnx), clasificador de dirección (cls.onnx), reconocimiento (rec.onnx), y diccionario de caracteres (keys.txt) deben estar presentes en rutas configuradas antes de que el motor se inicialice. - Dependencia de ONNX Runtime: Requiere
Microsoft.ML.OnnxRuntime(CPU) oMicrosoft.ML.OnnxRuntime.Gpu(CUDA), agregando 30–50 MB al tamaño de la aplicación. Los binarios de tiempo de ejecución deben coincidir con la plataforma de implementación. - Restricción lingüística: Los modelos se entrenan principalmente en chino e inglés. No se admiten idiomas europeos (español, francés, alemán), alfabetos cirílicos (ruso, ucraniano), árabe, hebreo ni alfabetos índicos. Los japoneses y los coreanos cuentan con modelos experimentales limitados, fruto de la contribución de la comunidad.
- Entrada solo de imágenes: RapidOCR .NET no tiene soporte nativo para PDF. El procesamiento de un PDF requiere una biblioteca de renderizado externa para convertir las páginas en imágenes, realizar el reconocimiento óptico de caracteres (OCR) de cada imagen individualmente y volver a ensamblar los resultados manualmente.
- Latencia de arranque en frío: La carga del modelo tarda entre 2 y 5 segundos en la primera ejecución y consume entre 300 y 500 MB de memoria durante la ejecución.
- Alcance comunitario: El proyecto tiene una presencia limitada en Stack Overflow, una documentación mínima más allá del archivo README y no cuenta con soporte comercial ni un acuerdo de nivel de servicio (SLA) de mantenimiento.
- No se permite la búsqueda en la salida PDF: La biblioteca extrae el texto de las imágenes. No puede volver a escribir los resultados del OCR en un PDF como una capa de texto con capacidad de búsqueda.
Sobrecarga de configuración de 4 modelos
Todas las aplicaciones RapidOCR .NET comienzan con este bloque de inicialización, independientemente de su complejidad:
// RapidOcrNet: 4 paths required — any missing file throws at runtime
var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "./models/det.onnx", // ~3 MB download
ClsModelPath = "./models/cls.onnx", // ~1 MB download
RecModelPath = "./models/rec_en.onnx", // ~2–10 MB depending on language
KeysPath = "./models/en_keys.txt" // ~100 KB character dictionary
});
// Text blocks returned — must be sorted and joined manually
var result = engine.Run(imagePath);
var text = string.Join("\n", result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left)
.Select(b => b.Text));
// RapidOcrNet: 4 paths required — any missing file throws at runtime
var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "./models/det.onnx", // ~3 MB download
ClsModelPath = "./models/cls.onnx", // ~1 MB download
RecModelPath = "./models/rec_en.onnx", // ~2–10 MB depending on language
KeysPath = "./models/en_keys.txt" // ~100 KB character dictionary
});
// Text blocks returned — must be sorted and joined manually
var result = engine.Run(imagePath);
var text = string.Join("\n", result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.ThenBy(b => b.BoundingBox.Left)
.Select(b => b.Text));
Imports System.Linq
' RapidOcrNet: 4 paths required — any missing file throws at runtime
Dim engine = New RapidOcrEngine(New RapidOcrOptions With {
.DetModelPath = "./models/det.onnx", ' ~3 MB download
.ClsModelPath = "./models/cls.onnx", ' ~1 MB download
.RecModelPath = "./models/rec_en.onnx", ' ~2–10 MB depending on language
.KeysPath = "./models/en_keys.txt" ' ~100 KB character dictionary
})
' Text blocks returned — must be sorted and joined manually
Dim result = engine.Run(imagePath)
Dim text = String.Join(vbCrLf, result.TextBlocks _
.OrderBy(Function(b) b.BoundingBox.Top) _
.ThenBy(Function(b) b.BoundingBox.Left) _
.Select(Function(b) b.Text))
Cambiar a OCR chino no es un cambio de configuración, es un intercambio de archivos. El modelo de reconocimiento en inglés (en_rec.onnx / en_keys.txt) y el modelo de reconocimiento chino (ch_rec.onnx / ch_keys.txt) son descargas separadas. Si un documento contiene texto en chino y en español, no hay solución: los modelos en español no existen en absoluto en el catálogo de modelos de RapidOCR.
El .csproj también requiere entradas explícitas de MSBuild para copiar los cuatro archivos en la compilación:
<ItemGroup>
<Content Include="models\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<Content Include="models\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
Si se omite ese paso, la implementación en producción falla silenciosamente en tiempo de ejecución cuando las rutas no se resuelven en nada.
Comprender IronOCR
IronOCR es una biblioteca OCR comercial .NET basada en un motor Tesseract 5 optimizado, diseñada para funcionar desde un único paquete NuGet sin archivos de modelo externos, sin gestión de datos de tess y sin configuración binaria nativa. Está dirigido a toda la gama de escenarios de desarrollo .NET : aplicaciones web ASP.NET , procesadores por lotes de consola, herramientas de escritorio WPF, Azure Functions, AWS Lambda, contenedores Docker y aplicaciones móviles MAUI, en Windows, Linux, macOS y ARM.
Características clave:
- Despliegue de paquete único:
dotnet add package IronOcres la instalación completa. Todos los archivos binarios del motor, los datos de idioma para la configuración predeterminada (inglés) y los algoritmos de preprocesamiento se incluyen dentro del paquete. - Proceso de 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 ejecutan automáticamente en las imágenes que lo requieren. La aplicación manual del filtro está disponible cuando sea necesario.
- Soporte nativo de PDF: Los PDFs se alimentan directamente a
IronTesseract.Read()sin paso de conversión. Los PDFs protegidos con contraseña aceptan un parámetroPassword. La generación de un archivo PDF con capacidad de búsqueda se realiza mediante una única llamada a un método sobre el resultado. - 125+ idiomas a través de NuGet: Cada paquete de idioma (
IronOcr.Languages.French,IronOcr.Languages.Arabic, etc.) se instala como una dependencia de NuGet. Cambiar de idioma es una asignación de propiedad, no una descarga de archivo. - Modelo de resultado estructurado:
OcrResultexpone.Pages,.Paragraphs,.Lines,.Words, y puntajes de confianza por palabra con coordenadas de caja delimitadora. - Seguro para subprocesos y sin estado: Múltiples instancias de
IronTesseractse ejecutan en paralelo sin bloqueos o estado compartido. - Soporte comercial: Licenciado de forma perpetua desde $999 (Lite), con soporte por correo electrónico y una API con versiones en mantenimiento activo.
Comparación de características
| Característica | RapidOCR.NET | IronOCR |
|---|---|---|
| Instalación | Descargas de NuGet + 4 modelos manuales | Paquete NuGet único |
| Soporte de idiomas | ~5(solo CJK + inglés) | Más de 125 paquetes de idiomas NuGet |
| Entrada nativa de PDF | No | Sí |
| Salida en PDF con capacidad de búsqueda | No | Sí |
| Preprocesamiento integrado | No | Sí (filtros automáticos + manuales) |
| Apoyo comercial | Ninguno (comunidad) | Sí (incluido con la licencia) |
Comparación detallada de características
| Categoría / Característica | RapidOCR.NET | IronOCR |
|---|---|---|
| Configuración e instalación | ||
| Instalación de NuGet | Sí | Sí |
| Se requiere la descarga de modelos externos. | Sí (4 archivos) | No |
| Se requiere configuración de ruta | Sí | No |
| Se requieren reglas de copia de MSBuild | Sí | No |
| Funciona inmediatamente después de la instalación de NuGet. | No | Sí |
| Idiomas disponibles | ||
| Inglés | Sí | Sí |
| Chino simplificado / tradicional | Sí (enfoque principal) | Sí |
| japonés | Solo experimental | Sí |
| coreano | Solo experimental | Sí |
| Idiomas europeos (español, francés, alemán, etc.) | No | Sí (30+) |
| Cirílico (ruso, ucraniano, etc.) | No | Sí (mayores de 15 años) |
| Árabe / Hebreo | No | Sí |
| Escrituras índicas (hindi, bengalí, tamil) | No | Sí (10+) |
| OCR simultáneo multilingüe | No | Sí |
| Idiomas compatibles en total | ~5 | 125+ |
| Formatos de entrada | ||
| JPEG / PNG / BMP / TIFF | Sí | Sí |
| PDF (nativo, sin conversión) | No | Sí |
| PDF protegido con contraseña | No | Sí |
| Flujo / matriz de bytes | Limitado | Sí |
| Entrada de URL | No | Sí |
| Producción | ||
| Texto sin formato | Sí | Sí |
| Cuadros delimitadores de bloques de texto | Sí | Sí |
| Palabras / líneas / párrafos estructurados | Parcial (solo bloques) | Sí |
| Puntuaciones de confianza por palabra | Sí (por bloque) | Sí |
| PDF con función de búsqueda | No | Sí |
| Exportación hOCR | No | Sí |
| Preprocesamiento | ||
| Preprocesamiento automático | No | Sí |
| Inclinación | No | Sí |
| Reducción de ruido | No | Sí |
| Contraste / binarizar | No | Sí |
| Mejora de la resolución | No | Sí |
| Despliegue | ||
| Paquete único autónomo | No (4 o más archivos externos) | Sí |
| Soporte para Docker | Se requiere una copia del modelo manual. | Sí (listo para usar) |
| Soporte para Linux | Requiere binarios nativos de ONNX Runtime. | Sí |
| Compatibilidad con macOS | Requiere binarios nativos de ONNX Runtime. | Sí |
| Soporte y mantenimiento | ||
| Soporte comercial / SLA | No | Sí |
| Mantenimiento activo respaldado por la empresa | No (desarrollador comunitario único) | Sí |
| Tipo de licencia | Apache 2.0 (gratuito) | Comercial perpetua ($999+) |
Gestión de modelos ONNX frente a configuración cero
La principal diferencia operativa entre RapidOCR .NET e IronOCR no radica en la precisión, sino en el coste continuo de gestionar cuatro archivos de modelo externos en todos los entornos que utiliza la aplicación.
Enfoque RapidOCR .NET
Los archivos del modelo no se incluyen en el paquete NuGet . Estos archivos se encuentran en las páginas de lanzamiento de GitHub del proyecto RapidOCR y deben descargarse de forma independiente, versionarse manualmente e implementarse junto con su aplicación. Cuando el proyecto RapidOCR publique modelos actualizados para una mayor precisión, deberá repetir la secuencia de descarga y reemplazar los archivos en su implementación.
En un pipeline CI/CD, los archivos de modelo deben ser comprometidos en el repositorio (agregando 15–25 MB de datos binarios al historial de Git) o ser buscados durante el paso de compilación con scripts personalizados. En un contenedor Docker, el conjunto de modelos de cada idioma agrega una instrucción COPY dedicada y una capa no trivial. En un despliegue de Kubernetes, los archivos de modelo suelen acabar en un volumen montado o integrados en la imagen, y en ambos casos se requieren políticas sobre cómo se propagan las actualizaciones.
La lógica de validación en los archivos fuente hace que la fragilidad sea tangible:
// RapidOcrNet: Runtime validation needed because any missing file crashes the engine
public static bool ValidateModelFiles()
{
var requiredFiles = new[]
{
Path.Combine(ModelDirectory, "det.onnx"),
Path.Combine(ModelDirectory, "cls.onnx"),
Path.Combine(ModelDirectory, "rec_en.onnx"),
Path.Combine(ModelDirectory, "en_keys.txt")
};
var missingFiles = requiredFiles.Where(f => !File.Exists(f)).ToList();
if (missingFiles.Any())
{
Console.WriteLine("ERROR: Missing required model files:");
foreach (var file in missingFiles)
Console.WriteLine($" - {file}");
return false;
}
return true;
}
// RapidOcrNet: Runtime validation needed because any missing file crashes the engine
public static bool ValidateModelFiles()
{
var requiredFiles = new[]
{
Path.Combine(ModelDirectory, "det.onnx"),
Path.Combine(ModelDirectory, "cls.onnx"),
Path.Combine(ModelDirectory, "rec_en.onnx"),
Path.Combine(ModelDirectory, "en_keys.txt")
};
var missingFiles = requiredFiles.Where(f => !File.Exists(f)).ToList();
if (missingFiles.Any())
{
Console.WriteLine("ERROR: Missing required model files:");
foreach (var file in missingFiles)
Console.WriteLine($" - {file}");
return false;
}
return true;
}
Imports System
Imports System.IO
Imports System.Linq
Public Class RapidOcrNet
Public Shared Function ValidateModelFiles() As Boolean
Dim requiredFiles = {
Path.Combine(ModelDirectory, "det.onnx"),
Path.Combine(ModelDirectory, "cls.onnx"),
Path.Combine(ModelDirectory, "rec_en.onnx"),
Path.Combine(ModelDirectory, "en_keys.txt")
}
Dim missingFiles = requiredFiles.Where(Function(f) Not File.Exists(f)).ToList()
If missingFiles.Any() Then
Console.WriteLine("ERROR: Missing required model files:")
For Each file In missingFiles
Console.WriteLine($" - {file}")
Next
Return False
End If
Return True
End Function
End Class
Las aplicaciones de producción que utilizan RapidOCR .NET suelen incluir una validación de inicio como esta, ya que la falta de un archivo de modelo no produce un error claro en el momento de la instalación del paquete, sino que provoca un fallo en tiempo de ejecución cuando el motor se inicializa por primera vez. Ese fallo se manifiesta en la producción, no en la fase de desarrollo.
Enfoque de IronOCR
No hay archivos de modelo que gestionar. Después de dotnet add package IronOcr, el motor está listo:
// IronOCR: no model downloads, no path configuration, no validation boilerplate
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
// IronOCR: no model downloads, no path configuration, no validation boilerplate
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
' IronOCR: no model downloads, no path configuration, no validation boilerplate
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text = New IronTesseract().Read("document.jpg").Text
La guía de configuración de IronTesseract muestra la ruta de instalación completa. Los paquetes de idiomas que se extienden más allá del inglés son paquetes de NuGet — dotnet add package IronOcr.Languages.French — y el paso de restauración maneja todo, incluso en pipelines CI/CD que ya restauran las dependencias de NuGet. No hay decisiones de .gitignore sobre archivos de modelo binarios, ni capas COPY en Dockerfiles, ni scripts de validación de inicio.
Para equipos que despliegan en Docker, la guía de Docker de IronOCR cubre la única dependencia del sistema requerida (libgdiplus en imágenes basadas en Debian/Ubuntu) y nada más.
Soporte lingüístico
Enfoque RapidOCR .NET
La cobertura lingüística de RapidOCR.NET refleja su origen. PaddleOCR fue creado por Baidu para facilitar las búsquedas en internet en idioma chino. Sus modelos son excelentes tanto para el chino simplificado como para el chino tradicional. Se incluye soporte en inglés, pero no era el objetivo principal del diseño. Los modelos japoneses y coreanos, aportados por la comunidad, están marcados como experimentales. Para el resto de idiomas —español, francés, alemán, ruso, árabe, hindi, portugués y más de 100 idiomas adicionales— no existe un modelo disponible.
Para cambiar entre los idiomas compatibles es necesario descargar diferentes archivos de modelo:
// RapidOcrNet: Inglés engine
var englishEngine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelPath, "det.onnx"),
ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
RecModelPath = Path.Combine(modelPath, "en_rec.onnx"), // English-specific
KeysPath = Path.Combine(modelPath, "en_keys.txt") // English-specific
});
// RapidOcrNet: Chinese engine — different rec and keys files required
var chineseEngine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelPath, "det.onnx"),
ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
RecModelPath = Path.Combine(modelPath, "ch_rec.onnx"), // Different download
KeysPath = Path.Combine(modelPath, "ch_keys.txt") // Different download
});
// Spanish? NotSupportedException — no model exists
// RapidOcrNet: Inglés engine
var englishEngine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelPath, "det.onnx"),
ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
RecModelPath = Path.Combine(modelPath, "en_rec.onnx"), // English-specific
KeysPath = Path.Combine(modelPath, "en_keys.txt") // English-specific
});
// RapidOcrNet: Chinese engine — different rec and keys files required
var chineseEngine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = Path.Combine(modelPath, "det.onnx"),
ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
RecModelPath = Path.Combine(modelPath, "ch_rec.onnx"), // Different download
KeysPath = Path.Combine(modelPath, "ch_keys.txt") // Different download
});
// Spanish? NotSupportedException — no model exists
Imports System.IO
' RapidOcrNet: Inglés engine
Dim englishEngine = New RapidOcrEngine(New RapidOcrOptions With {
.DetModelPath = Path.Combine(modelPath, "det.onnx"),
.ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
.RecModelPath = Path.Combine(modelPath, "en_rec.onnx"), ' English-specific
.KeysPath = Path.Combine(modelPath, "en_keys.txt") ' English-specific
})
' RapidOcrNet: Chinese engine — different rec and keys files required
Dim chineseEngine = New RapidOcrEngine(New RapidOcrOptions With {
.DetModelPath = Path.Combine(modelPath, "det.onnx"),
.ClsModelPath = Path.Combine(modelPath, "cls.onnx"),
.RecModelPath = Path.Combine(modelPath, "ch_rec.onnx"), ' Different download
.KeysPath = Path.Combine(modelPath, "ch_keys.txt") ' Different download
})
' Spanish? NotSupportedException — no model exists
Una aplicación que necesita procesar documentos en inglés, chino y español desde la misma cola no tiene una ruta viable en RapidOCR .NET para los documentos en español.
Enfoque de IronOCR
IronOCR admite más de 125 idiomas , cada uno disponible como un paquete de idioma NuGet . El cambio es una asignación de propiedad enum en la instancia IronTesseract — sin descargas de archivos, sin recreación del motor:
// IronOCR: language switching is a property change, not a file swap
var ocr = new IronTesseract();
// English
ocr.Language = OcrLanguage.English;
// Chinese Simplified
ocr.Language = OcrLanguage.ChineseSimplified;
// Spanish — no model download needed
ocr.Language = OcrLanguage.Spanish;
// Arabic — just works
ocr.Language = OcrLanguage.Arabic;
// Russian — just works
ocr.Language = OcrLanguage.Russian;
var result = ocr.Read("document.jpg");
// IronOCR: language switching is a property change, not a file swap
var ocr = new IronTesseract();
// English
ocr.Language = OcrLanguage.English;
// Chinese Simplified
ocr.Language = OcrLanguage.ChineseSimplified;
// Spanish — no model download needed
ocr.Language = OcrLanguage.Spanish;
// Arabic — just works
ocr.Language = OcrLanguage.Arabic;
// Russian — just works
ocr.Language = OcrLanguage.Russian;
var result = ocr.Read("document.jpg");
Imports IronOcr
Dim ocr As New IronTesseract()
' English
ocr.Language = OcrLanguage.English
' Chinese Simplified
ocr.Language = OcrLanguage.ChineseSimplified
' Spanish — no model download needed
ocr.Language = OcrLanguage.Spanish
' Arabic — just works
ocr.Language = OcrLanguage.Arabic
' Russian — just works
ocr.Language = OcrLanguage.Russian
Dim result = ocr.Read("document.jpg")
Los documentos de varios idiomas usan AddSecondaryLanguage:
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English);
var result = ocr.Read("mixed-document.jpg");
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.ChineseSimplified;
ocr.AddSecondaryLanguage(OcrLanguage.English);
var result = ocr.Read("mixed-document.jpg");
Imports IronOcr
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.ChineseSimplified
ocr.AddSecondaryLanguage(OcrLanguage.English)
Dim result = ocr.Read("mixed-document.jpg")
La guía práctica para varios idiomas y el ejemplo de idiomas internacionales cubren en detalle la instalación del paquete de idiomas y la configuración del idioma secundario.
Capacidades de procesamiento y salida de PDF
Enfoque RapidOCR .NET
RapidOCR .NET procesa imágenes. Los archivos PDF no son imágenes. La biblioteca no tiene capacidad para generar archivos PDF, ni para escribirlos, ni ningún mecanismo para producir archivos PDF con capacidad de búsqueda. La extracción de texto de un PDF escaneado con RapidOCR .NET requiere al menos tres componentes separados:
// RapidOcrNet: PDF processing requires external library + manual assembly
public async Task<string> ExtractTextFromPdf(string pdfPath)
{
// Step 1: Requires PdfPig, Docotic, or similar external library
var pageImages = await RenderPdfToImages(pdfPath);
// Step 2: Initialize RapidOcr with 4 model files (must already be downloaded)
using var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "models/det.onnx",
ClsModelPath = "models/cls.onnx",
RecModelPath = "models/rec_en.onnx",
KeysPath = "models/en_keys.txt"
});
// Step 3: OCR each image individually
var results = new List<string>();
foreach (var pageImage in pageImages)
{
var result = engine.Run(pageImage);
results.Add(string.Join("\n", result.TextBlocks.Select(b => b.Text)));
}
// Step 4: Combine manually — page structure not preserved
return string.Join("\n\n", results);
}
// RapidOcrNet: PDF processing requires external library + manual assembly
public async Task<string> ExtractTextFromPdf(string pdfPath)
{
// Step 1: Requires PdfPig, Docotic, or similar external library
var pageImages = await RenderPdfToImages(pdfPath);
// Step 2: Initialize RapidOcr with 4 model files (must already be downloaded)
using var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "models/det.onnx",
ClsModelPath = "models/cls.onnx",
RecModelPath = "models/rec_en.onnx",
KeysPath = "models/en_keys.txt"
});
// Step 3: OCR each image individually
var results = new List<string>();
foreach (var pageImage in pageImages)
{
var result = engine.Run(pageImage);
results.Add(string.Join("\n", result.TextBlocks.Select(b => b.Text)));
}
// Step 4: Combine manually — page structure not preserved
return string.Join("\n\n", results);
}
Imports System.Threading.Tasks
Imports System.Collections.Generic
Imports System.Linq
Public Class PdfTextExtractor
' RapidOcrNet: PDF processing requires external library + manual assembly
Public Async Function ExtractTextFromPdf(pdfPath As String) As Task(Of String)
' Step 1: Requires PdfPig, Docotic, or similar external library
Dim pageImages = Await RenderPdfToImages(pdfPath)
' Step 2: Initialize RapidOcr with 4 model files (must already be downloaded)
Using engine As New RapidOcrEngine(New RapidOcrOptions With {
.DetModelPath = "models/det.onnx",
.ClsModelPath = "models/cls.onnx",
.RecModelPath = "models/rec_en.onnx",
.KeysPath = "models/en_keys.txt"
})
' Step 3: OCR each image individually
Dim results As New List(Of String)()
For Each pageImage In pageImages
Dim result = engine.Run(pageImage)
results.Add(String.Join(vbLf, result.TextBlocks.Select(Function(b) b.Text)))
Next
' Step 4: Combine manually — page structure not preserved
Return String.Join(vbLf & vbLf, results)
End Using
End Function
' Placeholder for the RenderPdfToImages method
Private Async Function RenderPdfToImages(pdfPath As String) As Task(Of List(Of Object))
' Implementation goes here
Return New List(Of Object)()
End Function
End Class
Esto añade otra dependencia de NuGet , otro conjunto de superficies de API que aprender y una presión de memoria al mantener en memoria los mapas de bits renderizados por página para documentos grandes. La generación de archivos PDF con capacidad de búsqueda —que consiste en escribir el texto reconocido como una capa OCR oculta sobre el escaneo original— no es posible en ningún punto de este proceso.
Enfoque de IronOCR
IronOCR lee archivos PDF de forma nativa. El mismo método IronTesseract.Read() acepta tanto rutas de imagen como rutas de PDF:
// IronOCR: direct PDF OCR — no conversion, no external library
var text = new IronTesseract().Read("scanned-document.pdf").Text;
// PDF protegido con contraseña — one parameter
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
// PDF con función de búsqueda — one method call on the result
var result = new IronTesseract().Read("scanned.pdf");
result.SaveAsSearchablePdf("searchable-output.pdf");
// IronOCR: direct PDF OCR — no conversion, no external library
var text = new IronTesseract().Read("scanned-document.pdf").Text;
// PDF protegido con contraseña — one parameter
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
// PDF con función de búsqueda — one method call on the result
var result = new IronTesseract().Read("scanned.pdf");
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
' IronOCR: direct PDF OCR — no conversion, no external library
Dim text As String = New IronTesseract().Read("scanned-document.pdf").Text
' PDF protegido con contraseña — one parameter
Using input As New OcrInput()
input.LoadPdf("encrypted.pdf", Password:="secret")
Dim result = New IronTesseract().Read(input)
End Using
' PDF con función de búsqueda — one method call on the result
Dim result2 = New IronTesseract().Read("scanned.pdf")
result2.SaveAsSearchablePdf("searchable-output.pdf")
El tutorial sobre la introducción de archivos PDF abarca la selección de páginas, la gestión de contraseñas y el procesamiento de varias páginas. El tutorial en formato PDF con función de búsqueda muestra cómo crear un documento que cumpla con los estándares de conformidad y que, visualmente, sea idéntico al escaneo original, a la vez que se añade una capa de búsqueda de texto completo. Para los equipos que desarrollan sistemas de archivo de documentos, ese formato de salida es el objetivo final, y no requiere ninguna dependencia adicional más allá del propio paquete IronOCR.
Preparación para la producción y madurez de la comunidad
Enfoque RapidOCR .NET
RapidOCR .NET es un proyecto más reciente. Su repositorio de GitHub tiene una actividad de contribuciones y un número de estrellas limitados en comparación con las bibliotecas OCR .NET ya establecidas. Stack Overflow tiene una cobertura mínima. Cuando surgen casos excepcionales en producción (orientaciones de imagen inusuales, conjuntos de caracteres específicos, conflictos de versión de ONNX Runtime, configuración del modo GPU), el recurso principal es el sistema de seguimiento de incidencias de GitHub . No existe un nivel de soporte comercial, ni un acuerdo de nivel de servicio (SLA) para el mantenimiento, ni un plazo de respuesta garantizado.
La cadena de dependencias introduce un riesgo adicional. RapidOCR .NET depende de las versiones del modelo del proyecto RapidOCR. El proyecto RapidOCR depende de la arquitectura del modelo de PaddleOCR. Un cambio incompatible en cualquier nivel de esa cadena requiere que el responsable del mantenimiento del wrapper de .NET responda antes de que los usuarios puedan actualizar, y el wrapper es mantenido por un único desarrollador de la comunidad sin respaldo organizativo.
La implementación también pone de manifiesto problemas de versionado de ONNX Runtime. El paquete Microsoft.ML.OnnxRuntime ha tenido cambios importantes entre versiones menores, y los binarios nativos que se envían con él son específicos de la plataforma. Una imagen de contenedor construida en linux/amd64 no puede usar los mismos binarios de ONNX Runtime que una construida en linux/arm64. Cada destino de despliegue requiere validación.
Enfoque de IronOCR
IronOCR lleva más de una década en fase de desarrollo comercial activo. La biblioteca se distribuye bajo una API versionada con cambios incompatibles documentados, lanzamientos periódicos alineados con los lanzamientos del SDK de .NET y soporte por correo electrónico incluido con cada licencia comercial. Los equipos que desarrollan pipelines de producción obtienen una vía de soporte directa en lugar de una cola de incidencias de GitHub supervisada por un solo desarrollador en su tiempo libre.
El diseño de paquete único elimina por completo el ciclo de validación de la implementación. El paso de restauración de NuGet es determinista: la misma versión del paquete produce la misma instalación funcional en Windows, Linux y macOS sin necesidad de gestionar binarios nativos específicos de cada plataforma. Para las implementaciones de AWS Lambda y Azure , el paquete de funciones contiene únicamente la aplicación publicada; no incluye archivos de modelo auxiliares, ni montajes de volumen, ni lógica de validación de inicio.
El ejemplo de escaneo de baja calidad y la guía práctica para la corrección de la calidad de la imagen cubren los escenarios de preprocesamiento que normalmente requieren código personalizado en las canalizaciones basadas en ONNX (escaneos sesgados, fondos ruidosos, documentos de bajo contraste) sin necesidad de escribir ningún código más allá de seleccionar los métodos de filtro adecuados.
Referencia de mapeo de API
| RapidOCR.NET | Equivalente a IronOCR |
|---|---|
new RapidOcrEngine(new RapidOcrOptions { ... })|new IronTesseract()` |
|
RapidOcrOptions.DetModelPath |
No es necesario — incluido |
RapidOcrOptions.ClsModelPath |
No es necesario — incluido |
RapidOcrOptions.RecModelPath |
No es necesario — incluido |
RapidOcrOptions.KeysPath |
No es necesario — incluido |
RapidOcrOptions.UseGpu |
No existe un equivalente directo (optimizado internamente para CPU). |
RapidOcrOptions.NumThreads |
IronTesseract (seguro para subprocesos; use Parallel.ForEach) |
engine.Run(imagePath) |
new IronTesseract().Read(imagePath) |
result.TextBlocks |
result.Words / result.Lines / result.Paragraphs |
result.TextBlocks[i].Text |
result.Words[i].Text |
result.TextBlocks[i].Confidence |
result.Words[i].Confidence |
result.TextBlocks[i].BoundingBox |
result.Words[i].X, .Y, .Width, .Height |
string.Join("\n", result.TextBlocks.Select(b => b.Text)) |
result.Text |
| Intercambio manual de archivos de idioma | ocr.Language = OcrLanguage.French |
PDF-a-imagen + engine.Run() |
new IronTesseract().Read("doc.pdf") |
| No disponible | result.SaveAsSearchablePdf("output.pdf") |
| No disponible | result.SaveAsHocrFile("output.hocr") |
engine.Dispose() |
using var ocr = new IronTesseract() |
Cuando los equipos consideran migrar de RapidOCR .NET a IronOCR
Cuando la gestión de archivos de modelo se convierte en un cuello de botella en la implementación
Los equipos que comenzaron con RapidOCR .NET para un prototipo suelen toparse con la dificultad de gestionar los archivos del modelo al intentar implementarlo en producción. Los cuatro archivos del modelo deben estar versionados, controlados, copiados durante la compilación, incluidos en los artefactos de CI, implementados en el entorno de pruebas e implementados en producción, todo ello independientemente del gráfico de dependencias de NuGet . En un equipo pequeño, esos gastos operativos se absorben una vez y se olvidan. En un equipo que mantiene múltiples servicios, múltiples entornos y múltiples pipeliness de CI, la creación de scripts personalizados alrededor de la distribución de archivos de modelo acumula un costo de mantenimiento significativo. Cuando un compañero de equipo pregunta "¿por qué tenemos esta carpeta models/ en el repositorio y qué sucede si la elimino?" y la respuesta requiere una explicación de cinco minutos, usualmente es cuando comienza la evaluación.IronOCR elimina por completo la interfaz de gestión del modelo: no hay que descargar nada por separado, no hay que copiar nada en la integración continua ni validar nada al iniciar el sistema.
Cuando un documento llega en un idioma no compatible
La falta de cobertura lingüística es un obstáculo insalvable, no un problema de configuración. Si una organización recibe contratos alemanes, facturas francesas, órdenes de compra rusas o correspondencia árabe, RapidOCR .NET no ofrece ninguna vía para esos documentos; no se trata de una "precisión limitada", sino de que no hay modelo ni resultado. Los equipos que inicialmente eligieron RapidOCR .NET para un caso de uso centrado en caracteres chinos, japoneses y coreanos (CJK) descubren esta limitación la primera vez que necesitan procesar un documento que no pertenece a ese conjunto. Las funciones lingüísticas de IronOCR abarcan más de 125 idiomas instalables a través de NuGet, por lo que el alcance de lo que puede gestionar el sistema OCR se amplía sin necesidad de modificar el código de la aplicación: basta con añadir el paquete de idioma y cambiar una propiedad de enumeración.
Cuando la aplicación necesita entrada o salida de archivos PDF
Una categoría importante de documentos comerciales que requieren OCR son los archivos PDF: contratos escaneados, facturas archivadas, formularios enviados por fax y convertidos a PDF por impresoras multifunción. RapidOCR .NET no puede leer ninguno de ellos sin una biblioteca de renderizado de PDF independiente, código de conversión personalizado y gestión de memoria para mapas de bits del tamaño de una página. Los equipos que desarrollan sistemas de ingesta de documentos descubren rápidamente que la pila RapidOCR .NET requiere al menos dos bibliotecas: una para la representación de PDF y otra para OCR, cada una con sus propios ciclos de actualización y superficies de compatibilidad.IronOCR gestiona ambas cosas en un solo paquete. La capacidad de generar también archivos PDF con capacidad de búsqueda, convirtiendo un archivo escaneado en un índice con capacidad de búsqueda, está completamente fuera del alcance de RapidOCR .NET y se logra con una sola llamada a un método en IronOCR. Los equipos que desarrollan aplicaciones de gestión documental con requisitos de cumplimiento normativo suelen citar la posibilidad de realizar búsquedas en la salida a PDF como la característica decisiva.
Cuando surgen incidentes de producción sin una ruta de soporte
Los proyectos comunitarios dependen de la disponibilidad de los colaboradores. Cuando una implementación de producción de RapidOCR .NET se encuentra con un caso límite novedoso (un conflicto de versión específica de ONNX Runtime, un fallo de inferencia del modelo en un formato de imagen inusual, una fuga de memoria bajo carga sostenida), la vía de soporte es un problema de GitHub y la espera. Para los equipos con obligaciones de SLA o procesos de gestión de documentos críticos para el negocio, ese no es un modelo viable de respuesta a incidentes. La licencia comercial de IronOCR incluye soporte directo por correo electrónico, lo que proporciona a los equipos un punto de contacto real cuando algo falla un viernes por la noche antes de la fecha límite del lunes.
Cuando el proyecto supera las suposiciones del prototipo
RapidOCR .NET es una opción razonable para una prueba de concepto experimental: es gratuito, no requiere negociar licencias y su instalación es rápida más allá de la configuración del modelo. Sin embargo, cuando esa prueba de concepto se convierte en una función de producción, las limitaciones que eran aceptables en un laboratorio —falta de compatibilidad con PDF, cobertura lingüística limitada, gestión manual del modelo, ausencia de soporte comercial— se convierten en obstáculos. La migración de RapidOCR .NET a IronOCR es un proceso mecánico: basta con eliminar los paquetes, borrar el directorio de modelos, eliminar las reglas de copia de MSBuild, reemplazar el bloque de inicialización del motor con un único constructor de motor OCR sin argumentos y desbloquear simultáneamente la entrada de PDF, la cobertura en 125 idiomas, el preprocesamiento automático y la salida con capacidad de búsqueda.
Consideraciones comunes sobre la migración
Reemplazar la inicialización del motor
El cambio de código más directo es reemplazar el bloque de inicialización RapidOcrEngine con una instanciación IronTesseract. El objeto de configuración de cuatro rutas desaparece por completo:
// Before: RapidOcrNet — engine needs all 4 paths populated
var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "models/det.onnx",
ClsModelPath = "models/cls.onnx",
RecModelPath = "models/rec_en.onnx",
KeysPath = "models/en_keys.txt"
});
var result = engine.Run(imagePath);
var text = string.Join("\n", result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text));
// After:IronOCR— no configuration required
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
// Before: RapidOcrNet — engine needs all 4 paths populated
var engine = new RapidOcrEngine(new RapidOcrOptions
{
DetModelPath = "models/det.onnx",
ClsModelPath = "models/cls.onnx",
RecModelPath = "models/rec_en.onnx",
KeysPath = "models/en_keys.txt"
});
var result = engine.Run(imagePath);
var text = string.Join("\n", result.TextBlocks
.OrderBy(b => b.BoundingBox.Top)
.Select(b => b.Text));
// After:IronOCR— no configuration required
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
Imports System.Linq
' Before: RapidOcrNet — engine needs all 4 paths populated
Dim engine = New RapidOcrEngine(New RapidOcrOptions With {
.DetModelPath = "models/det.onnx",
.ClsModelPath = "models/cls.onnx",
.RecModelPath = "models/rec_en.onnx",
.KeysPath = "models/en_keys.txt"
})
Dim result = engine.Run(imagePath)
Dim text = String.Join(vbCrLf, result.TextBlocks _
.OrderBy(Function(b) b.BoundingBox.Top) _
.Select(Function(b) b.Text))
' After: IronOCR— no configuration required
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text = New IronTesseract().Read(imagePath).Text
La colección result.TextBlocks con su encadenamiento manual OrderBy y Select se colapsa a result.Text. Para aplicaciones que necesitan los datos de caja delimitadora que proveía TextBlocks, result.Words expone las mismas coordenadas y valores de confianza por palabra a través de una API estructurada documentada en el cómo leer resultados.
Eliminación de la infraestructura de archivos del modelo
Después de reemplazar el código, elimina el directorio models/, elimina las entradas de MSBuild <Content> que copiaban archivos de modelo en la compilación, y elimina cualquier lógica de validación de inicio que verificaba la ausencia de archivos. Esto no es necesario:IronOCR envía sus datos internamente. En las canalizaciones de CI/CD, elimine cualquier paso que haya obtenido o almacenado en caché archivos de modelo. El tutorial sobre la entrada de imágenes abarca los patrones de manejo de entrada para los escenarios comunes de ruta de archivo, flujo y matriz de bytes que probablemente utiliza el código RapidOCR .NET existente.
Manejo de imágenes de baja calidad
Los modelos ONNX de RapidOCR.NET aplican un preprocesamiento interno durante la inferencia, pero la biblioteca no expone ninguna API de preprocesamiento al usuario. Si el código existente aplica manipulación de imagen antes de pasar a engine.Run(), ese código fue escrito contra una biblioteca de imagen separada.IronOCR expone una API de preprocesamiento directamente en OcrInput:
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct skewed scans
input.DeNoise(); // Remove scanner noise
input.Contrast(); // Enhance contrast
input.Binarize(); // Convert to black/white
input.EnhanceResolution(300);
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew(); // Correct skewed scans
input.DeNoise(); // Remove scanner noise
input.Contrast(); // Enhance contrast
input.Binarize(); // Convert to black/white
input.EnhanceResolution(300);
var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr
Using input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")
input.Deskew() ' Correct skewed scans
input.DeNoise() ' Remove scanner noise
input.Contrast() ' Enhance contrast
input.Binarize() ' Convert to black/white
input.EnhanceResolution(300)
Dim result = New IronTesseract().Read(input)
Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
Las guías sobre cómo corregir la orientación de la imagen y cómo configurar los ajustes de DPI abordan los dos problemas de preprocesamiento que más suelen afectar a la precisión de los documentos escaneados. Los puntajes de confianza están disponibles en result.Confidence y por palabra a través de result.Words[i].Confidence.
Agregar compatibilidad con PDF
Cualquier código que realizaba la conversión de PDF a imagen antes de llamar a engine.Run() puede ser eliminado por completo. IronTesseract.Read() acepta una ruta de PDF directamente. Elimine la dependencia de la biblioteca de renderizado de PDF junto con el código del proceso de conversión; esto supone una reducción neta de dependencias, no una adición.
Funcionalidades adicionales de IronOCR
Más allá de las características cubiertas en las secciones de comparación,IronOCR proporciona capacidades que no tienen equivalente en RapidOCR .NET:
- Reconocimiento óptico de caracteres (OCR) basado en regiones: Extrae texto de un área específica de una imagen sin procesar la página completa. La cómo hacer OCR por región de una imagen y el ejemplo de recorte de rectángulo cubren el uso de
CropRectanglepara la extracción de encabezados de facturas, orientación a campos de formularios y escenarios similares de documentos parciales. - Lectura de códigos de barras durante OCR: Establece
ocr.Configuration.ReadBarCodes = truepara extraer valores de códigos de barras junto al texto en una sola pasada. El cómo hacer OCR de códigos de barras y ejemplo de OCR de códigos de barras muestran cómoresult.Barcodesse integra con la salida estándar de OCR. - Tipos de documentos especializados:IronOCR proporciona una guía probada para pasaportes , matrículas , texto manuscrito y extracción de tablas .
- OCR asíncrono: La guía práctica de OCR asíncrono muestra patrones de procesamiento no bloqueantes para controladores de solicitudes y servicios en segundo plano de ASP.NET .
- hOCR y exportación estructurada:IronOCR puede guardar los resultados de OCR como hOCR XML, conservando los cuadros delimitadores a nivel de palabra en un formato estándar compatible con las herramientas de procesamiento de documentos posteriores. La guía de exportación de hOCR cubre las opciones de formato de salida.
Compatibilidad con .NET y preparación para el futuro
IronOCR está diseñado para .NET 8, .NET 9, .NET Standard 2.0 y .NET Framework 4.6.2 y versiones posteriores, cubriendo así todo el espectro de entornos .NET Enterprise actuales. La biblioteca envía binarios multiplataforma para Windows x64/x86, Linux x64, macOS x64 y macOS ARM (Apple Silicon), con imágenes de contenedor probadas contra imágenes base mcr.microsoft.com/dotnet/aspnet estándar. La compatibilidad de RapidOCR.NET está limitada por la matriz de soporte de plataforma de ONNX Runtime, que cubre objetivos similares pero requiere selección de paquetes NuGet específicos de la plataforma (Microsoft.ML.OnnxRuntime para CPU vs. Microsoft.ML.OnnxRuntime.Gpu para CUDA) y no garantiza la misma simplicidad binaria en paquete.IronOCR mantiene la compatibilidad con .NET 10 (previsto para noviembre de 2026) gracias a su ciclo de lanzamientos activos, sin que se requieran cambios en el código de la aplicación cuando se actualiza el SDK.
Conclusión
RapidOCR .NET resuelve eficazmente un problema específico: ejecutar modelos PaddleOCR optimizados para CPU en .NET sin necesidad de utilizar todo el ecosistema de Python. Para los equipos que procesan exclusivamente imágenes en chino o inglés en un entorno controlado donde los archivos del modelo se pueden gestionar manualmente, ofrece una precisión razonable de forma gratuita. Ese es el alcance de su caso de uso en producción.
La sobrecarga de la gestión del modelo es la limitación determinante. Cuatro archivos separados, obtenidos de un repositorio externo de GitHub , implementados junto con la aplicación, validados en tiempo de ejecución y actualizados manualmente cada vez que el proyecto original publica nuevos pesos; esto no supone ningún problema para un prototipo. Para un servicio de producción con pipelines de CI/CD, despliegues en múltiples entornos y varios desarrolladores, se trata del tipo de fricción operativa que consume silenciosamente horas a lo largo de un trimestre de ingeniería. El límite de cobertura lingüística agrava el problema: en el momento en que un requisito empresarial introduce un idioma que no sea CJK, RapidOCR .NET queda completamente fuera de juego.
IronOCR comienza donde empiezan las limitaciones de RapidOCR.NET. Un único paquete NuGet , sin archivos externos, más de 125 idiomas, entrada de PDF nativa y salida de PDF con capacidad de búsqueda, preprocesamiento automático, extracción de resultados estructurados y soporte comercial mediante una API versionada. La licencia Lite de $999 es un costo único sin medidor por transacción ni requisitos de renovación anual. Los equipos que han calculado el coste de las horas de ingeniería dedicadas a la gestión de modelos, las soluciones alternativas para la conversión a PDF y las incidencias relacionadas con idiomas no compatibles, concluyen sistemáticamente que, desde el punto de vista económico, una biblioteca comercial resulta más ventajosa que la alternativa gratuita.
Para los equipos que actualmente utilizan RapidOCR .NET en producción o que lo están evaluando para un nuevo proyecto, el centro de tutoriales y guías prácticas de IronOCR proporciona un punto de partida práctico. La migración es mecánica, el código es más sencillo y la superficie operativa se reduce a una única referencia de paquete.
Preguntas Frecuentes
¿Qué es RapidOCR.NET?
RapidOCR.NET 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 RapidOCR.NET para desarrolladores .NET?
IronOCR es una biblioteca de OCR .NET nativa de NuGet que utiliza IronTesseract como motor principal. En comparación con RapidOCR.NET, ofrece un despliegue más sencillo (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 RapidOCR.NET?
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 RapidOCR.NET e 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 RapidOCR.NET 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 RapidOCR.NET?
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 RapidOCR.NET?
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 RapidOCR.NET a IronOCR?
La migración de RapidOCR.NET 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 de COM y la actualización de las llamadas a la API. La mayoría de las migraciones reducen significativamente la complejidad del código.

