.NET OCR SDK: C# için Bir Metin Tanıma Kütüphanesi
Bir .NET OCR SDK, C# ve .NET uygulamalarının görüntülerden, taranmış PDF'lerden ve diğer belge formatlarından programatik olarak metin çıkarmasına izin veren bir yazılım geliştirme kitidir. IronOCR, Tesseract 5 motorunu ön işleme filtreleri, barkod okuma, aranabilir PDF çıktısı ve 125'ten fazla dil desteğine sahip, üretim için hazır bir .NET OCR SDK'dir — Windows, Linux, macOS ve bulut platformlarında çalışan temiz bir C# API ile erişilebilir.
IronOCR'u Projeniz İçin Doğru .NET OCR SDK Yapan Nedir?
Metinden metin tanıma oluşturmak, görüntü ön işleme hatlarını, dil veri dosyalarını, iş parçacığı modellerini ve çıktı ayrıştırmalarını yönetmek anlamına gelir - ilk kelimenizi çıkarmadan önce aylarca çalışma. IronOCR, ekibinizin dakikalar içinde bir projeye bırakabileceği savaşta test edilmiş bir motor göndererek bu ek yükü ortadan kaldırır.
Onu ham Tesseract bağlamalarından ayıran temel yetenekler:
- El yazısı dahil 125+ dil ve yazı sisteminin tanınması
- Dahili filtreler: gürültü giderme, düzgünleştirme, ikili hale getirme, çözünürlük iyileştirme ve kontrast düzeltme
- Aynı okuma geçişinde barkod ve QR kodu tanıma
- Arşivleme iş akışları için görünmez metin katmanlarıyla aranabilir PDF oluşturma
- Yüksek verimli hatlar için eşzamanlı asenkron ve paralel toplu işlem
- İşlem süresini azaltmak için belirli sayfa bölgelerini hedef alan bölgesel OCR
- Windows, Linux, macOS, Docker ve Azure üzerinde çapraz platform desteği
Tesseract OCR projesi belgelerine göre, ham Tesseract dil paketleri, DPI ayarları ve çıktı modları için manuel yapılandırma gerektirir. IronOCR tüm bunları otomatik olarak yönetir, bu sayede çıkartılan metnin ne anlama geldiğine odaklanabilir ve nasıl çıkarılacağını düşünmezsiniz.
IronOCR, Ham Tesseract ile Nasıl Karşılaştırılır?
P/Invoke sarıcı veya Tesseract NuGet paketi aracılığıyla ham Tesseract, tessdata dil dosyalarını indirip yerleştirmek, doğru sayfa segmentasyon modunu seçmek, çok sayfalı TIFF ve PDF'leri kendiniz bölmek ve paralel işlem istiyorsanız iş parçacığını bağlamak sorumluluğunu size bırakır. Bu detayların hiçbiri iş gereksinimlerinize özel değildir.
IronOCR, tüm bu tesisatı sarmalar. Yazılı bir API yüzeyi, otomatik tessdata yönetimi, yerleşik PDF ayırma ve yeniden birleştirme, ve talepler arasında yeniden kullanılabilecek, iş parçacığı güvenli bir motor alırsınız. Ticari kullanım için ödeme gerektiren bir lisans söz konusu—lisanslama sayfası mevcut fiyatlandırma katmanlarını, ücretsiz geliştirme lisansı dahil, göstermektedir.
Sadece açık kaynaklı bağımlılıklar gerektiren ekipler için, özel ön işleme ile ham Tesseract geçerli bir yolu ifade eder. Hızla güvenilir OCR sağlaması gereken ekipler için, IronOCR entegrasyon yüzeyini birkaç satır C#'a indirger.
IronOCR .NET SDK Nasıl Yüklenir?
Kurulum standart .NET paket yöneticisi olan NuGet üzerinden gerçekleşir. Proje dizininizde aşağıdaki komutu çalıştırın:
Install-Package IronOcr
Visual Studio kullanıcıları için, NuGet Paket Yöneticisi arayüzünde IronOcr arayın ve oradan yükleyin. Manuel DLL referansları dahil tüm kurulum seçenekleri için IronOCR kurulum belgelerine bakın.
Kurulumdan sonra, lisans anahtarını uygulamanızın başlangıcına veya appsettings.json ekleyin. Ücretsiz deneme başlatabilirsiniz ve değerlendirme sırasında tüm özellikleri açacak bir deneme anahtarı edinebilirsiniz.
Kurulumu Doğrulama
Kurulumdan sonra hızlı bir akıl sağlığı kontrolü her şeyin doğru bağlandığını onaylar. .NET 10 hedefleyen bir konsol uygulaması oluşturun:
using IronOcr;
// Minimal smoke test -- reads a single image and prints extracted text
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("sample.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
// Minimal smoke test -- reads a single image and prints extracted text
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("sample.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
' Minimal smoke test -- reads a single image and prints extracted text
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadImage("sample.png")
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
Konsolda metin görünüyorsa, SDK kurulu ve lisans anahtarı geçerlidir. Üretim iş akışları oluşturmaya hazırsınız.
C# ile Görüntülerden ve PDF'lerden Metin Nasıl Çıkarılır?
Çekirdek çıkarım deseni tüm giriş türleri arasında tutarlıdır. Bir IronTesseract örneği oluşturur, içeriği bir OcrInput nesnesine yükler ve Read() çağırırsınız. IronOCR dosya biçimini uzantıdan otomatik olarak algılar, bu nedenle aynı kod yolu JPEG, PNG, TIFF, BMP ve çok sayfalı PDF'lerle ilgilenir.
using IronOcr;
// Reusable OCR service encapsulating the IronTesseract engine
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractText(string filePath)
{
using var input = new OcrInput();
// LoadPdf for PDF files; LoadImage for raster formats
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
return _ocr.Read(input).Text;
}
public async Task<string> ExtractTextAsync(string filePath)
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
var result = await _ocr.ReadAsync(input);
return result.Text;
}
}
using IronOcr;
// Reusable OCR service encapsulating the IronTesseract engine
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ExtractText(string filePath)
{
using var input = new OcrInput();
// LoadPdf for PDF files; LoadImage for raster formats
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
return _ocr.Read(input).Text;
}
public async Task<string> ExtractTextAsync(string filePath)
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
var result = await _ocr.ReadAsync(input);
return result.Text;
}
}
Imports IronOcr
' Reusable OCR service encapsulating the IronTesseract engine
Public Class OcrService
Private ReadOnly _ocr As New IronTesseract()
Public Function ExtractText(filePath As String) As String
Using input As New OcrInput()
' LoadPdf for PDF files; LoadImage for raster formats
If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(filePath)
Else
input.LoadImage(filePath)
End If
Return _ocr.Read(input).Text
End Using
End Function
Public Async Function ExtractTextAsync(filePath As String) As Task(Of String)
Using input As New OcrInput()
If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(filePath)
Else
input.LoadImage(filePath)
End If
Dim result = Await _ocr.ReadAsync(input)
Return result.Text
End Using
End Function
End Class
Hizmeti deneyimlemek için üst seviye giriş noktası:
using IronOcr;
var service = new OcrService();
string text = await service.ExtractTextAsync("invoice.pdf");
Console.WriteLine(text);
using IronOcr;
var service = new OcrService();
string text = await service.ExtractTextAsync("invoice.pdf");
Console.WriteLine(text);
Imports IronOcr
Dim service = New OcrService()
Dim text As String = Await service.ExtractTextAsync("invoice.pdf")
Console.WriteLine(text)
IronTesseract örneği iş parçacığı güvenliğindedir ve yeniden kullanım için tasarlanmıştır. ASP.NET Core gibi bağımlılık enjeksiyonu aracılığıyla uygulama başlangıcında bir kez oluşturun ve her istek için yeniden örneklemeyin.
Çok sayfalı PDF'ler için, result.Pages size sayfa başına metin erişimi, güven puanı ve sınır kutuları sunar. Sayfa bazında yineleme üzerine detaylar için çok sayfalı PDF OCR kılavuzuna bakın.
Ön İşleme Filtreleriyle OCR Doğruluğunu Nasıl Geliştirirsiniz?
Düz yatak tarayıcılarından, akıllı telefon kameralarından veya faks makinelerinden gelen ham taramalar sıklıkla gürültü, döndürme, düşük kontrast ve yetersiz çözünürlükten muzdarip olur. IronOCR'un görüntü kalitesi düzeltme hattı her sorunu okuma çağrısının öncesinde zincirleyeceğiniz hedefli filtrelerle ele alır.
using IronOcr;
public class AccuracyOptimizedOcr
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessLowQualityDocument(string filePath)
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
// Chain preprocessing filters in order of operation
input.DeNoise(); // Remove scan artifacts and speckling
input.Deskew(); // Correct page tilt up to 35 degrees
input.Scale(150); // Enlarge small text for better recognition
input.Binarize(); // Convert to black/white for cleaner edges
input.EnhanceResolution(300); // Sharpen blurry or low-DPI input
var result = _ocr.Read(input);
// Confidence below 70 often signals a preprocessing mismatch
if (result.Confidence < 70)
Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)");
return result.Text;
}
}
using IronOcr;
public class AccuracyOptimizedOcr
{
private readonly IronTesseract _ocr = new IronTesseract();
public string ProcessLowQualityDocument(string filePath)
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
// Chain preprocessing filters in order of operation
input.DeNoise(); // Remove scan artifacts and speckling
input.Deskew(); // Correct page tilt up to 35 degrees
input.Scale(150); // Enlarge small text for better recognition
input.Binarize(); // Convert to black/white for cleaner edges
input.EnhanceResolution(300); // Sharpen blurry or low-DPI input
var result = _ocr.Read(input);
// Confidence below 70 often signals a preprocessing mismatch
if (result.Confidence < 70)
Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)");
return result.Text;
}
}
Imports IronOcr
Public Class AccuracyOptimizedOcr
Private ReadOnly _ocr As New IronTesseract()
Public Function ProcessLowQualityDocument(filePath As String) As String
Using input As New OcrInput()
If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(filePath)
Else
input.LoadImage(filePath)
End If
' Chain preprocessing filters in order of operation
input.DeNoise() ' Remove scan artifacts and speckling
input.Deskew() ' Correct page tilt up to 35 degrees
input.Scale(150) ' Enlarge small text for better recognition
input.Binarize() ' Convert to black/white for cleaner edges
input.EnhanceResolution(300) ' Sharpen blurry or low-DPI input
Dim result = _ocr.Read(input)
' Confidence below 70 often signals a preprocessing mismatch
If result.Confidence < 70 Then
Console.WriteLine($"Warning: low confidence ({result.Confidence:F1}%)")
End If
Return result.Text
End Using
End Function
End Class
Filtre seçimi rehberi:
DeNoise()-- ağır benekli veya sıkıştırma artefaktlı taramalar için kullanınDeskew()-- belgeler açılı çekildiyse kullanın; otomatik algılama için sayfa döndürme algılamaya bakınScale()-- küçük baskı veya 150 DPI altı girdiler için kullanın; 150-200 değerleri genellikle en iyi sonuçları verirBinarize()-- renkli veya gradyanlı arka planlar için kullanın; görüntüyü katı siyah-beyaza dönüştürürEnhanceResolution()-- bulanık veya düşük kontrastlı metinler için kullanın; Tesseract'ın tatlı noktası olarak 300 DPI hedefler
International Journal on Document Analysis and Recognition'da yayınlanan araştırmalar, ikili hale getirme ve düzgünleştirmenin karakter tanıma oranlarını iyileştirmek için en yüksek etkili ön işleme adımları olduğunu tutarlı bir şekilde göstermektedir. Tüm üretim hattı için bunları bir temel oluşturun.
| Filtre | Çözülen Sorun | Ne Zaman Uygulanmalı |
|---|---|---|
DeNoise() |
Tarayıcı kalıntıları, benek gürültüsü | Herhangi bir düz yatak veya faks taraması |
Deskew() |
Sayfa eğimi ve döndürme | Fotoğraflanan veya hatalı hizalanmış belgeler |
Scale() |
Küçük metin veya düşük DPI | 150 DPI altında giriş |
Binarize() |
Renkli arka planlar, geçişler | Renkli kağıt veya markalı formlar |
EnhanceResolution() |
Bulanıklık ve düşük kontrast | Kamera çekimleri ve sıkıştırılmış JPEG'ler |
Üretim Toplu İşleme Hattı Nasıl Kurulur?
Tek belgeli çıkarım basittir, ancak üretim senaryoları kuyruklarda, paylaşılan klasörlerde veya bulut depolamada yüzlerce veya binlerce dosya içerir. IronOCR'un asenkron API'si ve iş parçacığı güvenli motoru, paralel iş yükleri için uygun hale getirir.
using IronOcr;
using Microsoft.Extensions.Logging;
public class ProductionOcrService
{
private readonly IronTesseract _ocr;
private readonly ILogger<ProductionOcrService> _logger;
public ProductionOcrService(ILogger<ProductionOcrService> logger)
{
_logger = logger;
_ocr = new IronTesseract
{
Configuration =
{
RenderSearchablePdfsAndHocr = true,
ReadBarCodes = true
}
};
}
public async Task<IReadOnlyList<string>> ProcessBatchAsync(
IEnumerable<string> filePaths,
int maxDegreeOfParallelism = 4)
{
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
var options = new ParallelOptions
{
MaxDegreeOfParallelism = maxDegreeOfParallelism
};
await Parallel.ForEachAsync(filePaths, options, async (filePath, ct) =>
{
try
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
var result = await _ocr.ReadAsync(input);
results.Add(result.Text);
_logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence",
filePath, result.Confidence);
}
catch (Exception ex)
{
_logger.LogError(ex, "OCR failed for {FilePath}", filePath);
results.Add(string.Empty);
}
});
return results.ToList();
}
public void CreateSearchablePdf(string inputPath, string outputPath)
{
using var input = new OcrInput();
if (inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(inputPath);
else
input.LoadImage(inputPath);
_ocr.Read(input).SaveAsSearchablePdf(outputPath);
_logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath);
}
}
using IronOcr;
using Microsoft.Extensions.Logging;
public class ProductionOcrService
{
private readonly IronTesseract _ocr;
private readonly ILogger<ProductionOcrService> _logger;
public ProductionOcrService(ILogger<ProductionOcrService> logger)
{
_logger = logger;
_ocr = new IronTesseract
{
Configuration =
{
RenderSearchablePdfsAndHocr = true,
ReadBarCodes = true
}
};
}
public async Task<IReadOnlyList<string>> ProcessBatchAsync(
IEnumerable<string> filePaths,
int maxDegreeOfParallelism = 4)
{
var results = new System.Collections.Concurrent.ConcurrentBag<string>();
var options = new ParallelOptions
{
MaxDegreeOfParallelism = maxDegreeOfParallelism
};
await Parallel.ForEachAsync(filePaths, options, async (filePath, ct) =>
{
try
{
using var input = new OcrInput();
if (filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
var result = await _ocr.ReadAsync(input);
results.Add(result.Text);
_logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence",
filePath, result.Confidence);
}
catch (Exception ex)
{
_logger.LogError(ex, "OCR failed for {FilePath}", filePath);
results.Add(string.Empty);
}
});
return results.ToList();
}
public void CreateSearchablePdf(string inputPath, string outputPath)
{
using var input = new OcrInput();
if (inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(inputPath);
else
input.LoadImage(inputPath);
_ocr.Read(input).SaveAsSearchablePdf(outputPath);
_logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath);
}
}
Imports IronOcr
Imports Microsoft.Extensions.Logging
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
Public Class ProductionOcrService
Private ReadOnly _ocr As IronTesseract
Private ReadOnly _logger As ILogger(Of ProductionOcrService)
Public Sub New(logger As ILogger(Of ProductionOcrService))
_logger = logger
_ocr = New IronTesseract With {
.Configuration = New TesseractConfiguration With {
.RenderSearchablePdfsAndHocr = True,
.ReadBarCodes = True
}
}
End Sub
Public Async Function ProcessBatchAsync(filePaths As IEnumerable(Of String), Optional maxDegreeOfParallelism As Integer = 4) As Task(Of IReadOnlyList(Of String))
Dim results = New ConcurrentBag(Of String)()
Dim options = New ParallelOptions With {
.MaxDegreeOfParallelism = maxDegreeOfParallelism
}
Await Parallel.ForEachAsync(filePaths, options, Async Function(filePath, ct)
Try
Using input As New OcrInput()
If filePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(filePath)
Else
input.LoadImage(filePath)
End If
Dim result = Await _ocr.ReadAsync(input)
results.Add(result.Text)
_logger.LogInformation("Processed {FilePath} at {Confidence:F1}% confidence", filePath, result.Confidence)
End Using
Catch ex As Exception
_logger.LogError(ex, "OCR failed for {FilePath}", filePath)
results.Add(String.Empty)
End Try
End Function)
Return results.ToList()
End Function
Public Sub CreateSearchablePdf(inputPath As String, outputPath As String)
Using input As New OcrInput()
If inputPath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(inputPath)
Else
input.LoadImage(inputPath)
End If
_ocr.Read(input).SaveAsSearchablePdf(outputPath)
_logger.LogInformation("Searchable PDF written to {OutputPath}", outputPath)
End Using
End Sub
End Class
MaxDegreeOfParallelism tavanı, dosyalar büyük olduğunda bellek tükenmesini önler. Dört çekirdekli bir sunucuda, 4 değeri iyi çalışır; yalnızca bellek kullanımını profilleme sonrası artırın. Azure Functions veya AWS Lambda dağıtımları için, her işlev örneği başına eşzamanlılığı 1 olarak ayarlayın ve bunun yerine yatay ölçekte artırın.
CreateSearchablePdf, orijinal görüntünün görünür bir katman olarak korunduğu ve tanınan metnin altında görünmez bir şekilde gömüldüğü bir PDF oluşturur. Bu, PDF görüntüleyicilerde tam metin aramasına ve arama motorları tarafından endekslenmesine olanak tanır — belge yönetim sistemlerinde yaygın bir gereksinim.
Üretimde Güven Skorlarını İzleme
Her OcrResult bir Confidence özelliği (0-100) sunar ve motorun tanınan metin hakkında ne kadar emin olduğunu yansıtır. Bu metriği günlük alt yapınızda izlemek, tarayıcı kalibrasyonu kayarsa veya yeni bir belge sağlayıcısı beklenenden daha düşük DPI taramalar gönderirse, belge kalitesi bozulduğunda erken uyarı sinyali verir.
Pratik bir eşik stratejisi: güvenin 80'in altına düşmesini bir uyarı olarak kaydedin, 70'in altına düştüğünde bir ön işleme-tekrar deneme geçişini tetikleyin ve 60'ın altına düştüğünde insan incelemesi için belgeleri işaretleyin. Bu katmanlı yaklaşım, sorunsuz veri bozulmasını öncesinde yakalar.
Microsoft .NET günlükleme belgeleri, yukarıdaki toplu hizmette kullanılan ve ASP.NET Core'un yerleşik DI konteynerine entegre olan ekipler için ILogger desenlerini kapsar.
Taranmış Belgelerden Yapılandırılmış Veriler Nasıl Çıkarılır?
Metin çıkarma ilk adımdır. İkinci adım, bu metni uygulamanızın üzerinde işlem yapabileceği türdeş alanlara ayrıştırmaktır. Bu desen IronOCR'ın okuma geçişini .NET'in Regex ile birleştirerek faturalar, formlar ve raporlardan yapılandırılmış verileri çekmek için kullanılır.
using IronOcr;
using System.Text.RegularExpressions;
public record Invoice(
string? InvoiceNumber,
DateOnly? Date,
decimal? TotalAmount,
string RawText
);
public class InvoiceOcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public Invoice ExtractInvoiceData(string invoicePath)
{
using var input = new OcrInput();
if (invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(invoicePath);
else
input.LoadImage(invoicePath);
input.DeNoise();
input.Deskew();
var result = _ocr.Read(input);
string text = result.Text;
return new Invoice(
InvoiceNumber: ExtractInvoiceNumber(text),
Date: ExtractDate(text),
TotalAmount: ExtractAmount(text),
RawText: text
);
}
private static string? ExtractInvoiceNumber(string text)
{
var match = Regex.Match(text, @"Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase);
return match.Success ? match.Groups[1].Value : null;
}
private static DateOnly? ExtractDate(string text)
{
// Numeric format: MM/DD/YYYY
var numeric = Regex.Match(text, @"\b(\d{1,2}/\d{1,2}/\d{2,4})\b");
if (numeric.Success && DateTime.TryParse(numeric.Groups[1].Value, out var d1))
return DateOnly.FromDateTime(d1);
// Written format: January 15, 2025
var written = Regex.Match(text,
@"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
RegexOptions.IgnoreCase);
if (written.Success && DateTime.TryParse(written.Value, out var d2))
return DateOnly.FromDateTime(d2);
return null;
}
private static decimal? ExtractAmount(string text)
{
var match = Regex.Match(text, @"\$\s*(\d+(?:\.\d{2})?)");
return match.Success && decimal.TryParse(match.Groups[1].Value, out var amt)
? amt
: null;
}
}
using IronOcr;
using System.Text.RegularExpressions;
public record Invoice(
string? InvoiceNumber,
DateOnly? Date,
decimal? TotalAmount,
string RawText
);
public class InvoiceOcrService
{
private readonly IronTesseract _ocr = new IronTesseract();
public Invoice ExtractInvoiceData(string invoicePath)
{
using var input = new OcrInput();
if (invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(invoicePath);
else
input.LoadImage(invoicePath);
input.DeNoise();
input.Deskew();
var result = _ocr.Read(input);
string text = result.Text;
return new Invoice(
InvoiceNumber: ExtractInvoiceNumber(text),
Date: ExtractDate(text),
TotalAmount: ExtractAmount(text),
RawText: text
);
}
private static string? ExtractInvoiceNumber(string text)
{
var match = Regex.Match(text, @"Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase);
return match.Success ? match.Groups[1].Value : null;
}
private static DateOnly? ExtractDate(string text)
{
// Numeric format: MM/DD/YYYY
var numeric = Regex.Match(text, @"\b(\d{1,2}/\d{1,2}/\d{2,4})\b");
if (numeric.Success && DateTime.TryParse(numeric.Groups[1].Value, out var d1))
return DateOnly.FromDateTime(d1);
// Written format: January 15, 2025
var written = Regex.Match(text,
@"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
RegexOptions.IgnoreCase);
if (written.Success && DateTime.TryParse(written.Value, out var d2))
return DateOnly.FromDateTime(d2);
return null;
}
private static decimal? ExtractAmount(string text)
{
var match = Regex.Match(text, @"\$\s*(\d+(?:\.\d{2})?)");
return match.Success && decimal.TryParse(match.Groups[1].Value, out var amt)
? amt
: null;
}
}
Imports IronOcr
Imports System.Text.RegularExpressions
Public Class Invoice
Public Property InvoiceNumber As String
Public Property Date As DateOnly?
Public Property TotalAmount As Decimal?
Public Property RawText As String
Public Sub New(invoiceNumber As String, [date] As DateOnly?, totalAmount As Decimal?, rawText As String)
Me.InvoiceNumber = invoiceNumber
Me.Date = [date]
Me.TotalAmount = totalAmount
Me.RawText = rawText
End Sub
End Class
Public Class InvoiceOcrService
Private ReadOnly _ocr As New IronTesseract()
Public Function ExtractInvoiceData(invoicePath As String) As Invoice
Using input As New OcrInput()
If invoicePath.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) Then
input.LoadPdf(invoicePath)
Else
input.LoadImage(invoicePath)
End If
input.DeNoise()
input.Deskew()
Dim result = _ocr.Read(input)
Dim text As String = result.Text
Return New Invoice(
InvoiceNumber:=ExtractInvoiceNumber(text),
[Date]:=ExtractDate(text),
TotalAmount:=ExtractAmount(text),
RawText:=text
)
End Using
End Function
Private Shared Function ExtractInvoiceNumber(text As String) As String
Dim match = Regex.Match(text, "Invoice\s*#?:?\s*(\S+)", RegexOptions.IgnoreCase)
Return If(match.Success, match.Groups(1).Value, Nothing)
End Function
Private Shared Function ExtractDate(text As String) As DateOnly?
' Numeric format: MM/DD/YYYY
Dim numeric = Regex.Match(text, "\b(\d{1,2}/\d{1,2}/\d{2,4})\b")
If numeric.Success AndAlso DateTime.TryParse(numeric.Groups(1).Value, Nothing) Then
Return DateOnly.FromDateTime(DateTime.Parse(numeric.Groups(1).Value))
End If
' Written format: January 15, 2025
Dim written = Regex.Match(text,
"\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+(\d{1,2}),?\s+(\d{4})\b",
RegexOptions.IgnoreCase)
If written.Success AndAlso DateTime.TryParse(written.Value, Nothing) Then
Return DateOnly.FromDateTime(DateTime.Parse(written.Value))
End If
Return Nothing
End Function
Private Shared Function ExtractAmount(text As String) As Decimal?
Dim match = Regex.Match(text, "\$\s*(\d+(?:\.\d{2})?)")
Dim amt As Decimal
Return If(match.Success AndAlso Decimal.TryParse(match.Groups(1).Value, amt), amt, Nothing)
End Function
End Class
Bu yaklaşım, bir formun neresinde her alanın olduğunu tam olarak bildiğinizde bölgesel OCR ile iyi bir eşleşme sağlar. Bir sınır dikdörtgeni sağlayarak tam sayfa tanımayı atlar ve sadece fatura numarası veya toplamı içeren bölgeyi hedef alarak sabit düzen belgeler için işlem süresini büyük ölçüde azaltırsınız.
Tablolar ve yapılandırılmış formlar dahil olmak üzere daha gelişmiş çıkarma senaryoları için ürün sitesindeki IronOCR veri çıkarma örneklerini gözden geçirin.
.NET'de Çok Dilli OCR Nasıl Ele Alınır?
Birçok kuruluş, ithalat/ihracat formları, uluslararası sözleşmeler veya çok dilli müşteri gönderimleri nedeniyle birden fazla dilde belgeler işliyor. IronOCR, okuma çağrısı öncesinde dil paketini yapılandırmanıza izin vererek bunu ele alır.
using IronOcr;
// Configure multi-language recognition
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.EnglishBest; // Swap for any of 125+ supported languages
// For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German);
using var input = new OcrInput();
input.LoadPdf("multilingual-contract.pdf");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
using IronOcr;
// Configure multi-language recognition
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.EnglishBest; // Swap for any of 125+ supported languages
// For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German);
using var input = new OcrInput();
input.LoadPdf("multilingual-contract.pdf");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr
' Configure multi-language recognition
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.EnglishBest ' Swap for any of 125+ supported languages
' For mixed-language documents, combine language packs
ocr.AddSecondaryLanguage(OcrLanguage.German)
Using input As New OcrInput()
input.LoadPdf("multilingual-contract.pdf")
Dim result = ocr.Read(input)
Console.WriteLine(result.Text)
End Using
IronOCR dil desteği sayfası, indirme talimatları ile birlikte mevcut 125+ dil paketinin hepsini listeler. Dil paketleri, NuGet paketleri olarak dağıtılır (örneğin, IronOcr.Languages.German) böylece zaten kullandığınız aynı paket yönetimi iş akışı ile entegre olurlar.
Latin alfabesi dışındaki karakter setleri için — Arapça, Çince, Japonca, Korece — IronOCR, sağdan sola metin yönü ve ideografik yazı sistemlerini ele alan optimize edilmiş modeller sağlar. Yapılandırma ayrıntıları için CJK OCR kılavuzuna bakın.
Sonraki Adımlarınız Neler?
Artık .NET 10 uygulamanıza üretim düzeyinde OCR eklemek için gereken desenlere sahipsiniz: temel metin çıkarma, zor taramalar için önleme, asenkron toplu işlem, yapılandırılmış veri ayrıştırma ve çok dilli destek.
Bu noktadan itibaren, proje ihtiyaçlarınıza göre bu alanları keşfedin:
- Barkod ve QR kod okuma -- aynı görüntü geçişinden makine tarafından okuyulabilir kodları çıkar
- HOCR çıktı formatı -- düzen duyarlı aşağı akış işlem için kelime seviyesinde sınır kutuları elde et
- IronOCR lisanslama seçenekleri—SaaS, OEM ve kurumsal katmanlarla telif ücretsiz dağıtım modeli
- IronOCR kod örnekleri kütüphanesi—yaygın senaryoları kapsayan 30'dan fazla çalışma örneği
- Azure Functions dağıtım kılavuzu -- Microsoft bulut altyapısında sunucusuz OCR
ücretsiz deneme lisansı ile başlayarak kendi belgelerinizde tüm özellik setini değerlendirin ve bir katmana bağlı kalmadan önce deneyin.
Sıkça Sorulan Sorular
.NET OCR SDK nedir?
IronOCR tarafından sunulan .NET OCR SDK, C# uygulamalarına optik karakter tanıma yetenekleri entegre etmek için tasarlanmış bir kütüphanedir ve geliştiricilerin görüntülerden, PDF'lerden ve taranmış belgelerden metin çıkarmalarına olanak tanır.
IronOCR'un .NET SDK'sinin ana özellikleri nelerdir?
IronOCR'un .NET SDK'si, basit bir API, birden çok dil desteği, platformlar arası uyumluluk ve çeşitli dosya formatları ile düşük kaliteli taramalarla başa çıkmak için gelişmiş özellikler sunar.
IronOCR farklı dilleri nasıl işler?
IronOCR'un .NET SDK'si, ek yapılandırmalar gerektirmeden çeşitli dillerdeki belgelerden metin çıkarımı ve tanıma işlemleri yapabilmenizi sağlayan çoklu dil desteğine sahiptir.
IronOCR düşük kaliteli taramaları işleyebilir mi?
Evet, IronOCR düşük kaliteli taramaları etkili bir şekilde işlemek üzere tasarlanmıştır ve zorlu durumlarda bile metin tanıma doğruluğunu artırmak için gelişmiş algoritmalar kullanır.
IronOCR'un .NET SDK'si çapraz platform özellikli mi?
IronOCR'un .NET SDK'si, farklı işletim sistemlerinde kullanılabilecek şekilde çapraz platformdur, bu da onu çeşitli geliştirme ortamları için çok yönlü kılar.
IronOCR hangi dosya formatlarını destekler?
IronOCR, görüntüler, PDF'ler ve taranmış belgeler dahil olmak üzere geniş bir dosya formatı yelpazesini destekler ve farklı ortamlardaki metin tanıma görevleri için esneklik sağlar.
Geliştiriciler, IronOCR'u projelerine nasıl entegre edebilirler?
Geliştiriciler, uygulamalarına OCR işlevi ekleme sürecini basitleştiren, yazılmış API'si ile IronOCR'u C# projelerine entegre edebilirler.
IronOCR için bazı kullanım durumları nelerdir?
IronOCR, belge yönetim sistemlerinde, otomatik veri girişi, içerik dijitalleştirme ve görüntüler veya PDF'lerden metin çıkarılması gereken herhangi bir uygulamada kullanılabilir.




