# 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:
```txt
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.
```csharp
var ocr = new IronTesseract();
ocr.Configuration.ReadDataTables = true;
var input = 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`.
```csharp
input.Dilate();
input.SaveAsImages("export.png", AnyBitmap.ImageFormat.Png);
var res = ocr.ReadDocumentAdvanced(input);
Console.WriteLine(res.Tables.First().CellInfos.First().CellText);
```
`Dilate()` konwertuje kropkowane linie wizualne na solidne granice, ktore silnik moze sledzic, wiec`res.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.

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
Unhandled exception. System.InvalidOperationException: Sequence contains no elements
Text
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");
C#
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);
C#
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.
Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podręczników.