Wykrywanie tabel z kropkowanymi granicami z ReadDocumentAdvanced
ReadDocumentAdvanced wyodrebnia dane tabeli, komórka po komórce, ale nie moze wykryc tabel z kropkowanymi lub kreskowanymi granicami (przyklad border: 1px dotted black). Tekst na stronie moze byc nadal czytelny, ale dostep do obiektu tabeli sie nie powiedzie, poniewaz silnik nigdy nie rozpoznaje tabeli.
Gdy wywolujesz ReadDocumentAdvanced na dokumencie z kropkowana granica tabeli, a nastepnie odczytujesz jego komorki, wyrzuca:
Unhandled exception. System.InvalidOperationException: Sequence contains no elements
Przerwy miedzy kropkami dziela granice na nieciagle segmenty, wiec silnik OCR nie widzi ciaglego konturu, ktory moznaby uznac za granice tabeli. Brak wykrytej Tables, Tables.First() nie ma nic do zwrocenia.
Rozwiązanie
Zastosuj filtr Dilate() przed przetwarzaniem. Dylatacja rozszerza ciemne piksele na obrazie, zamykajac luki miedzy kropkami, aby granica odczytywac sie jako jedna solidna linia. Wtedy silnik moze wykryc obiekt tabeli i zwrocic jego komorki.
1. Wlacz odczyt tabel i zaladuj dane wejsciowe.
Wlacz ReadDataTables, aby silnik zbudowal strukturalny wynik tabeli, a nastepnie zaladuj obraz.
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")

2. Dylatacja przed odczytem
Wywolaj Dilate() na wejsciu, aby scalic kropkowana granice w ciagly kontur, a nastepnie uruchom 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)
Dilate() konwertuje kropkowane linie wizualne na solidne granice, ktore silnik moze sledzic, wiecres.Tables jest teraz wypelnione, a odczyt tekstu komorek przebiega czysto. Wywolanie SaveAsImages jest opcjonalne; pozwala to na sprawdzenie obrazu z dylatacja, aby potwierdzic, ze granice zamknely sie zgodnie z oczekiwaniami.


