Migración de Patagames Tesseract.NET SDK a IronOCR
Esta guía acompaña a los desarrolladores .NET a través de una migración completa desde el SDK Tesseract .NET de Patagames a IronOCR . Abarca la traducción mecánica de la API, la habilitación de la implementación multiplataforma que impulsa la mayoría de las migraciones y los cambios prácticos en el código necesarios para trasladar una canalización de OCR de producción desde un envoltorio comercial exclusivo para Windows a una biblioteca que se ejecuta en Windows, Linux, macOS, Docker, Azure y AWS sin modificaciones.
¿Por qué migrar desde Patagames Tesseract .NET SDK?
La mayoría de los equipos que evalúan Patagames para su posible reemplazo no están insatisfechos con la precisión del OCR. Se topan con un obstáculo en la implementación —un destino de contenedor Linux, un proyecto de migración a la nube o una canalización de CI en Ubuntu— y descubren que el binario nativo exclusivo para Windows simplemente no tiene ninguna posibilidad de avanzar en esa plataforma. Esa única restricción determina el resto de la evaluación de la migración.
La implementación exclusiva para Windows bloquea la pila .NET moderna. Patagames distribuye binarios nativos para Windows para su envoltorio del motor Tesseract. No existen paquetes de tiempo de ejecución para Linux x64, macOS o ARM. La clase OcrApi carga una DLL de Windows en tiempo de ejecución; en cualquier otro sistema operativo, la aplicación falla al iniciar. Agregue la dependencia System.Drawing.Bitmap, que Microsoft ha marcado formalmente como no compatible para el desarrollo multiplataforma nuevo, y la biblioteca es incompatible con el modelo de implementación predeterminado de cada proveedor de nube y orquestador de contenedores.
Pagar precios comerciales por un motor gratuito, sin acceso multiplataforma. El motor Tesseract, en el que se basa Patagames, es de código abierto y gratuito. Envoltorios comunitarios gratuitos como tesseractocr también se envían hoy con binarios de Windows preconstruidos, lo que elimina el principal argumento de conveniencia que Patagames ofrecía históricamente. Una licencia comercial para Patagames ofrece una interfaz API ligeramente más limpia que la versión básica de Tesseract, pero no añade preprocesamiento, compatibilidad con PDF, salida PDF con capacidad de búsqueda ni implementación multiplataforma: las cuatro capacidades que definen una biblioteca OCR completa en 2026.
La opacidad en los precios hace imposible la planificación presupuestaria. Patagames no publica los precios de las licencias. Para evaluar la biblioteca, es necesario contactar con el departamento de ventas antes de poder realizar cualquier comparación de costes. El precio de IronOCR comienza en $999 para una licencia perpetua Lite para un solo desarrollador con un año de actualizaciones incluido. Los equipos pueden evaluar la relación coste-capacidad sin necesidad de un proceso de ventas. Consulte la página de licencias de IronOCR para obtener información detallada sobre los diferentes niveles.
Fugas de variables crudas de Tesseract a través del API. Configurar el modo de segmentación de página en Patagames requiere llamar a api.SetVariable("tessedit_pageseg_mode", "3") — una asignación de variable de Tesseract basada en cadena sin IntelliSense, sin verificación en tiempo de compilación y sin capacidad de descubrimiento. Si se escribe mal el nombre de la variable, la llamada no hará nada en silencio.IronOCR envuelve cada opción de configuración de Tesseract en propiedades fuertemente tipadas en IronTesseract.Configuration.
No hay salida estructurada más allá de una cadena plana. Patagames GetTextFromImage devuelve una sola cadena. No hay acceso a los límites de las palabras, las agrupaciones de líneas, la estructura de los párrafos ni las puntuaciones de confianza por palabra. Las aplicaciones que necesitan extraer campos específicos de formularios o validar la precisión del OCR palabra por palabra no tienen una base sólida sobre la cual construir con la API de Patagames.
Las canalizaciones de CI/CD se interrumpen en el paso de Linux. Los equipos de desarrollo .NET modernos ejecutan CI en Linux: GitHub Actions, GitLab CI y Azure DevOps utilizan por defecto ejecutores basados en Linux. Un proyecto que referencia Tesseract.Net.SDK fallará al construir la referencia binaria nativa o fallará en tiempo de ejecución durante las pruebas de integración. Cada prueba requiere un ejecutor de integración continua específico para Windows o una solución alternativa que simule por completo la capa de OCR.
El problema fundamental
Patagames solo se dirige a Windows. En el momento en que cambie su destino de implementación, la biblioteca no podrá seguirlo:
// Patagames: Windows DLL loads; fails on Linux container or macOS developer machine
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng"); // tessdata path — must be manually managed in every environment
using var bitmap = new Bitmap(imagePath); // System.Drawing — unsupported on non-Windows targets
return api.GetTextFromImage(bitmap);
// IronOCR: same code runs on Windows, Linux, macOS, Docker, Azure, AWS
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
No hay directorio tessdata. No hay ruta de DLL nativa. Sin condiciones de plataforma. El gráfico de dependencias de NuGet resuelve automáticamente el entorno de ejecución correcto para cada destino.
Comparación de características entre IronOCR y Patagames Tesseract .NET SDK
La siguiente tabla resume las funcionalidades relevantes para los equipos que actualmente utilizan Patagames en producción.
| Característica | SDK de Patagames Tesseract .NET | IronOCR |
|---|---|---|
| Compatibilidad con Windows | Sí | Sí |
| Soporte para Linux | No | Sí |
| Compatibilidad con macOS | No | Sí |
| Implementación de Docker | No | Sí |
| Servicio de aplicaciones de Azure | No | Sí |
| AWS Lambda | No | Sí |
| Paquete NuGet | Tesseract.Net.SDK | IronOcr |
| Modelo de licencia | Comercial (consultar precio) | Perpetua ($999–$2,399, pública) |
| Motor OCR | Tesseract (código abierto) | Tesseract 5 optimizado (incluido) |
| Gestión de Tessdata | Directorio manual con archivos .traineddata | Paquetes de lenguaje NuGet |
| preprocesamiento automático | None | Enderezar, Reducir ruido, Contraste, Binarizar, Enfocar, Escalar, Dilatar, Erosionar |
| Eliminación profunda del ruido de fondo | None | Sí (DeepCleanBackgroundNoise()) |
| Entrada de PDF nativa | No (se requiere un renderizador externo) | Sí |
| Entrada TIFF de varias páginas | Limitado | Sí (input.LoadImageFrames()) |
| Salida en PDF con capacidad de búsqueda | No | Sí (result.SaveAsSearchablePdf()) |
| Exportación hOCR | No | Sí |
| Idiomas compatibles | Archivos tessdata de Tesseract | Más de 125 paquetes NuGet |
| Multilingüe simultáneo | Sí (concatenación de cadenas) | Sí (enum fuertemente tipado OcrLanguage) |
| OCR basado en regiones | No | Sí (CropRectangle) |
| Lectura de BarCodes | No | Sí |
| Salida estructurada | Solo cuerdas planas | Páginas, párrafos, líneas, palabras, caracteres con coordenadas |
| Puntuaciones de confianza por palabra | No | Sí |
| Configuración de segmentación de página | Llamada de cadena cruda SetVariable | Fuertemente tipado Configuration.PageSegmentationMode |
| Dependencia de System.Drawing | Requerido | Opcional |
| Seguridad de los hilos | Límites estándar de Tesseract | Completo (crear IronTesseract por hilo) |
| Soporte comercial | Sí | Sí |
| Descargas de NuGet | Limitado | Más de 5,3 millones |
Inicio rápido: Migración del SDK Tesseract .NET de Patagames a IronOCR
Paso 1: Sustituir el paquete NuGet
Eliminar Patagames Tesseract .NET SDK:
dotnet remove package Tesseract.Net.SDK
Instala IronOCR desde NuGet :
Para obtener soporte en idiomas distintos del inglés, instale el paquete de idioma correspondiente:
Paso 2: Actualizar los espacios de nombres
Reemplace los espacios de nombres de Patagames con el espacio de nombres de IronOCR:
// Before (Patagames)
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing;
// After (IronOCR)
using IronOcr;
Paso 3: Inicializar licencia
Agregue la inicialización de la licencia al inicio de la aplicación (antes de la primera llamada IronTesseract):
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Una licencia de prueba gratuita está disponible en ironsoftware.com/C#/ocr/ para comenzar las pruebas de migración sin compra.
Ejemplos de migración de código
Procesamiento de carpetas por lotes
La fase 1 mostró la extracción de imágenes individuales. Las implementaciones de Patagames en producción típicamente inicializan un OcrApi dentro de un bucle, llamando a api.Init() en cada iteración, lo que vuelve a cargar los datos y reinicia el motor Tesseract para cada archivo. Ese patrón compone el costo de inicialización a través de cientos de documentos.
Enfoque de Patagames:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
using System.IO;
public class PatagamesBatchProcessor
{
private const string TessDataPath = @"./tessdata";
public Dictionary<string, string> ProcessFolder(string folderPath)
{
var results = new Dictionary<string, string>();
foreach (var file in Directory.GetFiles(folderPath, "*.jpg"))
{
// OcrApi re-initialized per file — tessdata loaded each time
using var api = OcrApi.Create();
api.Init(TessDataPath, "eng");
using var bitmap = new Bitmap(file);
var text = api.GetTextFromImage(bitmap);
results[Path.GetFileName(file)] = text;
}
return results;
}
}
Enfoque IronOCR:
// NuGet: IronOcr
using IronOcr;
using System.IO;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public class IronOcrBatchProcessor
{
public Dictionary<string, string> ProcessFolder(string folderPath)
{
var results = new Dictionary<string, string>();
// Single engine instance — initialized once, reused across all files
var ocr = new IronTesseract();
foreach (var file in Directory.GetFiles(folderPath, "*.jpg"))
{
var result = ocr.Read(file);
results[Path.GetFileName(file)] = result.Text;
}
return results;
}
}
La instancia IronTesseract de IronOCR mantiene el estado del motor a través de las llamadas. Reutilizar una instancia para todo un lote elimina la sobrecarga de inicialización por archivo y elimina por completo la dependencia de la ruta de tessdata. Para el procesamiento por lotes paralelo en múltiples núcleos de CPU, vea el ejemplo de multihilo — cree un IronTesseract por hilo en lugar de compartir una única instancia.
Migración del modo de segmentación de página
Patagames expone el modo de segmentación de páginas a través de una llamada cruda SetVariable con una clave de cadena y un valor entero convertido a cadena. Sin IntelliSense, sin validación de enumeraciones, sin ninguna indicación en la documentación sobre el punto de llamada. Un solo dígito controla si Tesseract trata la entrada como un único bloque de texto, una columna, una palabra o un solo carácter, y no hay ninguna indicación cuando se escribe mal el nombre de la variable.
Enfoque de Patagames:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing;
public string OcrSingleLineField(string imagePath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
// Raw variable string — no IntelliSense, no validation
// PageSegmentationMode.SingleLine == 7
api.SetVariable("tessedit_pageseg_mode", "7");
// Additional variable to suppress dictionary output
api.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -.:/");
using var bitmap = new Bitmap(imagePath);
return api.GetTextFromImage(bitmap);
}
Enfoque IronOCR:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string OcrSingleLineField(string imagePath)
{
var ocr = new IronTesseract();
// Strongly typed enum — discoverable through IntelliSense
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine;
var result = ocr.Read(imagePath);
return result.Text;
}
Cada opción de configuración de Tesseract que Patagames expone a través de SetVariable tiene un equivalente fuertemente tipado directo en IronTesseract.Configuration. La migración consiste en una sustitución mecánica de literales de cadena por valores enumerados con nombre. Consulte la documentación de la API de IronTesseract para obtener la información completa sobre la configuración. La guía para la lectura de documentos específicos explica cuándo aplicar cada modo de segmentación de página a los diferentes tipos de documentos.
Patrón de reemplazo del iterador de resultados
Patagames devuelve una cadena plana desde GetTextFromImage. Para extraer palabras individuales, sus cuadros delimitadores o sus puntuaciones de confianza de la salida de Patagames, es necesario escribir un analizador sintáctico sobre la cadena devuelta, o acceder directamente a la API del iterador de resultados de Tesseract subyacente mediante interoperabilidad. Ninguno de estos enfoques es fiable ni fácil de mantener.IronOCR expone un OcrResult completamente estructurado con acceso nativo a cada nivel de la jerarquía del documento.
Enfoque de Patagames:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
public void ExtractWordsWithPositions(string imagePath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
using var bitmap = new Bitmap(imagePath);
// Solo cuerdas planas — no word positions, no confidence, no line grouping
var text = api.GetTextFromImage(bitmap);
// Only option: split on whitespace and hope line breaks survive
var words = text.Split(new[] { ' ', '\n', '\r' },
StringSplitOptions.RemoveEmptyEntries);
foreach (var word in words)
{
// No X, Y, Width, Height — position information is lost
Console.WriteLine(word);
}
}
Enfoque IronOCR:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public void ExtractWordsWithPositions(string imagePath)
{
var result = new IronTesseract().Read(imagePath);
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Width}x{page.Height}px");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y})");
Console.WriteLine($" Text: {paragraph.Text}");
}
foreach (var word in page.Words)
{
// Bounding box, confidence, and text for every word
Console.WriteLine($" Word: '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} " +
$"confidence {word.Confidence:F1}%");
}
}
Console.WriteLine($"Overall confidence: {result.Confidence:F1}%");
}
La estructura completa OcrResult — páginas, párrafos, líneas, palabras y caracteres — elimina la necesidad de cualquier analizador de postprocesamiento. Las coordenadas de las palabras permiten la extracción de campos por posición, lo cual es la base del procesamiento de facturas, el reconocimiento óptico de caracteres (OCR) de formularios y la extracción de tablas. Consulte la guía de resultados estructurados para ver la jerarquía completa y la guía de puntuaciones de confianza para filtrar las palabras con baja confianza.
Procesamiento de archivos TIFF de varias páginas
Patagames acepta un System.Drawing.Bitmap. Un TIFF de múltiples cuadros contiene múltiples imágenes incrustadas, pero System.Drawing.Bitmap no enumera automáticamente los cuadros — debe usar Image.SelectActiveFrame() para recorrerlos manualmente y pasar cada mapa de bits del cuadro a GetTextFromImage en un bucle. El API de enumeración de cuadros no es obvio y los mensajes de error cuando falla no son descriptivos.
Enfoque de Patagames:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
public string ProcessMultiPageTiff(string tiffPath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
var sb = new StringBuilder();
using var tiffImage = Image.FromFile(tiffPath);
var frameCount = tiffImage.GetFrameCount(FrameDimension.Page);
for (int i = 0; i < frameCount; i++)
{
// Manual frame selection — FrameDimension.Page required
tiffImage.SelectActiveFrame(FrameDimension.Page, i);
using var frameBitmap = new Bitmap(tiffImage);
var pageText = api.GetTextFromImage(frameBitmap);
sb.AppendLine(pageText);
}
return sb.ToString();
}
Enfoque IronOCR:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string ProcessMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
// LoadImageFrames handles all frames automatically
input.LoadImageFrames(tiffPath);
// Optional: apply preprocessing to all frames at once
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
// Per-page access if needed
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words");
}
return result.Text;
}
OcrInput.LoadImageFrames() maneja la enumeración de cuadros internamente y aplica el procesamiento previo a cada cuadro en la tubería. La ceremonia de selección de cuadro System.Drawing desaparece por completo. Consulte la guía de entrada de archivos TIFF y GIF para obtener opciones adicionales, incluida la selección de fotogramas individuales cuando solo se necesiten páginas específicas.
Entrada de PDF sin un renderizador externo
Patagames no tiene soporte nativo para PDF. Un pipeline de OCR de PDF basado en Patagames requiere una biblioteca de renderizado de PDF externa — PdfiumViewer, iText o PDFSharp — para convertir cada página en un Bitmap antes de pasarlo a GetTextFromImage. Esa dependencia externa añade una sobrecarga a la gestión de paquetes, una consideración de licencia independiente y un punto de fallo secundario. La calidad de renderizado también varía entre las distintas bibliotecas, lo que afecta a la precisión del OCR independientemente del motor Tesseract.
Enfoque de Patagames:
// NuGet: Tesseract.Net.SDK + PdfiumViewer (external dependency)
using Patagames.Ocr;
using PdfiumViewer; // separate NuGet package required
using System.Drawing;
using System.Text;
public string OcrPdfDocument(string pdfPath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
var sb = new StringBuilder();
// External renderer required — Patagames has no PDF support
using var pdfDoc = PdfDocument.Load(pdfPath);
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render at 300 DPI for acceptable OCR accuracy
using var img = pdfDoc.Render(page, 300, 300, false);
using var bitmap = new Bitmap(img);
var pageText = api.GetTextFromImage(bitmap);
sb.AppendLine(pageText);
}
return sb.ToString();
}
Enfoque IronOCR:
// NuGet: IronOcr only — no external PDF renderer
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string OcrPdfDocument(string pdfPath)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath);
// Preprocessing applies to every page in one call
input.Deskew();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Full per-page structured access
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Paragraphs.Length} paragraphs");
}
return result.Text;
}
Un paquete NuGet reemplaza a dos. El paso de renderizado desaparece. La guía de entrada de PDF abarca archivos PDF de una sola página, de varias páginas y protegidos con contraseña. Para el flujo de trabajo de salida de PDF con capacidad de búsqueda (que produce un documento con capacidad de búsqueda mediante Ctrl+F a partir de un PDF escaneado), la guía y el ejemplo de PDF con capacidad de búsqueda muestran el proceso completo en cinco líneas.
Referencia de mapeo de API de Patagames Tesseract .NET SDK a IronOCR
| SDK de Patagames Tesseract .NET | Equivalente a IronOCR |
|---|---|
Tesseract.Net.SDK (paquete NuGet) | IronOcr (paquete NuGet) |
Patagames.Ocr (namespace) | IronOcr (namespace) |
Patagames.Ocr.Enums (namespace) | IronOcr (namespace) |
OcrApi.Create() | new IronTesseract() |
api.Init(tessDataPath, "eng") | ocr.Language = OcrLanguage.English (sin ruta) |
api.Init(path, "eng+fra+deu") | ocr.Language = OcrLanguage.English + OcrLanguage.French + OcrLanguage.German |
api.GetTextFromImage(bitmap) | ocr.Read(imagePath).Text |
api.SetVariable("tessedit_pageseg_mode", "7") | ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine |
api.SetVariable(key, value) (cualquier variable cruda) | ocr.Configuration.[TypedProperty] |
new Bitmap(imagePath) (preparación de entrada) | input.LoadImage(imagePath) |
OcrBitmap.FromFile(path) | input.LoadImage(path) |
| No admite archivos TIFF multifotograma. | input.LoadImageFrames(tiffPath) |
| No se permite la entrada de archivos PDF. | input.LoadPdf(pdfPath) o ocr.Read(pdfPath) |
| No hay PDF con función de búsqueda | result.SaveAsSearchablePdf("output.pdf") |
| Sin preprocesamiento | input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize() |
| Sin OCR de región | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
| Sin lectura de códigos de barras | ocr.Configuration.ReadBarCodes = true |
| Resultado de cadena plana únicamente | result.Pages, result.Lines, result.Words, result.Paragraphs |
| Sin confianza por palabra | result.Words[i].Confidence, result.Confidence |
PageSegmentationMode enum | TesseractPageSegmentationMode enum |
| No se permite la exportación de hOCR. | Resultado .ToHOcrString() salida |
| Solo para Windows x64/x86 | Windows, Linux, macOS, Docker, Azure, AWS |
Problemas comunes de migración y soluciones
Problema 1: Falta el directorio Tessdata en el nuevo entorno.
Patagames: La llamada api.Init(@"./tessdata", "eng") falla en tiempo de ejecución si el directorio tessdata está ausente o falta el archivo eng.traineddata. En entornos de contenedores, se trata de un fallo que se produce en el momento de la implementación y que no genera ninguna advertencia en el momento de la compilación. Los equipos que implementan en Docker suelen descubrir esto después de que la imagen ya ha sido subida.
**Solución:**IronOCR elimina por completo el concepto de directorio tessdata. Instalar datos de idioma como paquetes NuGet :
Los datos de idioma se resuelven en el tiempo de compilación y se incluyen automáticamente en la salida dotnet publish. No hay forma de equivocarse en el proceso ni ningún elemento en la lista de verificación de implementación para los archivos de idioma.
Problema 2: System.Drawing.Bitmap falla en Linux
Patagames: El constructor System.Drawing.Bitmap lanza TypeInitializationException o PlatformNotSupportedException en Linux a menos que libgdiplus esté instalado como un paquete del sistema. Incluso con libgdiplus presente, el comportamiento es inconsistente en las diferentes distribuciones. Microsoft recomienda explícitamente no usar System.Drawing en plataformas que no sean de Windows en el desarrollo nuevo.
**Solución:**IronOCR acepta rutas de archivo, matrices de bytes y flujos directamente. La dependencia System.Drawing no es requerida:
// Replace this pattern:
using var bitmap = new Bitmap(imagePath); // fails without libgdiplus on Linux
api.GetTextFromImage(bitmap);
// With:
var result = new IronTesseract().Read(imagePath); // no System.Drawing required
Consulte la guía de entrada de imágenes para conocer todos los tipos de entrada compatibles, incluidos los arrays de bytes y las secuencias de datos.
Problema 3: Fallos silenciosos en SetVariable
Patagames: api.SetVariable("tessedit_pageseg_mode", someValue) devuelve bool pero la mayoría de los que llaman descartan el valor devuelto. Cuando se escribe mal el nombre de una variable o se pasa un valor no compatible, Tesseract aplica silenciosamente un valor predeterminado y continúa. Resulta difícil rastrear la degradación de la precisión resultante hasta la llamada de configuración.
Solución: Las propiedades de configuración de IronOCR son fuertemente tipadas. Una asignación no válida produce un error de compilación, no un comportamiento predeterminado silencioso en tiempo de ejecución:
// Compile-time safety — no silent failures
var ocr = new IronTesseract();
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleBlock;
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5; // also strongly typed
Problema 4: OcrApi inicializado dentro de un bucle.
Patagames: Los equipos que inicializan OcrApi dentro de un bucle de procesamiento incurren en la sobrecarga de carga de datos en cada iteración. El patrón típico — OcrApi.Create() y api.Init() dentro de un foreach — es correcto desde una perspectiva de aislamiento de hilos pero costoso al procesar cientos de documentos.
Solución: Cree un IronTesseract por hilo y reutilícelo en todos los documentos asignados a ese hilo. La instancia no tiene estado entre las llamadas .Read():
// One instance, many reads — engine initialized once
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
foreach (var file in imageFiles)
{
var text = ocr.Read(file).Text;
ProcessText(text);
}
Para cargas de trabajo por lotes paralelas, cree una instancia por tarea. Vea la guía de optimización de velocidad para opciones de ajuste de rendimiento, incluyendo IronTesseract.Configuration.TesseractVersion y presets de velocidad de lectura.
Problema 5: Ninguna imagen base de Docker para Linux funciona.
Patagames: No existe un binario de Patagames compatible con Linux. Cualquier intento de ejecutar una aplicación basada en Patagames en un contenedor Docker de Linux falla. La única solución es un contenedor basado en Windows (FROM mcr.microsoft.com/windows/servercore), que es significativamente más grande, más lento de descargar e incompatible con la mayoría de las configuraciones de Kubernetes que usan grupos de nodos Linux.
**Solución:**IronOCR admite imágenes base estándar de Linux. La guía de implementación de Docker cubre la configuración exacta del Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
#IronOCR resolves the Linux native runtime from NuGet automatically
ENTRYPOINT ["dotnet", "MyApp.dll"]
No se requiere contenedor de Windows. No hay distribución binaria independiente. La misma imagen de Docker se ejecuta en cualquier host de contenedores basado en Linux.
Problema 6: El OCR de PDF requiere dos paquetes NuGet
Patagames: Para añadir OCR de PDF a una aplicación de Patagames se requiere un segundo paquete NuGet para la visualización de PDF (PdfiumViewer, iTextSharp.LGPLv2.Core o similar). Cada una de ellas tiene sus propios términos de licencia, frecuencia de actualización y posibles problemas de compatibilidad. Cuando la versión del renderizador de PDF y la versión de Patagames entren en conflicto, ambos equipos deben colaborar para resolverlo.
**Solución:**IronOCR gestiona la entrada de PDF de forma nativa sin necesidad de un segundo paquete. Eliminar por completo la dependencia del renderizador de PDF:
# Remove the PDF rendering shim
dotnet remove package PdfiumViewer
#IronOCR handles PDF natively
var result = new IronTesseract().Read("document.pdf");
Lista de verificación para la migración al SDK de Tesseract.NET de Patagames
Pre-Migración
Revisa el código para identificar todas las referencias a Patagames antes de empezar:
# Find all files using Patagames namespaces
grep -r "Patagames.Ocr" --include="*.cs" . -l
# Find all OcrApi usage patterns
grep -r "OcrApi\|GetTextFromImage\|api\.Init\|SetVariable" --include="*.cs" .
# Find tessdata path references
grep -r "tessdata\|TessDataPath\|traineddata" --include="*.cs" .
# Find System.Drawing.Bitmap usage tied to OCR
grep -r "new Bitmap\|System\.Drawing" --include="*.cs" . -l
# Find any PDF rendering libraries used to feed Patagames
grep -r "PdfiumViewer\|iTextSharp\|PdfSharp" --include="*.csproj" .
Documento: recuento total de sitios de llamadas OcrApi.Create(), número de configuraciones de idioma api.Init() distintas, ubicación del directorio tessdata en cada entorno de implementación y cualquier código de preprocesamiento escrito en System.Drawing o ImageSharp que envuelva las llamadas de Patagames.
Migración de código
- Eliminar la referencia de paquete NuGet
Tesseract.Net.SDKde todos los proyectos. - Elimina cualquier paquete de renderización de PDF NuGet (PdfiumViewer, iText, etc.) utilizado solo para alimentar Patagames.
- Instalar el paquete NuGet
IronOcr. - Instalar
IronOcr.Languages.Englishy cualquier otro paquete de idioma requerido. - Agregar
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"al inicio de la aplicación. - Reemplazar
using Patagames.Ocr;yusing Patagames.Ocr.Enums;conusing IronOcr;. - Reemplazar cada bloque
OcrApi.Create()+api.Init(path, lang)connew IronTesseract()+ocr.Language = OcrLanguage.[Language]. - Reemplazar cada llamada
api.GetTextFromImage(bitmap)conocr.Read(imagePath).Text(eliminando el constructorBitmap). - Reemplazar cada llamada
api.SetVariable("tessedit_pageseg_mode", value)con elocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.[Value]tipado. - Eliminar toda la instanciación de
System.Drawing.Bitmapque existía únicamente para pasar imágenes a Patagames. - Reemplazar bucles de renderización de PDF (si están presentes) con
input.LoadPdf(pdfPath). - Reemplazar bucles de TIFF de múltiples cuadros usando
Image.SelectActiveFrame()coninput.LoadImageFrames(tiffPath). - Reemplazar cualquier código de preprocesamiento personalizado (redimensionamiento System.Drawing, contraste, umbral) con las llamadas de filtro
OcrInputequivalentes. - Elimina el directorio tessdata de todos los manifiestos de implementación, archivos Dockerfile y pasos de copia de CI.
- Actualizar las pruebas de integración para que se ejecuten en entornos de CI de Linux (GitHub Actions ubuntu-latest, etc.) con el fin de verificar el comportamiento multiplataforma.
Posmigración
- Ejecuta la Suite completa de pruebas en Linux (no solo en Windows) para confirmar que la habilitación de la implementación multiplataforma funciona.
- Verifica que la precisión del OCR sea igual o superior a la referencia de Patagames en el mismo conjunto de imágenes de prueba.
- Confirme que los documentos multilingües produzcan la salida correcta utilizando el enfoque enum
OcrLanguage. - Prueba la entrada de PDF directamente sin la biblioteca de renderizado externa y compara la precisión de la salida con la antigua ruta de renderizado de bitsmap.
- El procesamiento de TIFF de múltiples fotogramas produce el mismo número de páginas y contenido de texto que el bucle de enumeración de fotogramas anterior.
- Confirme que el directorio tessdata no está presente en el artefacto de implementación y que no se producen errores de ruta en tiempo de ejecución.
- Ejecute una compilación de Docker que apunte a
linux/amd64y ejecute al menos una llamada OCR dentro del contenedor. - Verifica que el proceso de CI (GitHub Actions, GitLab CI, Azure DevOps) se complete correctamente en su ejecutor Linux predeterminado.
- Comprueba que las puntuaciones de confianza estén disponibles en el resultado y que cualquier lógica de filtrado basada en la confianza funcione según lo esperado.
- Confirme que la inicialización de la clave de licencia se ejecute antes de que se cree la primera instancia
IronTesseracten el código de arranque de producción.
Principales ventajas de migrar a IronOCR
Implementación multiplataforma sin cambios en el código. Tras la migración, el mismo binario se ejecuta en Windows Server, contenedores Docker de Ubuntu, máquinas de desarrollo de macOS, Azure App Service en Linux y AWS Lambda. No hay condiciones de plataforma, ni indicadores de identificador de tiempo de ejecución, ni artefactos de implementación separados por sistema operativo. Una migración a la nube que antes se veía bloqueada por la biblioteca OCR exclusiva de Windows se convierte en una implementación estándar en contenedores. Las guías de implementación de Linux, Docker, Azure y AWS abarcan las configuraciones de producción para cada destino.
La gestión de Tessdata desaparece de las operaciones. El directorio tessdata —su ubicación, su contenido, su presencia en todos los entornos— ya no existe como una preocupación operativa. Los datos de idioma son una dependencia de NuGet resuelta en tiempo de compilación. Aparecen automáticamente en la salida dotnet publish. No hay guías de implementación que actualizar al añadir un nuevo idioma, ni capas de Docker que invalidar cuando cambian los archivos tessdata, ni incidentes de producción por falta de tessdata que investigar.
La salida estructurada reemplaza la cadena de análisis. Las aplicaciones que anteriormente analizaban la cadena plana de GetTextFromImage para extraer campos, validar contenido o calcular la confianza ahora acceden a esos datos directamente desde OcrResult. Las coordenadas de las WORD, los límites de línea, las agrupaciones de párrafos y las puntuaciones de confianza por WORD son propiedades de primer orden. La extracción de campos por cuadro delimitador — la base del procesamiento de facturas y del OCR de formularios — es una llamada CropRectangle directa en lugar de una búsqueda de subcadenas frágil.
El preprocesamiento integrado reemplaza las tuberías de imágenes personalizadas. Cualquier código de preprocesamiento escrito para compensar la falta de filtros integrados de Patagames se puede reemplazar con llamadas al método OcrInput. La corrección de la inclinación, la eliminación de ruido, la mejora del contraste, la binarización y la normalización de la resolución son operaciones de una sola línea. Los equipos que pasaron 20-40 horas construyendo y ajustando una tubería de preprocesamiento System.Drawing pueden reemplazarla con cinco llamadas de método y redirigir ese esfuerzo de mantenimiento a otro lugar. Consulte la descripción general de las funciones de preprocesamiento para ver el catálogo completo de filtros.
La compatibilidad nativa con PDF elimina una clase de dependencia. Se eliminan las bibliotecas de renderización de PDF añadidas únicamente para cubrir la carencia de Patagames en este ámbito. Un sistema de OCR en producción que anteriormente requería coordinar actualizaciones a través de tres paquetes — Tesseract.Net.SDK, un renderizador de PDF y su dependencia System.Drawing compartida — ahora tiene un paquete de OCR sin dependencias de conexión. La entrada de PDF, incluidos los documentos protegidos con contraseña y de varias páginas, es un tipo de entrada de primera clase. Para casos de uso de cumplimiento y gestión de registros, result.SaveAsSearchablePdf() produce salida PDF con capa de texto en una sola llamada sin bibliotecas adicionales.
Precios transparentes y soporte comercial. La licencia perpetua Lite de IronOCR cubre un desarrollador y un único lugar de implementación con un año de actualizaciones incluido. Los precios son públicos, la estructura de niveles es clara y se ofrece asistencia comercial sin necesidad de un contrato Enterprise. Los equipos que pagaban las tarifas de Patagames por la envoltura de Tesseract solo para Windows obtienen ahora implementación multiplataforma, preprocesamiento, compatibilidad con PDF y más de 125 idiomas, al tiempo que pasan a un modelo de precios en el que el coste se conoce antes de que finalice la evaluación. Consulte las condiciones de licencia de IronOCR para obtener todos los detalles de los planes y la página del producto IronOCR para obtener una licencia de prueba gratuita.
