Belgelerdeki Tabloları C# ile Nasıl Okursunuz?

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

IronOCR, C# geliştiricilerinin gelişmiş makine öğrenimi modellerini kullanarak PDF'lerdeki ve görüntülerdeki tablolardan veri çıkarmasını sağlar; hem temel hücreleri içeren basit tabloları hem de ReadDocumentAdvanced yöntemini kullanarak birleştirilmiş hücreleri içeren faturalar gibi karmaşık yapıları işler.

Basit Tesseract kullanarak tablolardan veri çıkarmak zordur çünkü metin genellikle hücrelerde bulunur ve belge boyunca seyrek bir şekilde dağılmıştır. Ancak, kütüphanemiz, tablo verilerini doğru bir şekilde algılamak ve çıkarmak için eğitilmiş ve optimize edilmiş bir makine öğrenimi modeli içerir. Finansal raporlar, envanter listeleri veya fatura verileri işliyorsanız, IronOCR yapılandırılmış verileri verimli bir şekilde çözümlemek için araçlar sağlar.

Basit tablolar için, standart OcrInput sınıfını kullanarak basit tablo algılamasına güvenin. Daha karmaşık yapılar için, özel ReadDocumentAdvanced yöntemimiz, tabloları etkili bir şekilde ayrıştırarak ve verileri sunarak sağlam sonuçlar sağlar. Bu gelişmiş yöntem, makine öğrenimini, tablo düzenlerini, birleşik hücreleri ve geleneksel OCR'un genellikle zorlandığı karmaşık biçimlendirmeleri anlamak için kullanır.

Hızlı Başlangıç: Bahsedilen Bir Çağrıda Karmaşık Tablo Hücreleri Çıkarın

Birkaç dakika içinde kullanıma başlayın — bu örnek, ReadDocumentAdvanced kullanan tek bir IronOCR çağrısının, karmaşık bir belgeden ayrıntılı tablo hücresi verilerini nasıl sağladığını gösterir.
Gelişmiş tablo algılama uygulayarak bir PDF yükleyip, hücre bilgilerini doğrudan listeleme yoluyla kullanım kolaylığını gösterir.

  1. IronOCR aşağıdaki NuGet Paket Yöneticisi ile yükleyin

    PM > Install-Package IronOcr
  2. Bu kod parçacığını kopyalayın ve çalıştırın.

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

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

    arrow pointer

IronOCR kullanarak tabloları okumaya başlama adımlarınızı aşağıda adım adım gösteriyoruz:


Basit Tablolardan Nasıl Veri Çıkarılır?

ReadDataTables özelliğini true olarak ayarlamak, Tesseract kullanılarak tablo algılamayı etkinleştirir. Bu yaklaşım, birleşik hücreler olmadan açık hücre sınırlarına sahip basit tablolar için iyi çalışır. Bu özelliği test etmek için, indirme linki burada: 'simple-table.pdf' ile basit bir tablo PDF'si oluşturdum. Birleşik hücreler olmadan basit tablolar bu yöntemle algılanabilir. Daha karmaşık tablolar için aşağıda açıklanan yönteme bakın.

Standart tablo algılama yöntemi özellikle şunlar için etkilidir:

  • Elektronik tablolardan elde edilen veriler
  • Tutarlı satır/sütun yapısına sahip temel veri tabloları
  • Tabular veri içeren raporlar
  • Basit envanter listeleri

PDF OCR metin çıkarma genel olarak çalışıyorsanız, bu yöntem IronOCR'un daha geniş belge işleme kabiliyetleriyle 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 bulabileceğiniz daha yaygın karmaşık tablolardan biri faturalar. Faturalar, birleşik hücreler, değişken sütun genişlikleri ve iç içe yapıların olduğu veri satırları ve sütunlarına sahip karmaşık tablolardır. IronOCR ile, bunları etkili bir şekilde işlemek için ReadDocumentAdvanced yöntemini kullanıyoruz. Süreç, belgeyi taramak, tablo yapısını tanımlamak ve verileri çıkarmak içerir. Bu örnekte, IronOCR'un faturadaki bilgilerin tümünü nasıl aldığını göstermek için 'invoiceTable.pdf' dosyasını kullanıyoruz.

ReadDocumentAdvanced yöntemi, IronOcr.Extensions.AdvancedScan paketinin temel IronOCR paketi ile birlikte yüklenmesini gerektirir. Bu uzantı, özellikle karmaşık belge düzenleri için eğitilmiş gelişmiş makine öğrenimi yetenekleri sağlar.

Lütfen dikkate alın
Gelişmiş taramanın .NET Framework'te kullanılması, projenin x64 mimarisinde çalışmasını gerektirir. Proje yapılandırmasına gidin ve bu seçeneği başarabilmek için '32-bit Tercih Et' seçeneğini kaldırın. Aşağıdaki sorun giderme kılavuzunda daha fazla bilgi edinin: ".NET Framework'te Gelişmiş Tarama." )}]

: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: biri kenarlarla çevrili diğeri ise kenarlarla çevrili değil. Kenarlıklı içerik için, kütüphane daha fazla alt bölümlere ayırır ve tablonun yapısına göre analiz eder. Yöntem, şu konularda üstündür:

  • Çeşitli açıklamalara sahip fatura satır kalemleri
  • Çoklu sütun fiyat dökümleri
  • Gönderim ve fatura adres blokları
  • Vergi ve toplam hesaplama bölümleri
  • Başlık ve alt bilgi bilgileri

Sonuçlar aşağıda gösterilmiştir. Bu yöntem, kenarlarla çevrili bilgiler üzerine odaklandığı için, birden fazla satıra yayılmış birleşik hücreler tek bir hücre olarak kabul edilecektir.

Çıkarılan Veriler Nasıl Görünür?

Iron Software OCR, sevkiyat faturasındaki tablo verilerini yapılandırılmış hiyerarşik biçime çıkarıyor

Çıkarılan Tablo Hücrelerini Nasıl Organize Eder ve İşlerim?

Şu anki uygulamada, çıkarılan hücreler henüz düzgün bir şekilde organize edilmemiştir. Ancak, her hücre de X ve Y koordinatları, boyutları ve daha fazlası gibi değerli bilgiler içerir. Bu veriler kullanılarak, çeşitli amaçlar için bir yardımcı sınıf oluşturabiliriz. Hücre bilgileri şunları içerir:

  • Konumlandırma için doğru X/Y koordinatları
  • Genişlik ve yükseklik boyutları
  • Metin içeriği
  • Güvenlik puanları
  • Hücre ilişkileri

Bu ayrıntılı bilgiler, tablo yapısını programlı olarak yeniden oluşturmanıza ve veri çıkarmak için özel mantık uygulamanıza olanak tanır. Bu koordinatları kullanarak aynı zamanda, sonraki işlemlerde hedeflenen OCR işlemleri için belirli bölgeleri tanımlayabilirsiniz.

İşte bazı temel yardımcı yöntemler:

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 verecektir. Taranmış belgeler için, minimum 300 DPI olduğundan emin olun.

  2. Ön İşleme: Düşük kaliteli veya eğik tablolar içeren belgeler için, işleme başlamadan önce IronOCR'un görsel düzeltme özelliklerini kullanmayı düşünün.

  3. Performans: Birden fazla tablo içeren büyük belgeler için, 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 çıkış seçenekleri ve işlenmiş belgelerinizden aranabilir PDF'ler oluşturmayı öğrenin.

  5. Akış İşleme: Web uygulamaları veya hafızada tutulan belgelerle çalışılan senaryolar için, dosya sistemi işlemlerinden kaçınmak amacıyla 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 aracılığıyla güçlü tablo çıkarma yetenekleri sağlar. Standart yaklaşım basit tablolar için iyi sonuç verirken, ReadDocumentAdvanced yöntemi faturalar gibi karmaşık belgelerde daha başarılıdır. Verilen yardımcı yöntemlerle, çıkarılan verileri özel ihtiyaçlarınıza göre düzenleyebilir ve işleyebilirsiniz.

Belge işleme iş akışlarınızı geliştirmek ve .NET uygulamalarınızda optik karakter tanımanın tüm potansiyelini değerlendirmek için daha fazla IronOCR özelliğini keşfedin.

Sıkça Sorulan Sorular

PDF'lerden ve görüntülerden tabloları C# ile nasıl çıkarabilirim?

IronOCR, C# geliştiricilerinin PDF'lerden ve görüntülerden tablo verilerini gelişmiş makine öğrenimi modelleri kullanarak çıkarmalarını sağlar. Basit tablolar için, ReadDataTables özelliği true olarak ayarlanmış OcrInput sınıfını kullanın. Birleşik hücreler içeren karmaşık tablolar için, daha doğru sonuçlar için ReadDocumentAdvanced yöntemini kullanın.

Basit ve karmaşık tablo çıkarma arasındaki fark nedir?

IronOCR'deki basit tablo çıkarma, Tesseract ile ReadDataTables özelliğini kullanır ve net hücre sınırlarına sahip temel tablolar için iyi çalışır. Karmaşık tablo çıkarma, birleşik hücreler, faturalar ve karmaşık biçimlendirmeleri ele almak için makine öğrenimini kullanan ReadDocumentAdvanced yöntemini gerektirir.

Karmaşık tablolardan verileri nasıl hızlıca çıkarabilirim?

IronOCR'nin ReadDocumentAdvanced yöntemini bir çağrıda kullanın: var cells = new IronTesseract().ReadDocumentAdvanced(new OcrInput().LoadPdf('invoiceTable.pdf')).Tables.First().CellInfos; Bu, tablo düzenlerini ve karmaşık biçimlendirmeleri anlamak için makine öğrenimini kullanır.

Basit tablo algılamasıyla en iyi çalışan belge türleri nelerdir?

IronOCR'nin basit tablo algılama yöntemi, özellikle e-tablo dışa aktarmaları, tutarlı satır/sütun yapısına sahip temel veritabloları, tablosal veriler içeren raporlar ve birleşik hücreleri olmayan basit envanter listeleriyle iyi çalışır.

Temel tablolar için tablo algılamayı nasıl etkinleştiririm?

IronOCR içinde temel tablolar için tablo algılamayı etkinleştirmek için ReadDataTables özelliğini true olarak ayarlayın. Bu, Tesseract'ın tablo algılama yeteneklerini kullanır ve net hücre sınırlarına sahip, birleşik hücreleri olmayan tablolar için iyi çalışır.

Kütüphane karmaşık yerleşimlerle fatura ve mali raporları işleyebilir mi?

Evet, IronOCR'nin ReadDocumentAdvanced yöntemi, karmaşık belgeleri işlemek için özel olarak tasarlanmıştır, örneğin faturalar ve mali raporlar gibi. Birleşik hücreler ve karmaşık biçimlendirmelerle tablo verilerini algılamak ve çıkarmak için eğitilmiş makine öğrenimi modellerini kullanır.

IronOCR mevcut uygulamalara entegre edilebilir mi?

IronOCR, C# kullanarak mevcut uygulamalara kolayca entegre edecek şekilde tasarlanmıştır, bu sayede geliştiriciler, yazılımlarına minimal çabayla OCR işlevselliği ekleyebilir.

IronOCR'yi belge yönetimi için kullanmanın faydaları nelerdir?

IronOCR'yi belge yönetimi için kullanmak, taranmış belgeleri aranabilir ve düzenlenebilir metne dönüştürerek iş akışını hızlandırır, manuel veri giriş ihtiyacını azaltır ve belge erişilebilirliğini artırır.

IronOCR veri doğruluğunu nasıl artırabilir?

IronOCR, gelişmiş tanıma algoritmaları ve görüntü düzeltme özellikleriyle veri doğruluğunu artırır, böylece metin çıkarım sürecinin hem güvenilir hem de kesin olmasını sağlar.

IronOCR için ücretsiz bir deneme mevcut mu?

Evet, Iron Software, IronOCR'nin özelliklerini ve yeteneklerini, bir satın alma kararı vermeden önce test edebilmek için ücretsiz bir deneme sunar.

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku
Gözden Geçiren
Jeff Fritz
Jeffrey T. Fritz
Baş Program Yöneticisi - .NET Topluluğu Ekibi
Jeff, .NET ve Visual Studio ekipleri için bir Baş Program Yöneticisidir. .NET Conf sanal konferans serisinin baş yapımcısıdır ve haftada iki kez canlı yayınlanan 'Fritz and Friends' adlı bir akış programı sunar; burada izleyicilerle birlikte teknoloji konuşur ve kod yazar. Jeff, en büyük Microsoft geliştirici etkinlikleri için atölyeler, sunumlar ve içerik planları yazar, Microsoft Build, Microsoft Ignite, .NET Conf ve Microsoft MVP Summit gibi etkinliklerde yer alır.
Başlamaya Hazır mısınız?
Nuget İndirmeler 5,896,332 | Sürüm: 2026.5 just released
Still Scrolling Icon

Hâlâ Kaydırıyor Musunuz?

Hızlıca kanıt ister misiniz? PM > Install-Package IronOcr
örnek çalıştır görüntünüzün aranabilir metin haline gelmesini izleyin.