Detección de Tablas con Bordes Punteados utilizando ReadDocumentAdvanced

This article was translated from English: Does it need improvement?
Translated
View the article in English

ReadDocumentAdvanced extrae datos de tabla celda por celda, pero no puede detectar tablas cuyos bordes son punteados o discontinuos (por ejemplo, border: 1px dotted black). El texto en la página puede seguir siendo legible, pero acceder al objeto tabla falla porque el motor nunca reconoce la tabla.

Cuando llamas a ReadDocumentAdvanced en un documento con una tabla de bordes punteados y luego lees sus celdas, arroja:

Unhandled exception. System.InvalidOperationException: Sequence contains no elements

Los huecos entre los puntos rompen el borde en segmentos discontinuos, por lo que el motor OCR no ve un contorno continuo para tratar como un límite de tabla. Sin Tables detectado, Tables.First() no tiene nada que devolver.

Solución

Aplica el filtro Dilate() antes de procesar. La dilatación expande los píxeles oscuros en la imagen, cerrando los huecos entre los puntos para que el borde se lea como una línea sólida. El motor puede entonces detectar el objeto tabla y devolver sus celdas.

1. Habilitar la lectura de tablas y cargar el input

Activa ReadDataTables para que el motor construya una salida de tabla estructurada, luego carga tu imagen.

var ocr = new IronTesseract();
ocr.Configuration.ReadDataTables = true;
var input = new OcrInput();
input.Load("image-20250408-144240.png");
var ocr = new IronTesseract();
ocr.Configuration.ReadDataTables = true;
var input = new OcrInput();
input.Load("image-20250408-144240.png");
Imports IronTesseract

Dim ocr As New IronTesseract()
ocr.Configuration.ReadDataTables = True
Dim input As New OcrInput()
input.Load("image-20250408-144240.png")
$vbLabelText   $csharpLabel

Tabla de entrada con bordes punteados que el OCR no puede detectar

2. Dilatar antes de leer

Llama a Dilate() en la entrada para fusionar el borde punteado en un contorno continuo, luego ejecuta ReadDocumentAdvanced.

input.Dilate();
input.SaveAsImages("export.png", AnyBitmap.ImageFormat.Png);
var res = ocr.ReadDocumentAdvanced(input);
Console.WriteLine(res.Tables.First().CellInfos.First().CellText);
input.Dilate();
input.SaveAsImages("export.png", AnyBitmap.ImageFormat.Png);
var res = ocr.ReadDocumentAdvanced(input);
Console.WriteLine(res.Tables.First().CellInfos.First().CellText);
Dim res = ocr.ReadDocumentAdvanced(input)
input.Dilate()
input.SaveAsImages("export.png", AnyBitmap.ImageFormat.Png)
Console.WriteLine(res.Tables.First().CellInfos.First().CellText)
$vbLabelText   $csharpLabel

Dilate() convierte las líneas punteadas visuales en bordes sólidos que el motor puede trazar, por lo que res.Tables ahora está poblado y el texto de la celda se lee claramente. La llamada SaveAsImages es opcional; le permite inspeccionar la imagen dilatada para confirmar que los bordes se cerraron como se esperaba.

Tabla después de Dilate() con bordes punteados fusionados en líneas sólidas

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 6,136,090 | Versión: 2026.7 recién lanzado
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package IronOcr
ejecuta una muestra y observa cómo tu imagen se convierte en texto buscable.