TesseractOcrMaui'den IronOCR'ye Geçiş
Bu kılavuz, her adımda pratik öncesi ve sonrası kod ile TesseractOcrMaui'den IronOCR'a tam bir geçişi anlatır. Mobil uygulamalarda, sunucu tarafı API'lerde, arka plan çalışanlarında ve bulut fonksiyonlarında aynı şekilde çalışan bir kütüphaneye sistematik bir yol ihtiyacı olan ve MAUI platformu kısıtlamasının ötesine geçmeye karar vermiş geliştiricileri hedefler. Karşılaştırma makalesinin önceden okunması gerekmez.
TesseractOcrMaui'den Neden Geçiliyor
TesseractOcrMaui, gerçek bir boşluğu doldurmak için yazılmıştı: mevcut .NET Tesseract sarmalayıcıları, mobil platformlar arası uyumluluğu kendi başlarına çözemezdi. Hiçbir sunucu ayağı olmayan saf bir MAUI prototipi için bu boşluğu doldurur. Ürün bu dar kapsamı aştığında sorunlar ortaya çıkar.
Yalnızca MAUI Hedef Çerçeveleri Kod Paylaşımını Engelliyor. TesseractOcrMaui, tüm MAUI platform tanımlayıcıları olan net8.0-ios, net8.0-android ve net8.0-windows hedeflerini sunmaktadır. Paket, net8.0, netstandard2.1 veya sunucu uyumlu bir hedef içermiyor. Bir sınıf kütüphanesinden, birASP.NET Coreprojesinden veya bir Azure Fonksiyonundan başvurduğunda bir derleme hatası oluşturur. Bu sorunu aşmak mümkün değildir: paket, MAUI ana bilgisayarı dışında çalışmaya yapısal olarak yatkın değildir. Her seferinde, MAUI olmayan bir bağlamda OCR gereksinimi ortaya çıktığında, ikinci bir kütüphane tanıtılmalı ve paralel olarak sürdürülmelidir.
Zorunlu MAUI Bağımlılık Enjeksiyon Bağlantısı. AddTesseractOcr() çağrısı MauiProgram.cs içinde ITesseract MAUI hizmet sağlayıcısına bağlar. Hiçbir fabrika metodu, hiçbir statik giriş noktası ve DI grafiğinin dışındaki hiçbir constructor yoktur. Bu, OCR mantığının, yapıcıda ITesseract kullanan her sınıfın ömrünün tamamı boyunca MAUI uygulama sunucusuna bağlı olduğu bir taşınabilir sınıf kütüphanesine çıkarılamayacağı anlamına gelir.
Herhangi Bir Düzeyde PDF Girişi Yok. PDF belgeleri, taranmış sözleşmeler, faturalar ve kimlik belgeleri için en yaygın formattır. TesseractOcrMaui, herhangi bir PDF girdisinde NotSupportedException fırlatır. PDF işleme, ayrı bir PDF işleme kütüphanesi eklemeyi, sayfa sayfa görüntü çıkarmayı, cihaz önbelleğinde geçici dosyaları yönetmeyi ve her çağrıdan sonra temizlemeyi gerektirir. Bu, tek bir OCR çağrısı uygulanmadan önce 100+ satır altyapı kodu oluşturur — ve hala sadece MAUI'de çalışıyor.
Gerçek Dünya Görüntüleri İçin Dahili Ön İşleme Yok. Mobil kameralar, döndürümler, sensör gürültüsü ve cihaz modelleri arasında tutarsız DPI ile görüntüler üretir.TesseractOcrMauigörüntüleri sıfır ön işleme ile Tesseract motoruna doğrudan iletir. Daha iyi doğruluk isteyen ekiplerin, SkiaSharp veya ImageSharp'ı eklemeleri, el ile deskewing ve denoising algoritmaları uygulayıp, geçici dosya yönetimi yazmaları ve bunları iOS ve Android cihaza çeşitliliği üzerine test etmeleri gerekir. Çoğunluğu bunu atlar. Gerçek mobil yakalama üzerinde doğruluk, bir sonuç olarak zarar görür.
**Üretim Bağımlılığı Üzerinde Tek Geliştirici Bakım Riski.**TesseractOcrMauibir geliştirici tarafından korunur. Arkasında bir şirket yoktur, hiçbir SLA yoktur, hiçbir güvenlik yaması taahhüdü yoktur ve GitHub sorunları ötesinde bir tırmanış yolu yoktur. Regüle edilen endüstrilerdeki üretim uygulamaları için — finans, sağlık, hukuk — yaklaşık 33.900 toplam NuGet indirimiyle gönüllü olarak bakımı yapılan bir kütüphane kabul edilebilir bir bağımlılık değildir.
Temel Sorun
TesseractOcrMaui sadece bir MAUI projesi içinde derlenir. Başka bir proje türü OCR'ye ihtiyaç duyduğu anda, mimari kırılır:
// TesseractOcrMaui: wired to MAUI host — cannot escape to a shared library
// This code compiles only inside a .NET MAUI application
public class OcrService
{
private readonly ITesseract _tesseract; // resolved from MAUI DI — no other source exists
public OcrService(ITesseract tesseract) { _tesseract = tesseract; }
public async Task<string> ReadAsync(string imagePath)
{
await _tesseract.InitAsync("eng"); // traineddata must be bundled as MauiAsset
var result = await _tesseract.RecognizeTextAsync(imagePath);
return result.Success ? result.RecognizedText : string.Empty;
}
// Cannot reference this class from ASP.NET Core, Azure Functions, or Docker
}
// IronOCR: plain instantiable class — compiles in any .NET project type
public class OcrService
{
private readonly IronTesseract _ocr = new IronTesseract(); // no DI, no MAUI host
public string Read(string imagePath)
{
using var input = new OcrInput();
input.LoadImage(imagePath);
return _ocr.Read(input).Text;
}
// Place this in a netstandard2.1 library — reference from MAUI, API, and Functions together
}
IronOCR ve TesseractOcrMaui: Özellik Karşılaştırması
Aşağıdaki tablo, bu geçişi değerlendiren ekipler için ilgili yetenek farklarını kapsar.
| Özellik | TesseractOcrMaui | IronOCR |
|---|---|---|
| .NET MAUI (iOS) | Evet | Evet (IronOcr.iOS) |
| .NET MAUI (Android) | Evet | Evet (IronOcr.Android) |
| .NET MAUI (Windows) | Evet | Evet |
| ASP.NET Core | Hayır | Evet |
| Azure Functions | Hayır | Evet |
| AWS Lambda | Hayır | Evet |
| Docker / Linux kapsayıcılar | Hayır | Evet |
| Konsol uygulamaları | Hayır | Evet |
| WPF / WinForms | Hayır | Evet |
| Paylaşılan .NET sınıf kütüphanesi | Hayır | Evet |
| PDF girişi (yerel) | Hayır | Evet |
| Şifre ile korunan PDF girişi | Hayır | Evet |
| Akış girişi | Hayır | Evet |
| Bayt dizisi girişi | Hayır | Evet |
| Çok sayfalı TIFF girişi | Hayır | Evet |
| Aranabilir PDF çıktısı | Hayır | Evet |
| hOCR içeri aktarma | Hayır | Evet |
| Otomatik düzeltme | Hayır | Evet |
| Otomatik noise azaltma | Hayır | Evet |
| Kontrast artırma | Hayır | Evet |
| Binarizasyon | Hayır | Evet |
| Bölge bazlı OCR | Hayır | Evet |
| OCR sırasında barkod okuma | Hayır | Evet |
| Kelime düzeyinde koordinatlar | Hayır | Evet |
| Çoklu dil aynı anda | Hayır | Evet |
| Desteklenen diller | Manuel olarak paketlenmiş traineddata | 125+ NuGet paketleri aracılığıyla |
| İş parçacığı güvenliği | Yönerge | Yerleşik |
| Ticari destek | Yok (tek geliştirici) | Evet (Iron Software) |
| Lisanslama | Apache 2.0 (ücretsiz) | $999 'den itibaren süresiz |
| NuGet indirmeleri | ~33.900 | 5,3M+ |
Hızlı Başlangıç: TesseractOcrMaui'den IronOCR'a Geçiş
Adım 1: NuGet Paketini Değiştirin
TesseractOcrMaui'yi MAUI projesinden çıkarın:
dotnet remove package TesseractOcrMaui
IronOCR'u kurun. MAUI projeleri için, çekirdek paketin yanına platforma özgü paketleri ekleyin:
Sunucu tarafı projeleri (ASP.NET Core, Azure Fonksiyonları, konsol):
IronOCR NuGet paketi sayfası, mevcut tüm platform paketlerini listeler.
Adım 2: Ad Alanlarını Güncelleyin
TesseractOcrMaui ad alanlarınıIronOCR ad alanı ile değiştirin:
// Before (TesseractOcrMaui)
using TesseractOcrMaui;
using TesseractOcrMaui.Results;
using Microsoft.Maui.Storage;
// After (IronOCR)
using IronOcr;
Adım 3: Lisansa İzin Verin
Uygulama başlangıcında lisans başlatmayı ekleyin. Bir MAUI uygulamasında bu MauiProgram.cs içine gider; ASP.NET Core'da Program.cs içine gider.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"Kod Göç Örnekleri
MAUI Bağımlılık Enjeksiyon Kaydı Değiştirme
TesseractOcrMaui, MAUI hizmet sağlayıcısı üzerinden OCR motorunu kaydetmeyi gerektirir. Bu kaydı kaldırmak ilk yapısal adımdır, çünkü bu, tüm sonraki OCR kodunu MAUI ana bilgisayarına kilitleyen şeydir.
TesseractOcrMaui Yaklaşımı:
// MauiProgram.cs — OCR engine registered here; nowhere else resolves it
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder.UseMauiApp<App>();
// Binds OCR to MAUI DI — no standalone path exists after this
builder.Services.AddTesseractOcr();
return builder.Build();
}
}
// Any class that needs OCR must receive ITesseract from the MAUI container
public class InvoicePageViewModel
{
private readonly ITesseract _tesseract;
public InvoicePageViewModel(ITesseract tesseract)
{
_tesseract = tesseract; // fails to construct outside MAUI host
}
public async Task<string> ScanInvoiceAsync(string imagePath)
{
await _tesseract.InitAsync("eng");
var result = await _tesseract.RecognizeTextAsync(imagePath);
return result.RecognizedText ?? string.Empty;
}
}
IronOCR Yaklaşımı:
// MauiProgram.cs — license only; no DI registration needed
public static class MauiProgram
{
public static MauiApp CreateMauiApp()
{
var builder = MauiApp.CreateBuilder();
builder.UseMauiApp<App>();
// One-line initialization — works for all project types
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
return builder.Build();
}
}
//Hayırconstructor injection needed — IronTesseract instantiates directly
public class InvoicePageViewModel
{
public string ScanInvoice(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
}
}
AddTesseractOcr() 'yı kaldırmak, MAUI DI bağlantısını ortadan kaldırır. IronTesseract sınıfının kamuya açık parametresiz bir yapıcısı vardır ve platform bağımlılığı taşımaz — her yerde örneklenebilir. Motor modu ve dil yapılandırma dahil başlatma seçenekleri için IronTesseract kurulum kılavuzu'na bakın.
OCR Mantığını Paylaşılan Sınıf Kütüphanesine Taşıma
TesseractOcrMaui ile, proje türleri arasında OCR mantığını paylaşmak yapısal olarak imkansızdır.IronOCR ile geçiş yolu basittir: hizmeti bir .NET Standard 2.1 veya net8.0 sınıf kütüphanesine ayıklayın ve çözümdeki her projeden referans alın.
TesseractOcrMaui Yaklaşımı:
// This service CANNOT be extracted to a shared library.
// It compiles only in a project that references TesseractOcrMaui,
// which only has MAUI platform targets.
//
// Result: every non-MAUI project must use a different OCR library,
// duplicating language config, error handling, and accuracy tuning.
public class DocumentOcrService
{
private readonly ITesseract _tesseract; // MAUI DI only
public DocumentOcrService(ITesseract tesseract)
{
_tesseract = tesseract;
}
public async Task<string> ProcessDocumentAsync(string imagePath)
{
await _tesseract.InitAsync("eng");
var result = await _tesseract.RecognizeTextAsync(imagePath);
return result.Success ? result.RecognizedText : string.Empty;
}
// Server team writes their own version using a different library
// Two codebases, two accuracy profiles, two maintenance tracks
}
IronOCR Yaklaşımı:
// Place this in: MyCompany.OcrCore (net8.0 or netstandard2.1 class library)
// Reference from: MyCompany.MauiApp, MyCompany.Api, MyCompany.BatchWorker
using IronOcr;
namespace MyCompany.OcrCore
{
public class DocumentOcrService
{
private readonly IronTesseract _ocr;
public DocumentOcrService()
{
_ocr = new IronTesseract();
}
public string ProcessDocument(string imagePath)
{
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew();
input.DeNoise();
return _ocr.Read(input).Text;
}
public string ProcessDocumentFromBytes(byte[] imageData)
{
using var input = new OcrInput();
input.LoadImage(imageData);
input.Deskew();
input.DeNoise();
return _ocr.Read(input).Text;
}
public string ProcessDocumentFromStream(Stream imageStream)
{
using var input = new OcrInput();
input.LoadImage(imageStream);
return _ocr.Read(input).Text;
}
}
}
Tek bir sınıf kütüphanesi, tek bir dizi test, tek bir doğruluk profili. MAUI uygulaması ProcessDocument(photoPath) çağırır,ASP.NET CoreAPI ProcessDocumentFromBytes(uploadedBytes) çağırır ve Azure Fonksiyonu ProcessDocumentFromStream(blobStream) çağırır - hepsi aynı gerçekleştirim tarafından desteklenir. akış girişi kılavuzu ve görüntü girişi kılavuzu tüm OcrInput yükleme çeşitlerini belgelendirir.
ASP.NET Core'da Sunucu Tarafı OCR'yi Etkinleştirme
TesseractOcrMaui, birASP.NET Coreprojesinden referans alınamaz. Belge yükleme uç noktası ekleyen ekipler, tamamen farklı bir kütüphaneye yönelmek zorunda kalır. IronOCR, lisans anahtarı dışında herhangi bir yapılandırma değişikliği olmaksızın ASP.NET Core'da çalışır.
TesseractOcrMaui Yaklaşımı:
//ASP.NET CoreWeb API —TesseractOcrMauiCANNOT be used here.
// The package has no net8.0 or netstandard target.
// Referencing it produces: "The given project does not support targeting net8.0-ios/android/windows."
//
// Team is forced to add a second OCR library — Tesseract charlesw wrapper,
// a cloud API, or another solution — creating a split codebase.
[ApiController]
[Route("api/[controller]")]
public class DocumentsController : ControllerBase
{
// Cannot inject ITesseract here — no MAUI host, no MAUI DI container
// Must use a completely different OCR library for server-side processing
}
IronOCR Yaklaşımı:
//ASP.NET Core—IronOCR works without modification
using IronOcr;
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class DocumentsController : ControllerBase
{
[HttpPost("extract-text")]
public async Task<IActionResult> ExtractText(IFormFile file)
{
if (file == null || file.Length == 0)
return BadRequest("No file uploaded.");
var ocr = new IronTesseract();
using var input = new OcrInput();
// Load directly from the upload stream — no temp files
using var stream = file.OpenReadStream();
if (file.ContentType == "application/pdf")
input.LoadPdf(stream);
else
input.LoadImage(stream);
input.Deskew();
input.DeNoise();
var result = ocr.Read(input);
return Ok(new
{
text = result.Text,
confidence = result.Confidence,
pageCount = result.Pages.Count()
});
}
[HttpPost("extract-text-batch")]
public async Task<IActionResult> ExtractTextBatch(List<IFormFile> files)
{
var results = new List<object>();
// Thread-safe: create one IronTesseract per thread
await Parallel.ForEachAsync(files, async (file, ct) =>
{
var ocr = new IronTesseract();
using var input = new OcrInput();
using var stream = file.OpenReadStream();
input.LoadImage(stream);
var result = ocr.Read(input);
lock (results)
{
results.Add(new { file = file.FileName, text = result.Text });
}
});
return Ok(results);
}
}
Aynı kod IIS, Kestrel veya bir Linux Docker kapsayıcısına değişmeden dağıtılır. ASP.NET OCR kılavuzu, ara katman yapılandırmasını kapsar ve Docker dağıtım kılavuzu Linux kapsayıcı ayarlarını belgeliyor.
Platforma Özgü İşleyici Kodunu Ortadan Kaldırma
TesseractOcrMaui'nin sadece MAUI'ye yönelik mimarisi, geliştiricileri çoklu hedef çözümlerde OCR entegrasyonu denediğinde platform koşullu kod yazmaya zorlar. IronOCR, aynı paketin her hedef üzerinde doğru şekilde çözülmesi şartıyla platform koşullularının gereksizliğini ortadan kaldırır.
TesseractOcrMaui Yaklaşımı:
// Attempting to share OCR logic across MAUI and non-MAUI targets
// requires platform-conditional compilation — a maintenance hazard
#if ANDROID || IOS || WINDOWS
// Only compile this block in MAUI targets
// Non-MAUI targets cannot referenceTesseractOcrMauiat all
using TesseractOcrMaui;
public class PlatformOcrHandler
{
private readonly ITesseract _tesseract;
public PlatformOcrHandler(ITesseract tesseract)
{
_tesseract = tesseract;
}
public async Task<string> ProcessAsync(string imagePath)
{
await _tesseract.InitAsync("eng");
var r = await _tesseract.RecognizeTextAsync(imagePath);
return r.RecognizedText ?? string.Empty;
}
}
#else
// Server targets need a completely different implementation
public class PlatformOcrHandler
{
public string ProcessAsync(string imagePath)
{
// Duplicate logic using a different library
throw new PlatformNotSupportedException("Use server OCR library here");
}
}
#endif
IronOCR Yaklaşımı:
// One implementation — no conditional compilation, no duplicate logic
using IronOcr;
public class PlatformOcrHandler
{
// This class compiles identically for:
// net8.0-android, net8.0-ios, net8.0-windows (MAUI targets)
// net8.0 (server targets)
// netstandard2.1 (shared library targets)
public string Process(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew();
return ocr.Read(input).Text;
}
}
// Multi-target .csproj — no conditional package references needed
// <TargetFrameworks>net8.0;net8.0-android;net8.0-ios</TargetFrameworks>
// IronOcr resolves correctly for all three targets from one package reference
OCR işleme kodundaki platform koşulluları, zamanla birleşik olan bir mimari ayırımı gösterir. Her dil yapılandırma değişikliği, her ön işleme ayarı, her güven eşik ayarlaması her iki dalda da uygulamalıdır. IronOCR, bu ayrımı gereksiz hale getirir. .NET OCR kütüphanesi genel bakışı çok hedefli proje yapısını ayrıntılı olarak kapsar.
Sözel Koordinatlarla Yapılandırılmış Veri Çıkarma
TesseractOcrMaui sadece result.RecognizedText ve üst düzey bir güven skoru sunar. Form alanı doğrulaması, belge ayrıştırma veya vurgulu örtüşmeler için gerekli olan her bir kelimeyi sınır kutularıyla çıkarma mümkün değildir. IronOCR, tam bir belge nesne modeli sunar: sayfalar, paragraflar, satırlar, kelimeler ve karakterler, her biri piksel koordinatları ile.
TesseractOcrMaui Yaklaşımı:
// TesseractOcrMaui: flat text string only — no structure, no coordinates
public class TesseractMauiFormParser
{
private readonly ITesseract _tesseract;
public TesseractMauiFormParser(ITesseract tesseract)
{
_tesseract = tesseract;
}
public async Task<Dictionary<string, string>> ParseFormAsync(string imagePath)
{
await _tesseract.InitAsync("eng");
var result = await _tesseract.RecognizeTextAsync(imagePath);
// result.RecognizedText is one flat string — no field positions
// Parsing requires fragile line-splitting and regex heuristics
var fields = new Dictionary<string, string>();
var lines = result.RecognizedText?.Split('\n') ?? Array.Empty<string>();
foreach (var line in lines)
{
// Hope the layout stays consistent enough to parse
var parts = line.Split(':');
if (parts.Length == 2)
fields[parts[0].Trim()] = parts[1].Trim();
}
return fields;
//Hayırway to validate against expected field positions
//Hayırconfidence per word — only document-level confidence
}
}
IronOCR Yaklaşımı:
// IronOCR: full document structure with bounding boxes per word
using IronOcr;
public class IronOcrFormParser
{
public List<WordLocation> ExtractWordsWithPositions(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
var wordLocations = new List<WordLocation>();
foreach (var page in result.Pages)
{
foreach (var word in page.Words)
{
wordLocations.Add(new WordLocation
{
Text = word.Text,
Confidence = word.Confidence,
X = word.X,
Y = word.Y,
Width = word.Width,
Height = word.Height
});
}
}
return wordLocations;
}
public FormData ParseStructuredForm(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
input.Deskew();
var result = ocr.Read(input);
var form = new FormData();
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
// Use Y coordinate to identify form regions
if (paragraph.Y < 200)
form.HeaderText += paragraph.Text + " ";
else if (paragraph.Y > 800)
form.FooterText += paragraph.Text + " ";
else
form.BodyLines.Add(paragraph.Text);
}
}
form.OverallConfidence = result.Confidence;
return form;
}
}
public class WordLocation
{
public string Text { get; set; }
public float Confidence { get; set; }
public int X { get; set; }
public int Y { get; set; }
public int Width { get; set; }
public int Height { get; set; }
}
public class FormData
{
public string HeaderText { get; set; } = string.Empty;
public string FooterText { get; set; } = string.Empty;
public List<string> BodyLines { get; set; } = new();
public float OverallConfidence { get; set; }
}
Kelime koordinatları, bilinen form şablonlarına karşı doğrulama, insan incelemesi için güvene dayalı işaretleme ve belge görüntüleyici UI'lerinde vurgulu örtüşmeler sağlar. yapılandırılmış sonuçlar kılavuzu tam OcrResult nesne modelini, karakter düzeyinde erişim dahil olmak üzere belgelendirir ve güven skorları kılavuzu sözcük başına güven filtreleme desenlerini kapsar.
Altyapısız Asenkron ve İlerleme Takipli Arka Plan İşleme
TesseractOcrMaui, bir async API (RecognizeTextAsync) sunar ancak sadece MAUI uygulama bağlamı içerisinde. Uzun süreli toplu işleri, bir arka plan hizmetinde, Azure Fonksiyonunda veya işçi işlemi içinde çalıştırmak zorundadır — TesseractOcrMaui'nin hedefleyemeyeceği bir şey. IronOCR, herhangi bir barındırılan servis içinde çalışan yerel asenkron destek sağlar.
TesseractOcrMaui Yaklaşımı:
// Background processing is impossible with TesseractOcrMaui.
// IHostedService runs in a server context —TesseractOcrMauihas no server target.
// The MAUI async API exists, but there is nowhere to run it outside the MAUI app host.
public class DocumentBatchWorker : BackgroundService
{
// ITesseract cannot be injected here — no MAUI DI in a hosted service
// Attempting to referenceTesseractOcrMauiwill fail to compile:
// error: PackageTesseractOcrMauidoes not support target net8.0
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
throw new PlatformNotSupportedException(
"TesseractOcrMaui has no server target. Use a different OCR library.");
}
}
IronOCR Yaklaşımı:
// IronOCR: hosted service background batch processor
using IronOcr;
using Microsoft.Extensions.Hosting;
public class DocumentBatchWorker : BackgroundService
{
private readonly ILogger<DocumentBatchWorker> _logger;
private readonly string _inputFolder;
private readonly string _outputFolder;
public DocumentBatchWorker(ILogger<DocumentBatchWorker> logger, IConfiguration config)
{
_logger = logger;
_inputFolder = config["Ocr:InputFolder"];
_outputFolder = config["Ocr:OutputFolder"];
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
var pendingFiles = Directory.GetFiles(_inputFolder, "*.pdf")
.Concat(Directory.GetFiles(_inputFolder, "*.jpg"))
.ToList();
if (pendingFiles.Count > 0)
{
_logger.LogInformation("Processing {Count} documents.", pendingFiles.Count);
// Thread-safe parallel processing — one IronTesseract per thread
await Parallel.ForEachAsync(pendingFiles,
new ParallelOptions { MaxDegreeOfParallelism = 4, CancellationToken = stoppingToken },
async (filePath, ct) =>
{
await ProcessDocumentAsync(filePath, ct);
});
}
await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
}
}
private async Task ProcessDocumentAsync(string filePath, CancellationToken ct)
{
try
{
var ocr = new IronTesseract();
using var input = new OcrInput();
if (Path.GetExtension(filePath).Equals(".pdf", StringComparison.OrdinalIgnoreCase))
input.LoadPdf(filePath);
else
input.LoadImage(filePath);
input.Deskew();
input.DeNoise();
var result = await Task.Run(() => ocr.Read(input), ct);
// Produce searchable PDF from the same OCR pass
var outputPath = Path.Combine(_outputFolder,
Path.GetFileNameWithoutExtension(filePath) + "_searchable.pdf");
result.SaveAsSearchablePdf(outputPath);
File.Delete(filePath); // move from input queue
_logger.LogInformation("Processed {File}: {Confidence:F1}% confidence.", filePath, result.Confidence);
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to process {File}.", filePath);
}
}
}
Çalışan Program.cs içinde builder.Services.AddHostedService<DocumentBatchWorker>() ile kaydedilir ve herhangi bir .NET 8 sunucuda çalışır — Windows Servisi, Linux systemd birimi, Docker konteyneri veya Azure Konteyner Uygulaması. async OCR kılavuzu async desenleri kapsar ve araştırılabilir PDF kılavuzu SaveAsSearchablePdf çıkış seçeneklerini belgelendirir.
TesseractOcrMaui API'den IronOCR Haritalama Referansı
| TesseractOcrMaui | IronOCR Karşılığı |
|---|---|
dotnet add package TesseractOcrMaui | dotnet add package IronOcr |
builder.Services.AddTesseractOcr() | Tamamen kaldır — kayıt gerektirmez |
ITesseract (enjekte edilmiş) | new IronTesseract() (doğrudan örneklenmiş) |
_tesseract.InitAsync("eng") | ocr.Language = OcrLanguage.English; (veya varsayılan İngilizce için atla) |
_tesseract.RecognizeTextAsync(imagePath) | ocr.Read(input) |
result.RecognizedText | result.Text |
result.Success | İstisna tabanlı; boolean bayrak yok |
result.Status | catch (Exception ex) mesaj |
result.Confidence | result.Confidence (sözcük başına da) |
TesseractOcrMaui.Results.RecognitionResult | IronOcr.OcrResult |
<MauiAsset> eğitim verisi paketi | dotnet add package IronOcr.Languages.French |
Resources/Raw/tessdata/eng.traineddata | Kaldır — dil verileri NuGet paketinin içinde |
FileSystem.OpenAppPackageFileAsync() (eğitim verisi için) | Kaldır — gerekli değil |
| PDF desteği yok | input.LoadPdf(path) veya input.LoadPdf(stream) |
| Ön işleme yok | input.Deskew(), input.DeNoise(), input.Binarize(), input.Contrast() |
| Aranabilir PDF çıktısı yok | result.SaveAsSearchablePdf(outputPath) |
| Kelime koordinatları yok | result.Pages[0].Words[i].X, .Y, .Width, .Height |
| Kelime başına güven yok | result.Pages[0].Words[i].Confidence |
net8.0-ios yalnızca hedef | net8.0 + IronOcr.iOS paketi |
net8.0-android yalnızca hedef | net8.0 + IronOcr.Android paketi |
Yaygın Göç Sorunları ve Çözümleri
Sorun 1: AddTesseractOcr, Bağımlı Sınıfları Bozmadan Kaldırılamaz
TesseractOcrMaui: OCR gerçekleştiren her sınıf yapıcı enjeksiyon yoluyla ITesseract alır. AddTesseractOcr() 'yi kaldırmak, bu yapıları bir DI çözümleme istisnası ile hemen kırar.
Çözüm: Yapılandırıcı parametresini kaldırın ve doğrudan IronTesseract örneklemesi ile değiştirin. Proje bir DI konteyneri kullanıyorsa ve enjekte edilebilir deseni korumak istiyorsanız, IronTesseract 'yi manuel olarak kaydedin:
// Option A: Direct instantiation (recommended for most cases)
public class ScanPageViewModel
{
public string ScanDocument(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
}
}
// Option B: Register IronTesseract in DI if your architecture requires it
// In MauiProgram.cs or Program.cs:
builder.Services.AddSingleton<IronTesseract>();
// Then inject normally:
public class ScanPageViewModel
{
private readonly IronTesseract _ocr;
public ScanPageViewModel(IronTesseract ocr) { _ocr = ocr; }
public string ScanDocument(string imagePath)
{
using var input = new OcrInput();
input.LoadImage(imagePath);
return _ocr.Read(input).Text;
}
}
Sorun 2: Paket Kaldırıldıktan Sonra Traineddata Dosyalarının Kaybolması
TesseractOcrMaui: Resources/Raw/tessdata/ klasörü, içindeki .traineddata dosyaları ve <MauiAsset> bildirgeleri .csproj 'de kaldırılmalıdır. Onları bırakmak, derleme uyarılarına neden olur ve uygulama paketini kullanılmayan dosyalarla şişirir.
Çözüm: tessdata klasörünü silin, <MauiAsset> girişlerini çıkarın ve manuel olarak indirilen herhangi bir dili kaldırın. Yerine eşdeğer IronOCR dil paketini yükleyin:
# Delete traineddata assets
rm -rf Resources/Raw/tessdata
# Remove from .csproj (delete the MauiAsset ItemGroup):
# <ItemGroup>
# <MauiAsset Include="Resources\Raw\tessdata\*.traineddata" />
# </ItemGroup>
# Install IronOCR language pack (if non-English language was needed)
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
IronOCR dil paketleri, derleme zamanında çözülür ve manuel dosya yönetimi olmadan paketlenir. Çoklu diller rehberi tüm mevcut paketleri ve eş zamanlı çok dilli yapılandırmayı belgeler.
Sorun 3: Her RecognizeTextAsync Öncesinde InitAsync Çağrılmalıdır
TesseractOcrMaui: ITesseract.InitAsync(language) çağrısı her RecognizeTextAsync çağrısından önce gelmelidir. Takımlar genellikle tekrarlı başlatmayı önlemek için _isInitialized koruma bayrakları, çift kontrol kilitleme veya semaforlar ekler. Bu kodların tamamı geçişten sonra ölü kod haline gelir.
Çözüm: IronTesseract bir başlangıç adımı yoktur. Dil, örnekte bir kez ayarlanır. Tüm InitAsync çağrılarını, tüm _isInitialized bayraklarını ve tüm başlatma koruma mantığını çıkarın:
// Before: initialization guard required before every OCR call
private bool _isInitialized = false;
private readonly SemaphoreSlim _initLock = new SemaphoreSlim(1, 1);
public async Task<string> GetTextAsync(string imagePath)
{
await _initLock.WaitAsync();
try
{
if (!_isInitialized)
{
await _tesseract.InitAsync("eng");
_isInitialized = true;
}
}
finally { _initLock.Release(); }
var result = await _tesseract.RecognizeTextAsync(imagePath);
return result.RecognizedText ?? string.Empty;
}
// After: no initialization, no guard, no semaphore
public string GetText(string imagePath)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
return ocr.Read(input).Text;
}
Sorun 4: result.Success Kontrol Deseni Yerine Konulmalıdır
TesseractOcrMaui: RecognizeTextAsync dönüş değeri bir Success boolean ve bir Status dizesi taşır. if (!result.Success) kontrol eden ve hata bilgisi için result.Status okuyan kodun yeniden yazılması gerekir.
Çözüm: IronOCR, standart .NET istisna semantiği kullanır. Başarı bayrağı kontrollerini, try/catch ile değiştirin. Başarı durumunda, .Text her zaman doldurulur (metin bulunmazsa boş dize):
// Before: success-flag pattern
var result = await _tesseract.RecognizeTextAsync(imagePath);
if (!result.Success)
{
logger.LogError("OCR failed: {Status}", result.Status);
return string.Empty;
}
return result.RecognizedText ?? string.Empty;
// After: exception pattern
try
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage(imagePath);
var result = ocr.Read(input);
return result.Text; // empty string if no text found — never null
}
catch (Exception ex)
{
logger.LogError(ex, "OCR failed for {Path}.", imagePath);
return string.Empty;
}
Sorun 5: Paylaşılan Kütüphane Projelerinde Yalnızca MAUI Hedef Çerçevesi
TesseractOcrMaui: TesseractOcrMaui referans veren bir sınıf kütüphanesi otomatik olarak platform kısıtlamasını devralır. Kütüphanenin <TargetFramework> 'i bir MAUI tanımlayıcısına (net8.0-android, net8.0-ios veya net8.0-windows) ayarlanmalıdır, bu da sunucu projeleri tarafından referans alınmasını önler.
Çözüm: Sınıf kütüphanesi hedefini net8.0 veya netstandard2.1 olarak değiştirin ve IronOcr 'i tercih edin. Kütüphane artık herhangi bir tüketici proje tarafından doğru bir şekilde çözülüyor:
<!-- Before: locked to MAUI target becauseTesseractOcrMauihas no net8.0 target -->
<TargetFramework>net8.0-android</TargetFramework>
<PackageReference Include="TesseractOcrMaui" Version="*" />
<!-- After: universal target — referenced from MAUI, API, worker, and Functions -->
<TargetFramework>net8.0</TargetFramework>
<PackageReference Include="IronOcr" Version="*" />
Sorun 6: PDF İşleme, İkinci Bir Kütüphanenin Kaldırılmasını Gerektiriyor
TesseractOcrMaui: PDF desteği uygulayan ekipler, sayfaları RecognizeTextAsync 'a geçirmeden önce PDF sayfalarını görüntülere dönüştürmek için ikinci bir kütüphane (PDFium, PdfPig veya bir bulut işleyici) eklediler. IronOCR'a geçtikten sonra ikinci kütüphane ve tüm sayfa işleme kodu silinebilir.
Çözüm: PDF işleme kütüphanesini çıkarın ve sayfa ekstraksiyon boru hattının tamamını input.LoadPdf() ile değiştirin:
// Before: PDF library + manual temp file management (50+ lines)
using var pdfDoc = PdfDocument.Open(pdfPath);
var results = new List<string>();
foreach (var page in pdfDoc.GetPages())
{
var tempImagePath = Path.Combine(FileSystem.CacheDirectory, $"page_{page.Number}.png");
RenderPageToImage(page, tempImagePath, dpi: 300);
await _tesseract.InitAsync("eng");
var r = await _tesseract.RecognizeTextAsync(tempImagePath);
results.Add(r.RecognizedText ?? string.Empty);
File.Delete(tempImagePath);
}
return string.Join("\n", results);
// After: native PDF support — 5 lines
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = ocr.Read(input);
return result.Text;
PDF giriş rehberi sayfa aralığı seçimi, şifre korumalı PDF'ler ve akış tabanlı yüklemeyi kapsar.
TesseractOcrMaui Geçiş Kontrol Listesi
Öncesi-Geçiş
Kod tabanını herhangi bir kodu değiştirmeden önce tümTesseractOcrMauikullanımlarını envanter için denetleyin:
# Find all files that referenceTesseractOcrMauinamespaces
grep -r "TesseractOcrMaui" --include="*.cs" .
# Find all ITesseract injection points
grep -r "ITesseract" --include="*.cs" .
# Find all AddTesseractOcr registrations
grep -r "AddTesseractOcr" --include="*.cs" .
# Find all InitAsync calls
grep -r "InitAsync" --include="*.cs" .
# Find all RecognizeTextAsync calls
grep -r "RecognizeTextAsync" --include="*.cs" .
# Find traineddata asset declarations in project files
grep -r "tessdata" --include="*.csproj" .
# Find MauiAsset traineddata declarations
grep -r "MauiAsset" --include="*.csproj" .
# Identify projects with MAUI-only target frameworks that hold OCR logic
grep -r "net8.0-android\|net8.0-ios\|net8.0-windows" --include="*.csproj" .
Yapıcısında ITesseract kullanan her sınıfı belirleyin — bu yapılar değişecektir. <MauiAsset> 'yi eğitim verisi için ilan eden her proje dosyasını belirleyin — bu ilanlar silinecektir. PDF işleme kütüphanesinin mevcut olup olmadığını ve sadece OCR ön işleme için kullanılıp kullanılmadığını belirleyin.
Kod Geçişi
- Her proje
dotnet remove package TesseractOcrMauikullanandotnet remove package TesseractOcrMaui'yi çalıştırın - OCR gerçekleştirecek her proje
dotnet add package IronOcr'yi çalıştırın - Android hedefleyen MAUI projelerinde
dotnet add package IronOcr.Android'yi çalıştırın - iOS hedefleyen MAUI projelerinde
dotnet add package IronOcr.iOS'yi çalıştırın - Daha önce eğitim verisi olarak paketlenen herhangi bir İngilizce olmayan dil için
dotnet add package IronOcr.Languages.*'yi çalıştırın - Her bir giriş noktası projesinde uygulama başlangıcında
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";ekleyin Resources/Raw/tessdata/ve tüm.traineddatadosyalarını MAUI projelerinden silin<MauiAsset Include="Resources\Raw\tessdata\*.traineddata" />satırlarını tüm.csprojdosyalarından çıkarınbuilder.Services.AddTesseractOcr()'yi tümMauiProgram.csdosyalarından çıkarın- Tüm
using TesseractOcrMaui;veusing TesseractOcrMaui.Results;'yıusing IronOcr;ile değiştirin - Tüm servis ve görünüm-modeli sınıflarından
ITesseractyapılandırıcı parametrelerini çıkarın - Gerekirse (varsayılan olarak İngilizce)
await _tesseract.InitAsync("eng")çağrılarınıocr.Language = OcrLanguage.English;ile değiştirin await _tesseract.RecognizeTextAsync(imagePath)'i birOcrInputörneği kullanarakocr.Read(input)ile değiştirinresult.RecognizedText'iresult.Textile değiştirinif (!result.Success)kontrollerini, try/catch blokları ile değiştirin- TesseractOcrMaui'yi desteklemek için sadece bir PDF işleme kütüphanesi eklendiyse, bunu kaldırın ve sayfa çıkartma kodunu
input.LoadPdf()ile değiştirin - OCR mantığı içeren sınıf kütüphanelerindeki sadece MAUI hedef çerçevelerini
net8.0veyanetstandard2.1olarak değiştirin
Geçiş Sonrası
- Hem iOS hem de Android hedeflerinde cihaz kamerası tarafından çekilen bir JPEG görüntüsünden OCR'nin metin ürettiğini doğrulayın
- Sunucu tarafı API uç noktasında
byte[]üzerinden yüklenen aynı görüntüden OCR'nin metin ürettiğini doğrulayın - Paylaşılan sınıf kütüphanesinin hem MAUI hem deASP.NET Coreprojelerden referans alındığında derlendiğini ve çalıştığını onaylayın
- PDF girişinin herhangi bir geçici dosya oluşturmadan uçtan uca çalıştığını test edin
SaveAsSearchablePdfçıktısının bir PDF görüntüleyicisinde indekslenebilir olduğunu doğrulayın- Güven skorlarının
result.Confidencevepage.Words[i].Confidenceüzerinde mevcut olduğunu onaylayın - MAUI uygulamasının eğitilmiş veri dosyası bulunamadı hatası olmadan hatasız bir başlangıç günlüğü ürettiğini test edin
Resources/Raw/tessdata/klasörünün açıklanan MAUI uygulama paketinde bulunmadığını doğrulayın- Paralel toplu işlem koşulunu on veya daha fazla belge ile yürütün ve iş parçacığı güvenliğini onaylayın
InitAsync'in çıkarılmasının herhangi bir hizmet sınıfında yetim kalmış semafor veya_isInitializeddurumu bırakmadığını onaylayın
IronOCR'a Geçişin Ana Faydaları
Tüm Ürün Çapında Tek Kod Tabanı. Geçişten sonra, çözümdeki her proje — MAUI mobil uygulama,ASP.NET CoreAPI, Azure Fonksiyonu, arka plan çalışanı — aynı paylaşılan kütüphaneden aynı DocumentOcrService sınıfını çağırır. Dil yapılandırması, ön işleme ayarları ve doğruluk ayarlamaları tek bir yerde yapılır. Yeni bir belge türü, yeni bir ön işleme filtresi gerektiriyorsa, değişiklik bir kez yapılır ve her yerde etkili olur.
Yeniden Yazmadan Sunucu Tarafı Dağıtım. IronOCR, Linux konteynerlarına, Windows Server'a, Azure App Service'e, AWS Lambda'ya ve diğer .NET 8 çalışma zamanı hedeflerine değişiklik yapmadan dağıtılır. Mobil kamera yakalamalarını işleyen aynı IronTesseract örneği, sunucu tarafı PDF yüklemelerini de işler. Azure dağıtım rehberi ve AWS dağıtım rehberi, platforma özel yapılandırma adımlarını belgeler.
İkinci Bir Kütüphane Olmadan PDF İşleme. input.LoadPdf() yoluyla doğal PDF girişi, PDF işleme kütüphanesini, sayfa bazında görüntü çıkarım döngüsünü, geçici dosya yönetimini ve TesseractOcrMaui'nin mimarisinin gerektirdiği temizlik kodunu ortadan kaldırır. Taralı PDF sözleşmeleri, faturalar ve kimlik belgeleri tek satırda yüklenir. Metni çıkartan aynı OCR geçişi, result.SaveAsSearchablePdf() ile aranabilir bir PDF üretebilir — TesseractOcrMaui'nin herhangi bir düzeyde sağlayamayacağı bir beceri.
Gerçek Mobil Görüntüleri İşleyen Ön İşleme. input.Deskew(), input.DeNoise(), input.Binarize() ve input.Sharpen(), Tesseract motoru verileri görmeden önce kalibre edilmiş görüntü düzeltmelerini uygulayan tek metod çağrılarıdır. Yeterli ön işleme olmadan düşük ışık koşullarında mobil çekimlerde %40–60 doğruluk kabul eden ekipler, üç filtreli bir boru hattı ekledikten sonra genellikle %85–90+ doğruluğa ulaşır. Hiçbir SkiaSharp, hiçbir ImageSharp, hiçbir algoritma uygulaması gerekmez. görüntü kalitesi düzeltme rehberi, mevcut tüm filtreleri ve ne zaman uygulanacağını belgeler.
Belli Bir Yükselme Yolu ile Ticari Destek. Iron Software, tüm IronOCR lisans katmanları için e-posta desteği ve Profesyonel ve Enterprise seviyelerinde öncelikli telefon ve sohbet desteği sağlar. Belirli bir Android API seviyesinde yerel kütüphane çözümlemesini bozan bir platform güncellemesi olduğunda — TesseractOcrMaui'nin GitHub sorun kuyruğunun gönüllü saatlerinde hallettiği türden bir hata — gerçek bir mühendislik ekibi yanıt verme sorumluluğu ile mevcut olur. Süresiz lisanslamalar Lite seviyesi için $999 'den başlar; lisanslama sayfası tüm seviyeleri ve içerdiği destek seviyelerini listeler.
NuGet Üzerinden 125+ Dil ve Uygulama Paketi Şişirmesi Olmadan. TesseractOcrMaui, eğitilmiş veri dosyalarını MAUI uygulaması içerisine yerleştirir — her dil, uygulama indirme boyutuna 10–50 MB ekler.IronOCR dil paketleri NuGet üzerinden yüklenir ve yalnızca sunucu tarafı yapıların veya açıkça referans alındıkları platform yapılarına dahil edilir. Mobil uygulama paketleri zayıf kalır; sunucu tarafı yapılar tam dil setini alır. Yeni bir dil eklemek bir dotnet add package komutu ile, proje dosyası değişikliği veya dosya yönetimi olmadan yapılır. tam diller kataloğu, mevcut olan 125'ten fazla paketin tamamını listeler.

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ılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.