.NET OCR SDK: C# için Bir Metin Tanıma Kütüphanesi
.NET OCR SDK'sı, C# ve .NET uygulamalarının görüntülerden, taranmış PDF'lerden ve diğer belge formatlarından programatik olarak metin çıkarmasını sağlayan bir yazılım geliştirme kitidir. IronOCR, ayarlanmış bir Tesseract 5 motorunu ön işleme filtreleri, barkod okuma, aranabilir PDF çıktısı ve 125'ten fazla dil desteğiyle sarabilen üretime hazır bir .NET OCR SDK'sıdır -- hepsi Windows, Linux, macOS ve bulut platformlarında çalışan temiz bir C# API'si üzerinden erişilebilir.
IronOCR, Projeleriniz İçin Doğru .NET OCR SDK'sı Yapan Nedir?
Sıfırdan metin tanıma oluşturmak, görüntü ön işleme kanalları, dil veri dosyaları, iş parçacığı modelleri ve çıktı çözümlemesi yönetmek anlamına gelir -- ilk kelimenizi çıkarmadan önce aylarca iş. IronOCR, ekibinizin bir projeye dakikalar içinde yerleştirebileceği köklü bir motor göndererek bu yükü ortadan kaldırır.
Ham Tesseract bağlamalarından ayıran temel yetenekler:
- 125'ten fazla dil ve yazı tipi dahil el yazısıyla metin tanıma
- Dahili filtreler: gürültü giderme, eğiklik düzeltme, binarizasyon, çözünürlük artırma ve kontrast düzeltme
- Aynı okuma geçişi içinde barkod ve QR kodu algılama
- Arşivleme iş akışları için görünmez metin katmanlarına sahip aranabilir PDF oluşturma
- Yüksek verim için asenkron ve paralel toplu işleme
- İleri işleme süresini azaltmak için sayfa bölgesel hedefleme
- Windows, Linux, macOS, Docker ve Azure üzerinde çapraz platform desteği
Tesseract OCR proje dokümantasyonuna 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 ve odak noktanızı metnin ne anlama geldiğine çevirmeye odaklamanızı sağlar, nasıl çıkarıldığına değil.
IronOCR, Ham Tesseract'a Nasıl Kıyaslanır?
Ham Tesseract'i bir P/Invoke sarmalayıcı veya Tesseract NuGet paketi aracılığıyla kullanmak, sizi şu konularda sorumlu bırakır: tessdata dil dosyalarını indirip yerleştirme, doğru sayfa bölümlendirme modunu seçme, çok sayfalı TIFF ve PDF dosyalarını kendiniz ayırma ve paralel işlem yapmak istiyorsanız iş parçacıklarının bağlanması. Bu ayrıntılardan hiçbiri iş probleminize özgü değildir.
IronOCR tüm bu tesisatı sarar. Tiple leşmiş bir API yüzeyi, otomatik tessdata yönetimi, dahili PDF bölme ve yeniden birleştirme ile iş parçacığı güvenli bir motor elde edersiniz ve istekler arasında yeniden kullanabilirsiniz. Dezavantajı, üretim kullanımı için ücretli bir lisanstır -- lisanslama sayfası mevcut fiyat katmanlarını gösterir, ücretsiz geliştirme lisansı dahil.
Açık kaynaklı bağımlılıklara ihtiyaç duyan ekipler için, ham Tesseract artı özel ön işleme geçerli bir yoldur. Güvenilir bir OCR'yi hızlı bir şekilde teslim etmesi gereken ekipler için, IronOCR entegrasyon yüzeyini birkaç C# satırına indirir.
IronOCR .NET SDK'sını Nasıl Yüklersiniz?
Yükleme, standart .NET paket yöneticisi olan NuGet üzerinden gerçekleştirilir. Proje dizininizde asagidaki komutu calistirin:
Install-Package IronOcr
Visual Studio kullanıcıları için, NuGet Paket Yöneticisi GUI'de IronOcr arayın ve oradan yükleyin. Manuel DLL referansları da dahil olmak üzere tam yükleme seçenekleri için IronOCR yükleme belgelerine bakın.
Kurulumdan sonra lisans anahtarını uygulamanızın başlangıcına veya appsettings.json ekleyin. Değerlendirme sırasında tüm özellikleri açan bir deneme anahtarı almak için ücretsiz bir deneme başlatabilirsiniz.
Kurulumu Doğrulama
Yüklemeden sonra hızlı bir sağlama testi her şeyin doğru kablolu olduğunu doğrular. .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ündüyse, SDK yüklenmiş ve lisans anahtarı geçerlidir. Üretim iş akışları oluşturmaya hazırsınız.
Görüntülerden ve PDF'lerden C#'ta Metin Nasıl Çıkartılır?
Çekirdek çıkarım deseni tüm girdi türleri için tutarlıdır. Bir IronTesseract örneği oluşturun, içeriği bir OcrInput nesnesine yükleyin ve Read() çağırın. IronOCR, dosya formatını uzantıdan otomatik olarak algılar, böylece aynı kod yolu JPEG, PNG, TIFF, BMP ve çok sayfalı PDF'leri ele alır.
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 denemek için üst düzey 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üvenlidir ve tekrar kullanım için tasarlanmıştır. Uygulama başlangıcında bir kez oluşturun (örneğin ASP.NET Core'da bağımlılık enjeksiyonu yoluyla) ve istek başına tekrar örneklemeyin.
Çok sayfalı PDF'ler için result.Pages size her sayfa için metin, güven skoru ve sınır kutularına erişim sağlar. Sayfa bazında yineleme ile ilgili detaylar için çok sayfalı PDF OCR rehberine bakın.
Ön İşlem Filtreleri ile OCR Doğruluğunu Nasıl İyileştirirsiniz?
Düz yataklı tarayıcılardan, akıllı telefon kameralarından veya faks makinelerinden gelen ham taramalar genellikle gürültü, döndürme, düşük kontrast ve yetersiz çözünürlük sorunları taşır. IronOCR'un görüntü kalitesi düzeltme kanalı, okuma çağrısından önce zincirleyebileceğiniz hedeflenmiş filtrelerle her sorunu 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 lekelenme veya sıkıştırma artefaktları olan taramalar için kullanınDeskew()-- belgeler açıyla çekildiğinde kullanın; sayfa döndürme algılama için otomatik algılamaScale()-- küçük baskı veya 150 DPI altı girdiler için kullanın; 150-200 değerleri genellikle en iyi sonuçları verirBinarize()-- renkli veya gradyan arka planlar için kullanın; görüntüyü kesin siyah/beyaza çevirirEnhanceResolution()-- bulanık veya düşük kontrastlı metinler için kullanın; Tesseract'ın ideal alanı olarak 300 DPI hedefler
Kapsamlı araştırmalar, Uluslararası Belge Analizi ve Tanıma Dergisinde yayımlanan içerikler göstermektedir ki ikili görüntüleme (binarization) ve eğimi giderme, karakter tanıma oranlarını iyileştiren en etkili ön işleme adımlarıdır. Herhangi bir üretim hattı için temel olarak her iki adımı uygulayın.
| Filtre | Çözülen Sorun | Uygulama Zamanı |
|---|---|---|
DeNoise() |
Tarayıcı sorunları, leke gürültüsü | Herhangi bir düz yataklı veya faks taraması |
Deskew() |
Sayfa eğilmesi ve dönme | Fotoğraflanmış veya yanlış hizalanmış belgeler |
Scale() |
Küçük metin veya düşük DPI | 150 DPI'nin altında giriş |
Binarize() |
Renkli arka planlar, gradyanlar | Renkli kağıt veya filigranlı formlar |
EnhanceResolution() |
Bulanıklık ve düşük kontrast | Kamera çekimleri ve sıkıştırılmış JPEG'ler |
Üretim Düzeyinde Toplu İşlem Hattı Nasıl Kurulur?
Tek belge çıkarımı basittir, ancak üretim senaryoları, sıralarda, paylaşılan klasörlerde veya bulut depolamasında yüzlerce veya binlerce dosyanın gelmesini içerir. IronOCR'un async API'si ve thread-güvenli motoru, paralel iş yükleri için uygundur.
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 sınırı, dosyalar büyük olduğunda bellek tükenmesini engeller. Dört çekirdekli bir sunucuda 4 değeri iyi çalışır; bellek kullanımını profil ettikten sonra artırın. Azure Fonksiyonları veya AWS Lambda dağıtımları için eşzamanlılığı işlev başına 1 olarak ayarlayın ve yatay ölçeklendirin.
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 şekilde gömüldüğü bir PDF oluşturur. Bu, PDF görüntüleyicilerde tam metin aramasına ve arama motorları tarafından dizine eklenmesine imkan tanır -- doküman yönetim sistemlerinde yaygın bir gerekliliktir.
Üretim Aşamasında Güven Düzeylerinin İzlenmesi
Her OcrResult bir Confidence özelliği (0-100) ortaya çıkarır ve motorun tanınan metinle ilgili ne kadar emin olduğunu yansıtır. Kayıt altyapınızda bu metrikleri izlemeniz, belge kalitesinin bozulduğuna dair erken bir uyarı sinyali verir -- örneğin, bir tarayıcının kalibrasyonu kayarsa veya yeni bir belge sağlayıcısı beklentiden daha düşük DPI'lı taramalar gönderirse.
Pratik bir eşik stratejisi: güven düzeyi 80'in altındaysa bir uyarı kaydedin, 70'in altındaysa bir ön işleme yeniden deneme oturumu tetikleyin ve 60'ın altındaki belgeleri insan incelemesine işaretleyin. Bu katmanlı yaklaşım kalite sorunlarını, aşağı akış sistemlerinde sessiz veri bozulması üretilmeden önce yakalar.
Microsoft .NET günlüğe kaydetme belgeleri, yukarıdaki toplu hizmette ASP.NET Core'un yerleşik DI konteyneriyle entegre olan ekipler için kullanılan ILogger desenlerini kapsar.
Taranmış Belgelerden Yapılandırılmış Veri Nasıl Çıkarılır?
Metin çıkarımı ilk adımdır. İkinci adım, bu metni uygulamanızın üzerinde işlem yapabileceği türlendirilmiş alanlara ayrıştırmaktır. Bu desen, faturalardan, formlardan ve raporlardan yapılandırılmış verileri çekmek için IronOCR'nin okuma geçişini .NET'in Regex ile birleştirir.
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 zonal OCR ile iyi eşleşir, her alanın bir formda tam olarak nerede göründüğünü bildiğinizde. Bir sınırlayıcı dikdörtgen sağlayarak tam sayfa tanımayı atlayabilir ve sadece fatura numarası veya toplam içeren bölgeyi hedefleyebilirsiniz -- sabit düzenli belgeler için işlem süresini önemli ölçüde azaltır.
Daha gelişmiş çıkarım senaryoları, tablolar ve yapılandırılmış formlar dahil, ürün sitesindeki IronOCR veri çıkarım örneklerini inceleyin.
.NET'te Çok Dilli OCR Nasıl Ele Alınır?
Birçok organizasyon birden fazla dilde belgeler işler -- ithalat/ihracat formları, uluslararası sözleşmeler veya çok dilli müşteri gönderimleri. IronOCR, okuma çağrısından önce 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ı, indirilebilir talimatlarla birlikte toplam 125+ kullanılabilir dil paketini listeler. Dil paketleri NuGet paketleri olarak (örneğin, IronOcr.Languages.German) gönderilir, bu nedenle zaten kullandığınız aynı paket yönetim iş akışı ile entegre olurlar.
Latin alfabesi dışında yer alan karakter setleri için -- Arapça, Çince, Japonca, Korece -- IronOCR, sağdan sola metin yönlendirmesini ve ideografik yazıları ele alan optimize edilmiş modeller sağlar. Konfigürasyon ayrıntıları için CJK OCR kılavuzunu inceleyin.
Sıradaki Adımlarınız Neler?
Artık herhangi bir .NET 10 uygulamasına üretim kalitesinde OCR eklemek için gereken kalıplara sahipsiniz: temel metin çıkarımı, zor taramalar için ön işleme, asenkron toplu işleme, yapılandırılmış veri ayrıştırma ve çok dil desteği.
Buradan, proje ihtiyaçlarınıza göre bu alanları keşfedin:
- Barkod ve QR kod okuma -- aynı görüntü geçişinden makine okunabilir kodlar çıkarma
- HOCR çıkış formatı -- aşağı akış işlemeleri için yerleşim farkındalığı sağlayan kelime düzeyinde sınırlayıcı kutular edinin
- IronOCR lisanslama seçenekleri -- SaaS, OEM ve enterprise katmanlarıyla telif hakkı içermeyen dağıtım modeli
- IronOCR kod örnek kütüphanesi -- yaygın senaryoları kapsayan 30'dan fazla çalışma örneği
- Azure Fonksiyonları dağıtım kılavuzu -- Microsoft bulut altyapısında sunucusuz OCR
ücretsiz deneme lisansı ile başlayın, kendi belgelerinizde tam özellik setini değerlendirerek bir katmana bağlı kalmadan önce.
Sıkça Sorulan Sorular
.NET OCR SDK nedir?
IronOCR tarafindan sunulan .NET OCR SDK, görüntüler, PDF'ler ve taranmis belgelerden metin çıkarmaya izin veren optik karakter tanima yeteneklerini C# uygulamalarina entegre etmek üzere tasarlanmis bir kütüphanedir.
IronOCR'un .NET SDK'sinin temel özellikleri nelerdir?
IronOCR'un .NET SDK'si, basit bir API, birden fazla dil desteği, çapraz platform uyumluluğu ve çeşitli dosya formatlari ve düşük kalite taramalar için gelişmiş̧ özellikler sunar.
IronOCR farklı dilleri nasıl işler?
IronOCR'un .NET SDK'si birçok dili destekler, ek ayarlara ihtiyaç̧ duymadan farklı dillerdeki belgelerden metin çıkarma ve tanima sağlar.
IronOCR düşük kaliteli taramaları işleyebilir mi?
Evet, IronOCR özellikle düşük kaliteli taramaları etkili bir şekilde işlemek için tasarlanmıştır, zorlu senaryoların bile tanıma hassasiyetini artırmak için gelişmi̧ş algoritmaları kullanır.
IronOCR'un .NET SDK'si çapraz platform mu?
IronOCR'un .NET SDK'si çapraz platformdur, yani farklı işletim sistemlerinde kullanılabilir, bu da onu çeşitli geliştirme ortamları için uygun hale getirir.
IronOCR hangi dosya formatlarını destekler?
IronOCR, görüntü̈ler, PDF'ler ve taranmiş belgeler dahil olmak üzere geniş bir dosya formatı yelpazesini destekler, bu da farklı medyalarda metin tanıma görevlerinde esneklik saglar.
Gelisticiler IronOCR'u projelerine nasıl entegre edebilir?
Gelismiciler, uygulamalarina OCR fonksiyonlarini ekleme sürecini basitleştiren, type edilmiş API'sini kullanarak IronOCR'u C# projelerine entegre edebilir.
IronOCR için bazı kullanım durumları nelerdir?
IronOCR, belge yönetim sistemlerinde, otomatik veri girişinde, içerik sayısallaştırmada ve görüntü̈lerden veya PDF'lerden metin çıkarmayı gerektiren her türlü uygulamada kullanılabilir.




