Detectando Tabelas de Bordas Pontilhadas com ReadDocumentAdvanced

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

ReadDocumentAdvanced extrai dados de tabela célula por célula, mas não consegue detectar tabelas cujas bordas são pontilhadas ou tracejadas (por exemplo, border: 1px dotted black). O texto na página pode ainda ser legível, mas acessar o objeto tabela falha porque o motor nunca reconhece a tabela.

Quando você chama ReadDocumentAdvanced em um documento com uma tabela de borda pontilhada e então lê suas células, ele lança:

Unhandled exception. System.InvalidOperationException: Sequence contains no elements

As lacunas entre os pontos quebram a borda em segmentos descontínuos, então o motor OCR não vê contorno contínuo para tratar como um limite de tabela. Sem Tables detectadas, Tables.First() não tem nada a retornar.

Solução

Aplique o filtro Dilate() antes de processar. A dilatação expande os pixels escuros na imagem, fechando as lacunas entre os pontos para que a borda seja lida como uma linha sólida. O motor pode então detectar o objeto tabela e retornar suas células.

1. Habilitar leitura de tabelas e carregar a entrada

Ative ReadDataTables para que o motor construa a saída da tabela estruturada, depois carregue sua imagem.

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

Tabela de entrada com bordas pontilhadas que o OCR não detecta

2. Dilar antes de ler

Chame Dilate() na entrada para mesclar a borda pontilhada em um contorno contínuo, depois execute 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() converte as linhas pontilhadas visuais em bordas sólidas que o motor pode rastrear, então res.Tables agora está populada e o texto da célula é lido sem problemas. A chamada SaveAsImages é opcional; ela permite inspecionar a imagem dilatada para confirmar que as bordas se fecharam como esperado.

Tabela após Dilate() com bordas pontilhadas mescladas em linhas sólidas

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais
Pronto para começar?
Nuget Baixar 6,136,090 | Versão: 2026.7 recém-lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package IronOcr
executar um exemplo Veja sua imagem se transformar em texto pesquisável.