Belgelerdeki Tabloları C# ile Nasıl Okurum?
IronOCR, C# geliştiricilerinin, basit hucrelerle temel tablolarin ve birlesik hucrelerle faturalar gibi karmasik yapilarin basarili bir sekilde yonetildigi ReadDocumentAdvanced yöntemini kullanarak, gelişmiş makine ogrenmesi modelleri ile PDF'lerde ve görüntülerdeki tablolardan veri cikarmasina olanak tanir.
Düz Tesseract kullanarak tablolardan veri çıkarmak zorlayıcı olabilir çünkü metin genellikle hücrelerde yer alır ve belge geneline yayılmıştır. Ancak kütüphanemiz, tablo verilerini doğru bir şekilde tespit etmek ve çıkarmak için eğitilmiş ve ince ayarlanmış bir makine öğrenimi modeli içerir. Mali raporları, envanter listelerini veya fatura verilerini işlerken, IronOCR yapılandırılmış verileri verimli bir şekilde ayrıştırmak için araçlar sağlar.
Basit tablolar icin, standart OcrInput sinifini kullanarak dogrudan tablolari tespit etme işlemiyle guvenebilirsiniz. Daha karmasik yapilar icin, ozel ReadDocumentAdvanced yöntemimiz, tablolarin basarili bir sekilde ayrilisini yaparak guclu sonuc saglar ve verileri ulastirir. Bu gelişmiş yöntem, tablo düzenlerini, birleşik hücreleri ve geleneksel OCR'nin genellikle zorlandığı karmaşık formatlamaları anlamak için makine öğrenimini kullanır.
Hızlı Başlangıç: Tek Çağrıda Karmaşık Tablo Hücrelerini Çıkarın
Dakikalar icinde calismaya başlayin—bu örnek, ReadDocumentAdvanced kullanarak yapilan tek bir IronOCR cagrisinin, karmasik bir belgeden ayrintili tablo hucre verilerini nasıl sagladigini gösterir.
PDF'yi yükleyerek, gelişmiş tablo algılamasını uygulayarak ve doğrudan hücre bilgisi listesini geri döndürerek kullanım kolaylığını gösterir.
-
NuGet Paket Yöneticisi ile https://www.nuget.org/packages/IronOcr yükleyin
PM > Install-Package IronOcr -
Bu kod parçasını kopyalayıp çalıştırın.
var cells = new IronTesseract().ReadDocumentAdvanced(new OcrInput().LoadPdf("invoiceTable.pdf")).Tables.First().CellInfos; -
Canlı ortamınızda test etmek için dağıtın
Bugün projenizde IronOCR kullanmaya başlayın ücretsiz deneme ile
IronOCR kullanarak tabloları okumaya başlamak için aşağıdaki adımlar size rehberlik edecektir:
Minimal Is Akisi (5 adimda)
- Tablolardan veri çıkarmak için bir C# kütüphanesi indirin
- Görüntü ve PDF belgesini çıkarım için hazırlayın
ReadDataTablesözelliğini tablo algılamayı etkinleştirmek için true olarak ayarlayın- Karmaşık tablolar için
ReadDocumentAdvancedyöntemini kullanın - Bu yöntemler tarafından tespit edilen verileri çıkarın
Basit Tablolardan Verileri Nasıl Çıkarırım?
ReadDataTables ozelligini true olarak ayarlamak, Tesseract kullanarak tablo tespiti saglar. Bu yaklaşım, net hücre sınırları olan ve birleşik hücreleri olmayan temel tablolar için iyi çalışır. Bu özelliği test etmek için bir basit tablo PDF'si oluşturdum, burada indirebilirsiniz: 'simple-table.pdf'. Birleşik hücreleri olmayan basit tablolar bu yöntem kullanılarak tespit edilebilir. Daha karmaşık tablolar için aşağıda tanımlanan yönteme başvurun.
Standart tablo algılama yöntemi özellikle şunlar için etkilidir:
- E-tablo dışa aktarımları
- Tutarlı satır/sütun yapısına sahip temel veri tabloları
- Tablolar halinde veriler içeren raporlar
- Basit envanter listeleri
PDF OCR metin çıkarımı ile genel olarak çalışıyorsanız, bu yöntem, IronOCR'un geniş belgesi işleme yetenekleriyle sorunsuz bir şekilde entegre olur.
:path=/static-assets/ocr/content-code-examples/how-to/read-table-in-document-with-tesseract.cs
using IronOcr;
using System;
using System.Data;
// Instantiate OCR engine
var ocr = new IronTesseract();
// Enable table detection
ocr.Configuration.ReadDataTables = true;
using var input = new OcrPdfInput("simple-table.pdf");
var result = ocr.Read(input);
// Retrieve the data
var table = result.Tables[0].DataTable;
// Print out the table data
foreach (DataRow row in table.Rows)
{
foreach (var item in row.ItemArray)
{
Console.Write(item + "\t");
}
Console.WriteLine();
}
Imports Microsoft.VisualBasic
Imports IronOcr
Imports System
Imports System.Data
' Instantiate OCR engine
Private ocr = New IronTesseract()
' Enable table detection
ocr.Configuration.ReadDataTables = True
Dim input = New OcrPdfInput("simple-table.pdf")
Dim result = ocr.Read(input)
' Retrieve the data
Dim table = result.Tables(0).DataTable
' Print out the table data
For Each row As DataRow In table.Rows
For Each item In row.ItemArray
Console.Write(item & vbTab)
Next item
Console.WriteLine()
Next row
Karmaşık Fatura Tablolarını Nasıl Okuyabilirim?
İş ortamlarında bulunan daha yaygın karmaşık tablolardan biri faturadır. Faturalar, genellikle birleşik hücreler, değişen sütun genişlikleri ve iç içe geçmiş yapılar barındırarak, veri satırları ve sütunları olan karmaşık tablolardır. IronOCR ile, onlari etkili bir sekilde yonetmek icin ReadDocumentAdvanced yöntemini kullaniriz. Süreç, belgenin taranmasını, tablo yapısının tanımlanmasını ve verilerin çıkarılmasını içerir. Bu örnekle, IronOCR'un faturadan tüm bilgileri nasıl çıkardığını göstermek için 'invoiceTable.pdf' dosyasını kullanıyoruz.
ReadDocumentAdvanced yöntemi, temel IronOCR paketiyle birlikte IronOcr.Extensions.AdvancedScan paketinin yuklenmesini gerektirir. Bu uzantı, karmaşık belge yerleşimleri için özel olarak eğitilmiş gelişmiş makine öğrenimi yetenekleri sunar.
)}]
:path=/static-assets/ocr/content-code-examples/how-to/read-table-in-document-with-ml.cs
using IronOcr;
using System.Linq;
// Instantiate OCR engine
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf("invoiceTable.pdf");
// Perform OCR
var result = ocr.ReadDocumentAdvanced(input);
var cellList = result.Tables.First().CellInfos;
Imports IronOcr
Imports System.Linq
' Instantiate OCR engine
Dim ocr = New IronTesseract()
Using input As New OcrInput()
input.LoadPdf("invoiceTable.pdf")
' Perform OCR
Dim result = ocr.ReadDocumentAdvanced(input)
Dim cellList = result.Tables.First().CellInfos
End Using
Bu yöntem, belgenin metin verilerini iki kategoriye ayırır: sınırlarla çevrilen ve sınırlar olmadan. Çerçeveli içerik için, kütüphane bunu tablonun yapısına göre alt bölümlere ayırır. Yöntem, şunları ele alırken mükemmeldir:
- Farklı açıklamalara sahip fatura satır kalemleri
- Çok sütunlu fiyat ayrıntıları
- Nakliye ve fatura adres blokları
- Vergi ve toplam hesaplama bölümleri
- Üst bilgi ve alt bilgi bilgileri
Sonuçlar aşağıda gösterilmektedir. Bu yöntem sınırlarla kapatılmış bilgileri hedeflediği için, birden fazla satıra yayılmış birleştirilmiş hücreler tek bir hücre olarak ele alınacaktır.
Çıkarılan Veri Nasıl Görünür?
Çıkarılan Tablo Hücrelerini Nasıl Düzenler ve İşlerim?
Mevcut uygulamada, çıkarılan hücreler henüz doğru şekilde düzenlenmemiştir. Ancak, her hücrede X ve Y koordinatları, boyutlar ve daha fazlası gibi değerli bilgiler mevcuttur. Bu verileri kullanarak, çeşitli amaçlar için bir yardımcı sınıf oluşturabiliriz. Hücre bilgileri şunları içerir:
- Konumlandırma için hassas X/Y koordinatları
- Genişlik ve yükseklik boyutları
- Metin içeriği
- Güven skorları
- Hücre ilişkileri
Bu ayrıntılı bilgi, tablo yapısını programatik olarak yeniden inşa etmenizi ve veri çıkarma için özel mantık uygulamanızı sağlar. Bu koordinatları, sonraki işlemlerde hedeflenen OCR işleme için belirli bölgeleri tanımlamak için de kullanabilirsiniz.
Aşağıda bazı temel yardımcı yöntemler bulunmaktadır:
using System;
using System.Collections.Generic;
using System.Linq;
// A helper class to process table data by sorting cells based on coordinates
public static class TableProcessor
{
// Method to organize cells by their coordinates (Y top to bottom, X left to right)
public static List<CellInfo> OrganizeCellsByCoordinates(List<CellInfo> cells)
{
// Sort cells by Y (top to bottom), then by X (left to right)
var sortedCells = cells
.OrderBy(cell => cell.CellRect.Y)
.ThenBy(cell => cell.CellRect.X)
.ToList();
return sortedCells;
}
// Example method demonstrating how to process multiple tables
public static void ProcessTables(Tables tables)
{
foreach (var table in tables)
{
var sortedCells = OrganizeCellsByCoordinates(table.CellInfos);
Console.WriteLine("Organized Table Cells:");
// Initialize previous Y coordinate
int previousY = sortedCells.Any() ? sortedCells.First().CellRect.Y : 0;
foreach (var cell in sortedCells)
{
// Print a new line if the Y-coordinate changes, indicating a new row
if (Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8)
{
Console.WriteLine(); // Start a new row
previousY = cell.CellRect.Y;
}
// Print the cell text followed by a tab
Console.Write($"{cell.CellText}\t");
}
Console.WriteLine("\n--- End of Table ---"); // End of a table
}
}
// Method to extract a specific row by the given index
public static List<CellInfo> ExtractRowByIndex(TableInfo table, int rowIndex)
{
if (table == null || table.CellInfos == null || !table.CellInfos.Any())
{
throw new ArgumentException("Table is empty or invalid.");
}
var sortedCells = OrganizeCellsByCoordinates(table.CellInfos);
List<List<CellInfo>> rows = new List<List<CellInfo>>();
// Group cells into rows based on Y coordinates
int previousY = sortedCells.First().CellRect.Y;
List<CellInfo> currentRow = new List<CellInfo>();
foreach (var cell in sortedCells)
{
if (Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8)
{
// Store the completed row and start a new one
rows.Add(new List<CellInfo>(currentRow));
currentRow.Clear();
previousY = cell.CellRect.Y;
}
currentRow.Add(cell);
}
// Add the last row if it wasn't added yet
if (currentRow.Any())
{
rows.Add(currentRow);
}
// Retrieve the specified row
if (rowIndex < 0 || rowIndex >= rows.Count)
{
throw new IndexOutOfRangeException($"Row index {rowIndex} is out of range.");
}
return rows[rowIndex];
}
}
using System;
using System.Collections.Generic;
using System.Linq;
// A helper class to process table data by sorting cells based on coordinates
public static class TableProcessor
{
// Method to organize cells by their coordinates (Y top to bottom, X left to right)
public static List<CellInfo> OrganizeCellsByCoordinates(List<CellInfo> cells)
{
// Sort cells by Y (top to bottom), then by X (left to right)
var sortedCells = cells
.OrderBy(cell => cell.CellRect.Y)
.ThenBy(cell => cell.CellRect.X)
.ToList();
return sortedCells;
}
// Example method demonstrating how to process multiple tables
public static void ProcessTables(Tables tables)
{
foreach (var table in tables)
{
var sortedCells = OrganizeCellsByCoordinates(table.CellInfos);
Console.WriteLine("Organized Table Cells:");
// Initialize previous Y coordinate
int previousY = sortedCells.Any() ? sortedCells.First().CellRect.Y : 0;
foreach (var cell in sortedCells)
{
// Print a new line if the Y-coordinate changes, indicating a new row
if (Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8)
{
Console.WriteLine(); // Start a new row
previousY = cell.CellRect.Y;
}
// Print the cell text followed by a tab
Console.Write($"{cell.CellText}\t");
}
Console.WriteLine("\n--- End of Table ---"); // End of a table
}
}
// Method to extract a specific row by the given index
public static List<CellInfo> ExtractRowByIndex(TableInfo table, int rowIndex)
{
if (table == null || table.CellInfos == null || !table.CellInfos.Any())
{
throw new ArgumentException("Table is empty or invalid.");
}
var sortedCells = OrganizeCellsByCoordinates(table.CellInfos);
List<List<CellInfo>> rows = new List<List<CellInfo>>();
// Group cells into rows based on Y coordinates
int previousY = sortedCells.First().CellRect.Y;
List<CellInfo> currentRow = new List<CellInfo>();
foreach (var cell in sortedCells)
{
if (Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8)
{
// Store the completed row and start a new one
rows.Add(new List<CellInfo>(currentRow));
currentRow.Clear();
previousY = cell.CellRect.Y;
}
currentRow.Add(cell);
}
// Add the last row if it wasn't added yet
if (currentRow.Any())
{
rows.Add(currentRow);
}
// Retrieve the specified row
if (rowIndex < 0 || rowIndex >= rows.Count)
{
throw new IndexOutOfRangeException($"Row index {rowIndex} is out of range.");
}
return rows[rowIndex];
}
}
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.Linq
' A helper class to process table data by sorting cells based on coordinates
Public Module TableProcessor
' Method to organize cells by their coordinates (Y top to bottom, X left to right)
Public Function OrganizeCellsByCoordinates(ByVal cells As List(Of CellInfo)) As List(Of CellInfo)
' Sort cells by Y (top to bottom), then by X (left to right)
Dim sortedCells = cells.OrderBy(Function(cell) cell.CellRect.Y).ThenBy(Function(cell) cell.CellRect.X).ToList()
Return sortedCells
End Function
' Example method demonstrating how to process multiple tables
Public Sub ProcessTables(ByVal tables As Tables)
For Each table In tables
Dim sortedCells = OrganizeCellsByCoordinates(table.CellInfos)
Console.WriteLine("Organized Table Cells:")
' Initialize previous Y coordinate
Dim previousY As Integer = If(sortedCells.Any(), sortedCells.First().CellRect.Y, 0)
For Each cell In sortedCells
' Print a new line if the Y-coordinate changes, indicating a new row
If Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8 Then
Console.WriteLine() ' Start a new row
previousY = cell.CellRect.Y
End If
' Print the cell text followed by a tab
Console.Write($"{cell.CellText}" & vbTab)
Next cell
Console.WriteLine(vbLf & "--- End of Table ---") ' End of a table
Next table
End Sub
' Method to extract a specific row by the given index
Public Function ExtractRowByIndex(ByVal table As TableInfo, ByVal rowIndex As Integer) As List(Of CellInfo)
If table Is Nothing OrElse table.CellInfos Is Nothing OrElse Not table.CellInfos.Any() Then
Throw New ArgumentException("Table is empty or invalid.")
End If
Dim sortedCells = OrganizeCellsByCoordinates(table.CellInfos)
Dim rows As New List(Of List(Of CellInfo))()
' Group cells into rows based on Y coordinates
Dim previousY As Integer = sortedCells.First().CellRect.Y
Dim currentRow As New List(Of CellInfo)()
For Each cell In sortedCells
If Math.Abs(cell.CellRect.Y - previousY) > cell.CellRect.Height * 0.8 Then
' Store the completed row and start a new one
rows.Add(New List(Of CellInfo)(currentRow))
currentRow.Clear()
previousY = cell.CellRect.Y
End If
currentRow.Add(cell)
Next cell
' Add the last row if it wasn't added yet
If currentRow.Any() Then
rows.Add(currentRow)
End If
' Retrieve the specified row
If rowIndex < 0 OrElse rowIndex >= rows.Count Then
Throw New IndexOutOfRangeException($"Row index {rowIndex} is out of range.")
End If
Return rows(rowIndex)
End Function
End Module
Tablo Çıkarma için En İyi Uygulamalar
IronOCR ile tablo çıkarma çalışırken bu en iyi uygulamaları göz önünde bulundurun:
-
Belge Kalitesi: Daha yüksek çözünürlüklü belgeler daha iyi sonuçlar verir. Taralı belgeler için, minimum 300 DPI sağladığınızdan emin olun.
-
Ön işleme: Düşük kaliteli veya eğik tablolara sahip belgeler için, işleme öncesinde IronOCR'nin görüntü düzeltme özelliklerini kullanmayı düşünün.
-
Performans: Birden fazla tablo içeren büyük belgelerde, sayfaları paralel olarak işlemek için çoklu iş parçacığı ve eşzamanlı destek kullanmayı düşünün.
-
Çıktı Seçenekleri: Tablo verilerini çıkardıktan sonra, sonuçları çeşitli formatlarda dışa aktarabilirsiniz. Veri çıktı seçeneklerini ve işlenmiş belgelerinizden arama yapılabilir PDF'ler oluşturmayı öğrenin.
- Akış İşleme: Web uygulamaları veya bellekteki belgelerle çalışan senaryolar için, dosya sistemi işlemlerinden kaçınmak için PDF akışları için OCR kullanmayı düşünün.
Özet
IronOCR, hem standart Tesseract tabanlı algılama hem de gelişmiş makine öğrenimi yöntemleri ile güçlü tablo çıkartma yetenekleri sağlar. Standart yaklasim, basit tablolar icin iyi bir sonuc verirken, ReadDocumentAdvanced yöntemi, faturalar gibi karmasik belgelerde basarili olur. Sağlanan yardımcı yöntemlerle, çıkarılan verileri belirli ihtiyaçlarınıza uygun şekilde organize edebilir ve işleyebilirsiniz.
Belge işleme iş akışlarınızı geliştirmek ve .NET uygulamalarınızda optik karakter tanımanın tam potansiyelinden yararlanmak için daha fazla IronOCR özelliklerini keşfedin.
Sıkça Sorulan Sorular
PDF'lerden ve görüntülerden tablo verilerini C#'ta nasıl çıkarabilirim?
IronOCR, C# geliştiricilerinin gelişmiş makine öğrenimi modelleri kullanarak PDF'lerden ve görüntülerden tablo verisi çıkarmalarına olanak tanır. Basit tablolar için, ReadDataTables özelliği true olarak ayarlanan OcrInput sınıfını kullanın. Birleşik hücreleri olan karmaşık tablolar için daha doğru sonuçlar için ReadDocumentAdvanced yöntemini kullanın.
Basit ve karmaşık tablo çıkarımı arasındaki fark nedir?
IronOCR'de basit tablo çıkarımı, Tesseract ile ReadDataTables özelliğini kullanır. Bu yöntem, açık hücre sınırlarına sahip temel tablolar için uygundur. Karmaşık tablo çıkarımı, birleşik hücreler, faturalar ve karmaşık biçimlendirme için makine öğrenimini kullanan ReadDocumentAdvanced yöntemini gerektirir.
Karmaşık tablolardan veriyi nasıl hızlıca çıkarabilirim?
Tek bir çağrıyla IronOCR'un ReadDocumentAdvanced yöntemini kullanın: var cells = new IronTesseract().ReadDocumentAdvanced(new OcrInput().LoadPdf('invoiceTable.pdf')).Tables.First().CellInfos; Bu, tablo düzenlerini ve karmaşık biçimlendirmeyi anlamak için makine öğrenimini kullanır.
Hangi tür belgeler basit tablo tespiti ile en iyi şekilde çalışır?
IronOCR'un basit tablo tespit yöntemi, özellikle hesap çizelgesi ihracatları, tutarlı satır/sütun yapısına sahip temel veri tabloları, tablosal verilere sahip raporlar ve birleşik hücreler olmadan basit envanter listeleri ile iyi çalışır.
Basit tablolar için tablo tespitini nasıl etkinleştiririm?
IronOCR'de basit tablolar için tablo tespitini etkinleştirmek adına ReadDataTables özelliğini true olarak ayarlayın. Bu, Tesseract'in tablo tespit kabiliyetlerini kullanır ve açık hücre sınırlarına sahip, birleşik hücreler içermeyen tablolar için uygundur.
Kütüphane karmaşık düzenlere sahip faturalar ve finansal raporları işleyebilir mi?
Evet, IronOCR'un ReadDocumentAdvanced yöntemi, fatura ve finansal raporlar gibi karmaşık belgeleri işlemek için özel olarak tasarlanmıştır. Birleşik hücreler ve karmaşık biçimlendirmeye sahip tablolardan veri tespit etmek ve çıkarmak için eğitilmiş makine öğrenim modellerini kullanır.

