Belgelerdeki Tabloları C&#35 ile Nasıl Okurum?

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

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.

  1. NuGet Paket Yöneticisi ile https://www.nuget.org/packages/IronOcr yükleyin

    PM > Install-Package IronOcr
  2. Bu kod parçasını kopyalayıp çalıştırın.

    var cells = new IronTesseract().ReadDocumentAdvanced(new OcrInput().LoadPdf("invoiceTable.pdf")).Tables.First().CellInfos;
  3. Canlı ortamınızda test etmek için dağıtın

    Bugün projenizde IronOCR kullanmaya başlayın ücretsiz deneme ile

    arrow pointer

IronOCR kullanarak tabloları okumaya başlamak için aşağıdaki adımlar size rehberlik edecektir:


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
$vbLabelText   $csharpLabel

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.

Lütfen dikkate alin
.NET Framework üzerinde gelişmiş tarama kullanmak, projenin x64 mimarisinde çalıştırılmasını gerektirir. Bu hedefe ulaşmak için proje yapılandırmasına gidin ve "32-bit Tercih Et" seçeneğinin işaretini kaldırın. İleri Tarama .NET Framework üzerinde daha fazla bilgi için şu sorun giderme rehberine göz atın: "Advanced Scan on .NET Framework."
)}]

: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
$vbLabelText   $csharpLabel

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?

IronSoftware OCR, nakliye faturalarından tablo verilerini yapılandırılmış hiyerarşik formata çıkarıyor

Çı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
$vbLabelText   $csharpLabel

Tablo Çıkarma için En İyi Uygulamalar

IronOCR ile tablo çıkarma çalışırken bu en iyi uygulamaları göz önünde bulundurun:

  1. 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.

  2. Ö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.

  3. 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.

  4. Çı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.

  5. 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.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında lisans derecesine sahiptir (Carleton Üniversitesi) ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirme üzerine uzmanlaşmıştır. Kullanıcı dostu ve estetik açıdan hoş arayüzler tasarlamaya tutkuyla bağlı olan Curtis, modern çerç...

Daha Fazlasını Oku
İnceleyen
Jeff Fritz
Jeffrey T. Fritz
Baş Program Yöneticisi - .NET Topluluk Ekibi
Jeff, aynı zamanda .NET ve Visual Studio ekipleri için Baş Program Yöneticisi'dir. Microsoft geliştirici etkinlikleri (Microsoft Build, Microsoft Ignite, .NET Conf, Microsoft MVP Summit) için atölye çalışmaları, sunumlar yazar ve içerik planlar ve haftada iki kez yayınlanan 'Fritz ve Arkadaşları' canlı yayınının ev sahibidir.
Başlamaya Hazır mısınız?
Nuget İndirmeler 5,585,834 | Sürüm: 2026.4 just released
Still Scrolling Icon

Hala Kaydiriyor musunuz?

Hızlı bir kanit mi istiyorsunuz? PM > Install-Package IronOcr
örnekleri çalıştır resminizin aranabilir metne donuşünü izleyin.