IRONSOFTWAREHOME
VIDEOLAR

Tesseract.NET SDK'dan IronOCR'ye Geçiş

Curtis Chau
Curtis Chau
Updated: 1 Ağustos 2026

.NET geliştiricilerine,Tesseract.NET SDK(Tesseract.Net.SDK, namespace Patagames.Ocr) üzerindeki somut geçişi IronOCR ile adım adım anlatan bu kılavuz. Özellikle .NET Framework dönemi başlangıç desenleri, eski atık kalıpları ve yalnızca senkron hatlar taşıyan ekipleri hedef alır. OCR servisiniz net472 ile derlenip birisi <TargetFramework>net8.0</TargetFramework> eklediğinde .csproj anında başarısız oluyorsa, bu kılavuz sizin için yazılmıştır.

Tesseract.NET SDK'dan Neden Göç Edilmeli

Patagames SDK, .NET Framework 4.5 dağıtımın temeli ve Windows Server'ın tek hedef olduğu zamanlarda gerçek değer sundu. Bu bağlam değişti. Çoğu organizasyon artık hizmetleri kapsül içine alır, CI'i Linux çalıştırıcılarında çalıştırır ve .NET 6, 8 veya 9'u standart hale getirir.Tesseract.NET SDKbunu takip edemez.

.NET Framework 4.5 için sert bir üst sınır. Paket net20 ile net45 arasında hedeflenir. Hiçbir netstandard veya net6.0 assembly üretmez. Tesseract.Net.SDK içeren bir proje dosyası <TargetFramework>net8.0</TargetFramework> ayarlanamaz. Kod tabanının geri kalanının, bir sprint'te tamamladığı .NET yükseltmesi, OCR katmanı üzerinde süresiz olarak takılıyor.

Bir konteyner yolu yok. SDK yalnızca Windows'a özel P/Invoke çağrılarını Windows yerel ikili dosyalarına taşır. Herhangi bir Linux tabanlı görüntüde — mcr.microsoft.com/dotnet/aspnet:8.0, ubuntu:22.04, alpine:3.19 — uygulama, tek bir belgeyi işleme almadan önce DllNotFoundException atar. Windows konteynerleri bir çözüm olarak mevcut, ancak daha büyük görüntü boyutları, ayrı bir lisans maliyeti ve çoğu yönetilen Kubernetes hizmetiyle uyumsuzluk taşırlar.

Yalnızca eşzamanlı API'lerle ASP.NET Core hatları engellenir. OcrApi.GetTextFromImage() yöntemi eşzamanlıdır. ASP.NET Core'da, istek iş parçacıklarında senkronize blok operasyonları çağırmak, yük altında verimi düşürür ve iş parçacığı havuzu açlığını riske atar. IronOCR, bloklanmayan entegrasyon için ReadAsync() sağlar. Deseni görmek için async OCR rehberi'ne bakın.

İstek başına motor oluşturma belleği yakar. .NET Framework kodu, bir yöntem çağrısı veya bir istek için yaygın olarak bir OcrApi örneği oluşturur ve çıkışta yok eder. Bu, idiomatik bir .NET Framework yaşam döngüsü yönetimidir. Ayrıca pahalıdır: her Init() 40-100 MB dil verisi yükler. On eştalep, aynı dil modelini on kez yükler. IronOCR'un IronTesseract 'si iş parçacığı güvenlidir — tek bir örnek uygulamanın yaşam döngüsü boyunca var olur ve tek bir dil model yüklemesinden tüm eş zamanlı çağrı yapanlara hizmet eder.

Eski imha kalıpları riski biriktirir. SDK'nın doğru kullanımı, using (var api = OcrApi.Create()) { ... } bloğunu gerektirir — using var tanımlamalarından önce gelen C# 1.0 using ifadesi. C# 8.0'dan önce yazılmış kod tabanları genellikle try/finally imha modellerini veya hata vakalarında hiçbir imha içermemektedir. Bu kalıplar .NET Framework üzerinde derlenir ve çalışır, ancak modern yeniden yapılandırmayı engelleyen teknik borç taşır.

Asenkron yok, DI yok, modern başlangıç yok. SDK, bağımlılık enjeksiyonu entegrasyonu, barındırılan hizmet ömrü veya IOptions<t> yapılandırması kavramına sahip değildir. Onu bir ASP.NET Core uygulamasına bağlamak, manuel hizmet kaydı ve dikkatli bir şekilde iste k başına örnek oluşturmayı önlemeyi gerektirir. IronOCR, standart DI konteynerinde bir singleton hizmet olarak temiz bir şekilde entegre olur.

Temel Sorun

// Tesseract.NET SDK: .NET Framework 4.5 ceiling — will not compile on net8.0
// Every project referencing this package is locked below the upgrade line
using Patagames.Ocr;  // Patagames.Ocr targets net45; no netstandard or net8 assembly

public class OcrService
{
    public string ProcessDocument(string imagePath)
    {
        // Synchronous-only — blocks ASP.NET Core request threads
        // No DI support — must be instantiated manually each time
        using (var api = OcrApi.Create())    // C# 1.0 using statement, 40-100MB load per call
        {
            api.Init(Languages.English);
            return api.GetTextFromImage(imagePath);
        }
        // Project cannot target net6.0, net8.0, or any Linux container base image
    }
}
C#
// IronOCR: same logic, any runtime from net462 to net9.0, any platform
using IronOcr;  // Single NuGet, supports .NET Framework 4.6.2+, .NET 5/6/7/8/9

// Register once as singleton — load language model once, share across all requests
// Call ReadAsync() in ASP.NET Core for non-blocking operation
var ocr = new IronTesseract();
var result = await ocr.ReadAsync("document.jpg");  // Async-first, no thread blocking
Console.WriteLine(result.Text);
C#

IronOCR vs Tesseract.NET SDK: Özellik Karşılaştırması

Aşağıdaki tablo, bir .NET modernizasyon geçişi açısından doğrudan ilgili yetenekleri eşleştirir.

ÖzellikTesseract.NET SDKIronOCR
.NET Framework 2.0–4.5EvetHayır
.NET Framework 4.6.2–4.8HayırEvet
.NET Core 2.x / 3.xHayırEvet
.NET 5HayırEvet
.NET 6HayırEvet
.NET 7HayırEvet
.NET 8HayırEvet
.NET 9HayırEvet
Windows dağıtımıEvetEvet
Linux dağıtımıHayırEvet
macOS dağıtımıHayırEvet
Docker Linux konteynerleriHayırEvet
Azure App Service (Linux)HayırEvet
AWS LambdaHayırEvet
Asenkron API (ReadAsync)HayırEvet
İplik güvenli tekil örnekHayırEvet
ASP.NET Core DI entegrasyonuYönergeSingleton hizmet
Yerel PDF girişiHayırEvet
Dahili ön işlemeHayırEvet
Aranabilir PDF çıktısıHayırEvet
Yapılandırılmış veri (kelimeler, satırlar, paragraflar)HayırEvet
Ticari destek / SLAHayır (bireysel geliştirici)Evet
Süresiz lisans fiyatı~$20–50 (tek geliştirici)$999 'den

Hızlı Başlangıç: Tesseract.NET SDK'dan IronOCR'a Geçiş

Adım 1: NuGet Paketini Değiştirin

Tesseract.NET SDK'yı kaldırın:

dotnet remove package Tesseract.Net.SDK
SHELL

SD&K'ya PDF sayfalarını beslemek için yalnızca PdfiumViewer veya benzeri bir PDF işleme kütüphanesi kurulduysa, onu da kaldırın —IronOCR yerel olarak PDF'leri okur:

dotnet remove package PdfiumViewer
SHELL

NuGet kullanarak IronOCR'u yükleyin:

dotnet add package IronOcr

Adım 2: Ad Alanlarını Güncelleyin

// Before (Tesseract.NET SDK)
using Patagames.Ocr;
using Patagames.Ocr.Enums;

// After (IronOCR)
using IronOcr;
C#

Adım 3: Lisansa İzin Verin

Lisans anahtarı çağrısını uygulama başlangıcında bir kez ekleyin — Program.cs, Startup.cs veya uygulama ana bilgisayar oluşturucusunda:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

ücretsiz deneme lisansı, değerlendirme için damgasız olarak mevcuttur.

Kod Göç Örnekleri

.NET Framework Başlatma Deseni Modern Ana Bilgisayar Oluşturucuya

.NET Framework uygulamaları genellikle OCR motorunu statik bir yapıcıda, bir Application_Start olayında veya bir Global.asax işleyicisinde başlatır. .NET 6+ işletim modeli üzerinde oluşturulmuş uygulamalarda bunların hiçbiri mevcut değil.

Tesseract.NET SDK Yaklaşımı:

// Global.asax.cs — .NET Framework MVC application
// OcrApi lifecycle managed manually; no DI container involved
public class MvcApplication : System.Web.HttpApplication
{
    // Static field — one engine for the app lifetime
    // But: NOT thread-safe; concurrent requests share a single OcrApi instance
    private static OcrApi _globalApi;

    protected void Application_Start()
    {
        // Initialize OCR engine on app startup
        // Path to tessdata hardcoded for deployment environment
        _globalApi = OcrApi.Create();
        _globalApi.Init(Languages.English);

        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

    protected void Application_End()
    {
        // Must manually dispose on shutdown
        _globalApi?.Dispose();
    }
}
C#

IronOCR Yaklaşımı:

// Program.cs —.NET 8ASP.NET Core application
//IronTesseract iş parçacığı güvenlidir; register as singleton, inject where needed
var builder = WebApplication.CreateBuilder(args);

IronOcr.License.LicenseKey = builder.Configuration["IronOcr:LicenseKey"];

// Register as singleton — one instance, thread-safe, shared across all requests
builder.Services.AddSingleton<IronTesseract>();

builder.Services.AddControllers();

var app = builder.Build();
app.MapControllers();
app.Run();
C#

Global.asax deseni tamamen ortadan kalkar. IronTesseract standart bir singleton hizmet olarak kaydedilir, denetleyicilere ve hizmetlere yapıcı aracılığıyla enjekte edilir. Dil modeli ilk kullanımda bir kez yüklenir ve uygulama ömrü boyunca bellekte kalır. IronTesseract kurulum rehberi, kayıt zamanında dil seçimi ve motor modunu içeren yapılandırma seçeneklerini kapsar.

Eski İmha Deseni Modernizasyonu

.NET Framework 2.0 kodu using (var x = ...) { } blok ifadesini kullanır. C# 8.0, içerdiği blokla imha kapsamını sınırlayan using var tanımları tanıttı. Eski kod tabanları ayrıca, tüm senaryolarda güvenilmeyen using ifadeleri yazıldığı zaman yazılan try/finally imha korumalarını taşır. Tüm bu kalıplar, .NET Framework için yazılmış kodun bir göstergesi olup, göç sırasında modernize edilmelidir.

Tesseract.NET SDK Yaklaşımı:

// .NET Framework 4.x disposal patterns — three variants encountered in production
public class LegacyOcrProcessor
{
    // Pattern 1: try/finally guard (pre-C# 2.0 style, still common in legacy code)
    public string ProcessWithTryFinally(string imagePath)
    {
        OcrApi api = null;
        try
        {
            api = OcrApi.Create();
            api.Init(Languages.English);
            return api.GetTextFromImage(imagePath);
        }
        finally
        {
            if (api != null)
                api.Dispose();  // Manual null check required
        }
    }

    // Pattern 2: nested using blocks — one for engine, one for image object
    public string ProcessWithNestedUsing(string imagePath)
    {
        using (var api = OcrApi.Create())
        {
            api.Init(Languages.English);
            using (var img = OcrImage.FromFile(imagePath))
            {
                api.SetImage(img);
                return api.GetText();
            }   // img disposed here
        }       // api disposed here — nested indentation grows with each resource
    }

    // Pattern 3: missing disposal — memory leak, common in older service code
    public string ProcessUnsafe(string imagePath)
    {
        var api = OcrApi.Create();   // WARNING: never disposed
        api.Init(Languages.English);
        return api.GetTextFromImage(imagePath);
    }
}
C#

IronOCR Yaklaşımı:

// Modern C# 8.0+ disposal — flat, readable, no nesting
public class ModernOcrProcessor
{
    private readonly IronTesseract _ocr;  // Injected singleton, never disposed per-request

    public ModernOcrProcessor(IronTesseract ocr) => _ocr = ocr;

    // Pattern 1: using var declaration — scoped to method, no nesting
    public string ProcessDocument(string imagePath)
    {
        using var input = new OcrInput();  // OcrInput is the disposable resource, not the engine
        input.LoadImage(imagePath);
        return _ocr.Read(input).Text;
    }   // input disposed here automatically — no nesting, no try/finally

    // Pattern 2: multiple inputs in one scope — still flat
    public string ProcessMultipleInputs(string imagePath, string pdfPath)
    {
        using var imageInput = new OcrInput();
        imageInput.LoadImage(imagePath);

        using var pdfInput = new OcrInput();
        pdfInput.LoadPdf(pdfPath);

        var imageText = _ocr.Read(imageInput).Text;
        var pdfText = _ocr.Read(pdfInput).Text;

        return $"{imageText}\n{pdfText}";
    }   // both inputs disposed here — zero nesting
}
C#

IronOCR'da sadece OcrInput atılabilir kaynaktır. Motorun kendisi (IronTesseract) istek başına atılmaz — o bir singleton'dur. Bu, OcrApi.Create() + api.Init() 'nin dayattığı istek başına 40-100 MB dil modeli yeniden yüklemesini ortadan kaldırır. görüntü giriş kılavuzu, akışlar, bayt dizileri ve URL'ler de dahil olmak üzere tüm OcrInput yükleme yöntemlerini kapsar.

ASP.NET Core Denetleyicileri için Asenkron Entegrasyon

Tesseract.NET SDK'da asenkron API yoktur. Her çağrı senkronizedir. ASP.NET Core'da, asenkron denetleyici işlemlerinden senkronize blok operasyonları çağırmak, yük altında iş parçacığı havuzunda aç kalma riski taşır. Yaygın çözüm — Task.Run() içinde eşzamanlı çağrıları sarmak — bloklama işini bir iş parçacığı havuzu iş parçacığına aktarır ancak iş parçacığı tüketimini ortadan kaldırmaz. IronOCR'un ReadAsync() 'si gerçek asenkron I/O entegrasyonu sağlar.

Tesseract.NET SDK Yaklaşımı:

// ASP.NET Core controller — forced workaround for synchronous OCR API
[ApiController]
[Route("api/ocr")]
public class OcrController : ControllerBase
{
    [HttpPost("extract")]
    public async Task<IActionResult> ExtractText(IFormFile file)
    {
        // Must copy upload to temp file — OcrApi does not accept streams directly
        var tempPath = Path.GetTempFileName();
        await using (var stream = System.IO.File.OpenWrite(tempPath))
            await file.CopyToAsync(stream);

        string text;
        try
        {
            // Task.Run wraps synchronous call — still consumes a thread-pool thread
            // Does NOT free the calling thread during OCR processing
            text = await Task.Run(() =>
            {
                using (var api = OcrApi.Create())   // 40-100MB load per request
                {
                    api.Init(Languages.English);
                    return api.GetTextFromImage(tempPath);  // synchronous, blocking
                }
            });
        }
        finally
        {
            System.IO.File.Delete(tempPath);  // Manual temp file cleanup
        }

        return Ok(new { text });
    }
}
C#

IronOCR Yaklaşımı:

// ASP.NET Core controller — genuine async OCR, no temp files, no thread blocking
[ApiController]
[Route("api/ocr")]
public class OcrController : ControllerBase
{
    private readonly IronTesseract _ocr;  // Singleton injected via DI

    public OcrController(IronTesseract ocr) => _ocr = ocr;

    [HttpPost("extract")]
    public async Task<IActionResult> ExtractText(IFormFile file)
    {
        // Load stream directly — no temp file needed
        using var input = new OcrInput();
        input.LoadImage(file.OpenReadStream());  // Stream input, no disk write

        // ReadAsync — genuinely non-blocking, integrates with ASP.NET Core pipeline
        var result = await _ocr.ReadAsync(input);

        return Ok(new
        {
            text = result.Text,
            confidence = result.Confidence
        });
    }
}
C#

Geçici dosya gidiş-dönüşü ortadan kalkar. Task.Run sarmalayıcısı ortadan kalkar. İstek başına OcrApi.Create() ve bunu takip eden 40-100 MB yük ortadan kalkar. async OCR nasıl yapılır ve stream giriş rehberi iptal belirteci desteği dahil olmak üzere tam asenkron hattı belgeler.

Çoklu Çerçeve TIFF İşleme

  1. Aşama karşılaştırma makalesi temel görüntü ve PDF işleme konularını ele aldı. Birden fazla çerçeve içeren TIFF, belge arşivleme, faks sistemleri ve tıbbi görüntüleme hattında yaygın bir senaryo. Tesseract.NET SDK, System.Drawing.Bitmap kullanarak TIFF çerçevelerini manuel olarak yinelemeyi, her çerçeveyi geçici bir PNG dosyasına çıkarmayı, geçici dosyada OCR çalıştırmayı ve temizlemeyi gerektirir. Bu desen, bellek yetersizliği hatalarından kaçınmak için büyük belgelerde açık GC çağrılarını zorlar.

Tesseract.NET SDK Yaklaşımı:

// Multi-frame TIFF: manual frame extraction to temp files + forced GC
using System.Drawing;
using System.Drawing.Imaging;
using Patagames.Ocr;

public List<string> ProcessMultiFrameTiff(string tiffPath)
{
    var pageTexts = new List<string>();

    using (var api = OcrApi.Create())
    {
        api.Init(Languages.English);

        using (var bitmap = new Bitmap(tiffPath))
        {
            var dimension = new FrameDimension(bitmap.FrameDimensionsList[0]);
            int frameCount = bitmap.GetFrameCount(dimension);

            for (int i = 0; i < frameCount; i++)
            {
                bitmap.SelectActiveFrame(dimension, i);

                // Must write each frame to a temp file — no in-memory path
                var tempPath = Path.GetTempFileName() + ".png";
                bitmap.Save(tempPath, ImageFormat.Png);

                try
                {
                    pageTexts.Add(api.GetTextFromImage(tempPath));
                }
                finally
                {
                    File.Delete(tempPath);  // Manual cleanup on every frame
                }

                // Force GC every 10 frames — workaround for memory pressure
                // Slows processing; indicates memory management is manual
                if (i % 10 == 0)
                {
                    GC.Collect();
                    GC.WaitForPendingFinalizers();
                }
            }
        }
    }

    return pageTexts;
}
C#

IronOCR Yaklaşımı:

// Multi-frame TIFF: one method call, no temp files, no manual GC
using IronOcr;

public List<string> ProcessMultiFrameTiff(string tiffPath)
{
    var ocr = new IronTesseract();

    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);  // Loads all frames natively — no temp files

    var result = ocr.Read(input);

    // Pages map directly to TIFF frames
    return result.Pages.Select(page => page.Text).ToList();
}
C#

Otuz satır sekize düşer. Hiçbir geçici dosya yok, Bitmap çerçeve yinelemesi yok, GC.Collect() çağrıları yok. LoadImageFrames, ara dosyalar yazmadan keyfi olarak büyük çok çerçeveli TIFF'leri işler. TIFF ve GIF giriş rehberi, geniş belgeler için seçici çerçeve yüklemeyi (dizin aralığı ile) ve ilerleme geri bildirimlerini kapsar.

Docker Konteyner Dağıtım Hazırlığı

Tesseract.NET SDK kodu, bir geliştiricinin Windows makinesinde çalışan Docker derleme veya çalıştırma adımında temel görüntü Linux olduğunda başarısız olur. Çözüm Dockerfile ayarlaması değil — yerel ikili dosyalar yalnızca Windows'adır ve Linux üzerinde yüklenemezler. IronOCR'un Linux desteği, Dockerfile'a küçük bir apt-get eklemesi ve uygulama kodunda başka bir şey gerektirmez.

Tesseract.NET SDK Yaklaşımı:

# Dockerfile attempt — fails at runtime on Linux base image
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
# This base image is Linux (Debian) by default
# Tesseract.Net.SDK's Windows native DLLs cannot load here
# Application throws DllNotFoundException on first OCR call

WORKDIR /app
COPY --from=build /app/publish .

# Even copying the Windows tessdata folder has no effect —
# the P/Invoke DLL cannot be loaded regardless of file placement
COPY tessdata/ ./tessdata/

ENTRYPOINT ["dotnet", "MyApp.dll"]
# Runtime error: DllNotFoundException: Unable to load DLL 'libtesseract'
# No fix available within Tesseract.Net.SDK — requires replacing the library
Text

IronOCR Yaklaşımı:

# Dockerfile for IronOCR on Linux — add one apt-get line, nothing else changes
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

# Required system dependency for IronOCR on Debian/Ubuntu base images
RUN apt-get update && apt-get install -y libgdiplus \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY --from=build /app/publish .

# No tessdata folder — language data is bundled with the IronOcr NuGet packages
# No platform check code — IronOCR runs identically on Windows and Linux

ENTRYPOINT ["dotnet", "MyApp.dll"]
Text

Tek apt-get satırı. Tessdata klasörü yok. Uygulamada platforma şartlı kod yok. Bir geliştiricinin Windows makinesinde çalışan aynı uygulama ikili dosyası, bu Linux konteynerinde değişmeden çalışır. Docker dağıtım kılavuzu, Alpine tabanlı görüntüleri (bu, apt-get yerine apk kullanır), çok aşamalı yapı optimizasyonunu ve lisans anahtarı için ortam değişkeni yapılandırmasını kapsar. Linux dağıtım rehberi çıplak metal Linux ve WSL2 senaryolarını kapsar.

Tesseract.NET SDK API'den IronOCR Haritalama Referansı

Tesseract.NET SDKIronOCR KarşılığıNotlar
Install-Package Tesseract.Net.SDKdotnet add package IronOcrIronOCR, .NET Framework 4.6.2+ ve .NET 5–9'u hedef alır
using Patagames.Ocr;using IronOcr;Tek bir isim alanı
using Patagames.Ocr.Enums;(not needed)Altları IronOcr isim alanında
OcrApi.Create()new IronTesseract()IronTesseract iş parçacığı güvenlidir; singleton olarak kullan
api.Init(Languages.English)ocr.Language = OcrLanguage.EnglishÖzellik ataması, metod çağrısı değil
api.Init(Languages.English |Languages.German)ocr.Language = OcrLanguage.English + OcrLanguage.GermanOperatör +, bit düzeyinde OR değil
api.GetTextFromImage(path)ocr.Read("path.jpg").TextDoğrudan veya OcrInput yoluyla
api.GetTextFromImage(path) (asenkron)await ocr.ReadAsync(input)Gerçek asenkron — Task.Run sarmalayıcıya gerek yok
OcrImage.FromFile(path)input.LoadImage(path)OcrInput, OcrImage değiştirilir
OcrImage.FromBitmap(bitmap)input.LoadImage(bitmap)
new MemoryStream(bytes)OcrImage.FromBitmapinput.LoadImage(bytes)Doğrudan bayt dizisi desteği
api.SetImage(img); api.GetText()ocr.Read(input).TextOcrInput 'e Read 'ye geçirildi
api.GetMeanConfidence()result.ConfidenceYüzde döner; also available per-word
api.SetRectangle(x, y, w, h)input.LoadImage(path, new CropRectangle(x, y, w, h))Bölge bazlı OCR CropRectangle aracılığıyla
api.SetVariable("tessedit_char_whitelist", x)ocr.Configuration.WhiteListCharacters = x
api.SetVariable("tessedit_char_blacklist", x)ocr.Configuration.BlackListCharacters = x
Bitmap kare yineleme + geçici dosyainput.LoadImageFrames(tiffPath)Yerel çoklu kareli TIFF desteği
(synchronous only)result.SaveAsSearchablePdf("out.pdf")Tesseract.NET SDK'da eşdeğer yok
(no structured output)result.Pages, result.Words, result.LinesKelime seviyesinde koordinatlar ve güven
GC.Collect() çözümleri(not needed)IronOCR bellek yönetimini dahili olarak yapar
Platform kontrolü: IsOSPlatform(Windows)(remove entirely)IronOCR platformlar arası çalışır
Tessdata dosya yönetimi(remove entirely)NuGet paketlerine dahil edilmiş diller

Yaygın Göç Sorunları ve Çözümleri

Sorun 1: Proje Hedef Çerçeve Çatışması

Tesseract.NET SDK: Tesseract.Net.SDK kaldırıldıktan ve IronOcr eklendikten sonra, proje hala eski gereksinimden net45 veya net472 hedeflemektedir. IronOCR, net462 ve sonrasını destekler, bu nedenle net45 projeleri hedef çerçeve güncellenmeden önce paket temiz bir şekilde geri yüklenmez.

Çözüm: IronOCR'u eklemeden önce .csproj dosyasındaki <TargetFramework> 'yi güncelleyin. Projenin kademeli bir geçiş sırasında hem eski hem de yeni çalışma ortamlarını desteklemesi gerekiyorsa, çoklu hedefleme kullanın:

<!-- Single modern target (preferred) -->
<TargetFramework>net8.0</TargetFramework>

<!-- Multi-targeting during phased migration — supports both simultaneously -->
<TargetFrameworks>net462;net8.0</TargetFrameworks>
XML

IronOCR, her hedef için doğru derlemeyi otomatik olarak çözer. Aynı dotnet add package IronOcr komutu her ikisi için de geçerlidir. .NET OCR kütüphanesi sayfası tüm desteklenen hedef çerçeveleri listeler.

Sorun 2: Statik OcrApi Alanı DI Singleton ile Değiştirildi

Tesseract.NET SDK: Eski kod, OcrApi örneğini statik bir alan olarak kaydeder (Global.asax, bir statik hizmet bulucu veya bir singleton sarmalayıcı sınıfında). Bu desen gerekliydi çünkü OcrApi iş parçacığı güvenli değildir — iş parçacıkları arasında bir örneği paylaşmak yarış koşullarına neden olur, bu yüzden statik alan bir kilit ile korunmaktaydı veya aslında alan adına rağmen istek başına yeniden oluşturuluyordu.

Çözüm: IronTesseract 'yi DI konteyneri aracılığıyla gerçek bir iş parçacığı güvenli singleton olarak kaydedin. Kilidi kaldırın, statik alanı kaldırın, her istekte yeniden yaratmayı kaldırın:

// Remove: private static OcrApi _instance; / private static readonly object _lock = new();

// Replace with DI registration in Program.cs
builder.Services.AddSingleton<IronTesseract>();

// In consuming classes — constructor injection
public class DocumentProcessor
{
    private readonly IronTesseract _ocr;
    public DocumentProcessor(IronTesseract ocr) => _ocr = ocr;

    public async Task<string> ProcessAsync(string path)
    {
        using var input = new OcrInput();
        input.LoadImage(path);
        var result = await _ocr.ReadAsync(input);
        return result.Text;
    }
}
C#

Sorun 3: Dağıtım Sonrası Tessdata Klasörü Eksik

Tesseract.NET SDK: IronOCR'a geçtikten sonra ekipler bazen tessdata dağıtım adımlarını CI/CD boru hatlarında bırakır. Derleme komut dosyalarında ve dağıtım bildirimlerinde referans verilen tessdata/ klasörü artık mevcut değil — bu, eski SDK'nın dil modeli yönetiminin bir parçasıydı. Betikler artık mevcut olmayan bir klasörü kopyalamaya veya doğrulamaya çalıştıklarında başarısız olurlar.

Çözüm: Tüm tessdata referanslarını dağıtım komut dosyalarından, .csproj kopya hedeflerinden, Docker COPY komutlarından ve CI/CD ardışık düzen adımlarından kaldırın.IronOCR dil verileri NuGet paketleri ile birlikte gelir. dotnet restore çalıştırın ve dil verileri mevcuttur. Başka bir şey gerekmez:

# Remove from CI/CD pipeline
# BEFORE (delete these lines):
# - cp -r tessdata/ $DEPLOY_PATH/tessdata/
# - test -f $DEPLOY_PATH/tessdata/eng.traineddata

# AFTER: nothing — language data is in the NuGet package restore output
dotnet restore   # Downloads IronOcr and any IronOcr.Languages.* packages
dotnet publish   # Includes language data automatically
SHELL

çoklu diller kılavuzu, çevrimdışı/izole dağıtımlar için NuGet paketleri olarak belirli dil paketlerinin nasıl yükleneceğini kapsar.

Sorun 4: BadImageFormatException 32/64-bit Uyumsuzluk

Tesseract.NET SDK: SDK ayrı x86 ve x64 Windows yerel ikilileri ile gönderilir. AnyCPU 'yi hedefleyen projeler, bazen işlem mimarisine bağlı olarak yanlış ikili dosyaya çözülür. Hata, işlem mimarisinin çıktı klasöründeki yerel DLL ile eşleşmediği makinelerde çalışma zamanında BadImageFormatException veya DllNotFoundException olarak ortaya çıkar.

Çözüm: IronOCR, NuGet paketi içinde her platform için doğru yerel ikili dosyayı paketler ve doğru ikili dosyayı runtimes/ klasörü aracılığıyla otomatik olarak çözer. Hiçbir Platform hedef ayarı, mimariye bağlı kopya komutları ve yönetilecek x64 alt klasörleri yok:

<!-- Remove architecture-specific build configurations from .csproj -->
<!-- BEFORE: Conditional native DLL copy based on Platform target -->
<!--
<ItemGroup Condition="'$(Platform)' == 'x64'">
  <Content Include="$(SolutionDir)libs\x64\*.dll">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  </Content>
</ItemGroup>
-->

<!-- AFTER: Nothing.IronOCR resolves the correct binary automatically. -->
XML

Sorun 5: Yapılandırma Dizesi Geçişi

Tesseract.NET SDK: Ham dizi anahtarlarını Tesseract API referansından kullanarak api.SetVariable(string name, string value) aracılığıyla Tesseract motor değişkenleri ayarlanır (örneğin, "tessedit_char_whitelist", "tessedit_pageseg_mode"). Bunlar, IDE tamamlama içermeyen tiplenmemiş dizelerdir. Yazım hataları sessiz başarısızlıklara neden olur — değişken göz ardı edilir, bir istisna değil.

Çözüm: IronOCR, ocr.Configuration üzerinde motor yapılandırmasını türlenmiş özellikler olarak sunar. Yazım hataları derleme zamanı hatalarına dönüşür:

// Before: untyped string variables, silent failures on typos
api.SetVariable("tessedit_char_whitelist", "0123456789");
api.SetVariable("tessedit_pageseg_mode", "7");

// After: typed properties, compile-time validation, IDE completion
ocr.Configuration.WhiteListCharacters = "0123456789";
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine;
C#

IronTesseract API referansı, tüm yapılandırma özelliklerini türleri ve kabul edilen değerleriyle belgelendirir.

Sorun 6: Uzun Toplu İşler için İlerleme Raporlama

Tesseract.NET SDK: IProgress<t> kullanarak ilerleme raporu veren toplu işleme kodu iş seviyesinde çalışır (her dosyadan sonra bir sayacı artırır) ancak tek bir belge içinde rapor veremez — içinde geri çağrısı mekanizması yoktur GetTextFromImage(). 500 sayfalık bir belgede, ilerleme çubuğu belge tamamlanana kadar takılır.

Çözüm: IronOCR, OcrInput üzerinde yerleşik ilerleme izlemesi sunar OcrProgress olayı. İlerleme her sayfada meydana gelir, uzun çok sayfalı belgeler için doğru ilerleme çubuklarına imkan tanır:

// IronOCR: page-level progress tracking for multi-page documents
using IronOcr;

var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadPdf("large-archive.pdf");

// Subscribe to page-level progress events
input.OcrProgress += (sender, e) =>
{
    Console.WriteLine($"Processing page {e.CurrentPage} of {e.TotalPages} " +
                      $"({e.ProgressPercent:F0}%)");
};

var result = ocr.Read(input);
Console.WriteLine($"Complete: {result.Pages.Count} pages extracted");
C#

ilerleme takibi kılavuzu tarayıcı istemcilerine gerçek zamanlı ilerleme itici için ASP.NET Core SignalR ile entegrasyonu kapsar.

Tesseract.NET SDK Geçiş Kontrol Listesi

Öncesi-Geçiş

Kod tabanındaki tümTesseract.NET SDKkullanımını kodu dokunmadan önce denetleyin:

# Find all files referencing Patagames namespace
grep -rl "Patagames" --include="*.cs" .

# Find all OcrApi instantiation points
grep -rn "OcrApi.Create" --include="*.cs" .

# Find tessdata references in project and build files
grep -rn "tessdata" --include="*.cs" --include="*.csproj" --include="*.yaml" --include="*.yml" .

# Find platform guard checks that can be removed after migration
grep -rn "IsOSPlatform.*Windows" --include="*.cs" .

# Find Task.Run wrappers around synchronous OCR calls
grep -rn "Task.Run" --include="*.cs" . | grep -i "ocr\|image\|text"

# Count distinct OcrApi.Create() call sites to estimate migration scope
grep -c "OcrApi.Create" $(find . -name "*.cs")
SHELL

OcrApi.Create() çağrı sitesi sayısını belgeleyin — her biri için singleton enjeksiyon değişimi adayıdır. Modernizasyon için herhangi bir try/finally imha deseni not edin. Hangi Global.asax, Application_Start veya statik yapıcı başlatmasının Program.cs 'ye taşınacağını belirleyin.

Kod Geçişi

  1. Tüm .csproj dosyalarında <TargetFramework> 'yi net8.0 'ye (veya hedef modern çalışma zamanı) güncelleyin
  2. Her projede dotnet remove package Tesseract.Net.SDK çalıştırın
  3. dotnet remove package PdfiumViewer 'yi (veya eşdeğer PDF oluşturma paketini) çalıştırın mevcutsa
  4. Her projede dotnet add package IronOcr çalıştırın
  5. IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"; 'yi Program.cs 'ya veya ana bilgisayar oluşturucuya ekleyin
  6. IronTesseract 'yi DI konteynerinde singleton olarak kaydedin: services.AddSingleton<IronTesseract>()
  7. Tüm using Patagames.Ocr; ve using Patagames.Ocr.Enums; 'yi using IronOcr; ile değiştirin
  8. OcrApi.Create() + api.Init(Languages.X) 'yi yapıcı enjekte edilmiş IronTesseract ile değiştirin
  9. using (var api = OcrApi.Create()) { ... } blocks with using var input = new OcrInput() tanımlamaları
  10. api.GetTextFromImage(path) 'yi ocr.Read(input).Text veya await ocr.ReadAsync(input) ile değiştirin
  11. Task.Run(() => { /* synchronous OCR */ }) 'yi doğrudan await ocr.ReadAsync(input) ile değiştirin
  12. api.GetMeanConfidence() 'yi result.Confidence ile değiştirin
  13. Bitmap çerçeve-iterasyon TIFF döngülerini input.LoadImageFrames(tiffPath) ile değiştirin
  14. api.SetVariable("tessedit_char_whitelist", x) 'yi ocr.Configuration.WhiteListCharacters = x ile değiştirin
  15. Projeden tessdata klasörünü silin, tüm dağıtım betiklerinden tessdata referanslarını kaldırın

Geçiş Sonrası

  • Projeyi net8.0 hedefleyerek derleyin ve derleme çıktısında Patagames referanslarının kalmadığını doğrulayın
  • Uygulamayı bir Linux ana bilgisayarında veya Linux Docker konteynerinde çalıştırın ve DllNotFoundException olmadığını doğrulayın
  • Üretim belgelerinin (10-20 belge) temsilci bir örneği üzerinde OCR metin çıktısının geçiş öncesi çıktı ile eşleşip eşleşmediğini doğrulayın
  • Çok sayfalı TIFF işleme test edin ve sayfa sayısının orijinal kare sayısı ile eşleştiğini onaylayın
  • ReadAsync() kullanarak ASP.NET Core uç noktalarında yük testleri çalıştırın ve iş parçacığı havuzu metriklerinin bloklamadığını doğrulayın
  • DI konteynerinin IronTesseract 'yi singleton olarak çözdüğünü doğrulayın (istekler arasında aynı örnek)
  • Şimdi tessdata kopya adımları kaldırıldığında CI/CD hattının hatasız tamamlandığını doğrulayın
  • Docker görüntü derlemesini ve bir Linux temel görüntüsü üzerinde konteyner çalıştırmasını test edin
  • Çok sayfalı bir belgede (PDF veya TIFF) ilerleme olaylarının düzgün bir şekilde tetiklendiğini doğrulayın
  • Bilinen iyi belgeler için güven skoru aralığının beklenen aralıkta olduğunu doğrulayın

IronOCR'a Geçişin Ana Faydaları

.NET yükseltme engeli ortadan kalktı. Geçiş öncesi, OCR katmanında durana kadar hizmeti .NET Framework 4.x'ten .NET 8'e taşımayı planlama. Geçiş sonrası, OCR hizmeti, aynı paket referansından .NET Framework 4.6.2, .NET 6,.NET 8ve.NET 9üzerinde derlenir ve çalışır. Yükseltme yolu engeli kaldırıldı. Sadece OCR için ayrı bir eski çalışma zamanı dağıtımını sürdüren ekipler, modern bir çalışma zamanı hedefine geçebilir.

Konteyner dağıtımı taviz verilmeden çalışır. Linux tabanlı görüntülerdeki DllNotFoundException ortadan kalkar. Aynı uygulama ikili dosyası, bir geliştiricinin Windows çalışma istasyonunda çalışır, Dockerfile'da tek bir apt-get satırı ile Debian veya Alpine konteynerinde çalışır. Kubernetes dağıtımları, Linux düğüm havuzlarında Azure Container Apps ve AWS ECS görevleri, Windows kapsayıcı lisanslaması, daha büyük görüntü boyutları veya mimariye bağlı kod yolları gerektirmez. Docker dağıtım kılavuzu ve Azure kılavuzu her hedef ortam için kesin yapılandırmayı belgelendirir.

Asenkron ilk hatlar, iş parçacığı havuzu baskısını ortadan kaldırır. Asenkron bir metoda sarılmış eşzamanlı OCR kullanan Task.Run çözümü, ReadAsync() ile değiştirilmiştir. ASP.NET Core talep iş parçacıkları, OCR işlemleri sırasında engellenmek yerine serbest bırakılır. Yüksek eşzamanlılık altında, bu doğrudan daha yüksek talep verimi ve sadece OCR uç noktaları için değil, tüm uygulama için daha düşük gecikmeye dönüşür.

Bellek tüketimi eşzamanlılıkla orantılı olarak düşer. Daha önce her eşzamanlı istek için bir OcrApi örneği oluşturan — her biri 40-100 MB dil verisi yükleyen — bir hizmet, artık bu veriyi bir kere bir singleton IronTesseract örneğine yükler. On eşzamanlı talepte, fark 400-1000 MB ile sabit bir load arasında. Bu azalma, konteyner kaynak metriklerinde hemen görülebilir ve daha küçük pod bellek limitleri, daha yüksek pod yoğunluğu ve daha düşük bulut altyapı maliyetine imkan tanır.

Modern C# desenleri .NET Framework törenini değiştirir. try/finally imha korumaları, iç içe geçmiş using blokları, TIFF çerçevelerindeki GC.Collect() çağrıları — bunların hepsi ortadan kalkar. using var input = new OcrInput(), tüm kaynak yönetim desenidir. Kod incelemeleri daha kısa. OCR hizmetine yeni geliştiricilerin katılması daha az zaman alır. OcrResult API referansı, yapılandırılmış veri, güven skoru ve legacy SDK'dan manuel sonuç işleme kalıplarının yerini alan aranabilir PDF çıktısı dahil olmak üzere tam sonuç nesne modelini belgelendirir.

Ticari destek, tek geliştirici bağımlılığının yerine geçer. Tesseract.NET SDK, hiçbir SLA ve kurumsal süreklilik garantisi olmayan bireysel bir geliştirici tarafından işletilir. IronOCR, kurumsal satın alma gereksinimlerini karşılayan lisanslama şartları ile ticari bir kuruluş olan Iron Software tarafından geliştirilmiştir. IronOCR lisans sayfası, destek katmanlarını ve hem Patagames SDK ücreti hem de modern bir .NET yığına üzerinde yalnızca Windows altyapısını sürdürmenin gizli maliyetini değiştiren süresiz lisans modelini ($999 'den) kapsar.

Lütfen dikkate alın: PDFium ve Tesseract, ilgili sahiplerinin tescilli markalarıdır. Bu site, Chromium Project veya Google ile ilişkilendirilmemiş, onaylanmamış veya desteklenmemiştir. Tüm ürün adları, logolar ve markalar kendi sahiplerine aittir. Karşılaştırmalar, yalnızca bilgilendirme amaçlıdır ve yazı sırasında halka açık bilgilerle alakalı olarak yansıtılmaktadır.
Curtis Chau
Teknik Yazar

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

...
Daha Fazla Oku

İlgili Makaleler

Key in blue circle

Ücretsiz 30 günlük Deneme Anahtarınızı anında edinin.

Your trial license will be sent to your email address

Herhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.

bullet_checkedKredi kartı veya hesap oluşturma gerektirmezHerhangi bir sınırlama yoktur. %100 erişim. Kredi kartı gerekmez.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Bağımsız Danışmanlık Alın
Aşağıdaki formu doldurun veya sales@ironsoftware.com adresine e-posta gönderin
Bilgileriniz daima gizli kalacaktır.
Dünya Çapında Milyonlarca Mühendisin Güvendiği
Iron Software müşteri logoları
Ücretsiz 30 Günlük Deneme Anahtarınızı anında alın.
Kredi kartı veya hesap oluşturma gerektirmez