IRONSOFTWAREHOME
VIDEOLAR

C#'da Açık Kaynak Kütüphaneler Kullanarak OCR Uygulaması Nasıl Yapılır?

Curtis Chau
Curtis Chau
Updated: 1 Ağustos 2026

Bu kılavuz, Klippa'nın REST API'sini entegre etmiş ve yerel belge işleme için IronOCR'ye geçiş yapan .NET geliştiricileri içindir. HTTP istemci altyapısını kaldırmanın, JSON serileştirmeyi ortadan kaldırmanın ve buluta bağımlı belge yüklemeleri yerine ağı asla dokunmayan yerel OCR çağrılarını değiştirmenin pratik adımlarını kapsar.

Klippa OCR'den Neden Geçiş Yapmalısınız

Klippa, .NET SDK'sı olmayan yalnızca bulut tabanlı bir belge zekası hizmetidir. Her entegrasyon, el ile oluşturulmuş bir REST istemcisidir. Bu mimari gerçeklik, bir üretim sisteminin ömrü boyunca bileşik sonuçlar doğurur.

NuGet Paketi Olmadığında Entegrasyon Katmanı Size Aittir. Kurulacak bir şey yoktur. Giriş maliyeti, HttpClient sarmalayıcısı yazmak, X-Auth-Key kimlik doğrulama başlıklarını yapılandırmak, MultipartFormDataContent istek gövdelerini oluşturmak, Klippa'nın JSON yanıt şemasını ayrıştırmak ve geçici hatalar için yeniden deneme mantığını kurmak ile ilgilidir. İlk belge üretimde güvenilir bir şekilde işlenmeden önce bu 2-4 gün tesisat gerektirir. Klippa API şemasını güncellediğinde, serileştirme kodunuz bozulur ve manuel bakım gerektirir.

Her Belge Yüklemesi Bir Ağ Bağımlılığıdır. Klippa, belgeleri yalnızca AB barındırılan sunucularında işler. Klippa tarafında üretim kesintileri, artan gecikme süresi veya uygulama sunucunuzdan giden internet erişimindeki herhangi bir kesinti, belge işlemesini tamamen durdurur. GCS gereksinimi, yerel mod yoktur ve bulut hizmetinin kullanım dışı olmasını çözmek için bir tekrar deneme yoktur.

Hassas Belgeler Altyapınızı Terk Ediyor. Finansal belgeler — ödeme detayları içeren makbuzlar, KDV numaraları ve tutarları içeren faturalar, pasaport verileri içeren kimlik belgeleri — her API çağrısında üçüncü taraf sunucuya iletilir. GDPR'ın veri aktarım hükümleri, bunun bir kısmını AB tabanlı işleme için karşılar, ancak denetim kapsamı yine de Klippa'nın altyapısını, veri saklama politikalarını ve alt işleyicileri kapsar. Sağlık, hukuk, finansal hizmetler veya devlet sözleşmeleri ile çalışan ekipler için "AB barındırılan" kurumdan verilerin ayrılmaması gerekliliğini karşılamaz.

Belge Başına Fiyatlandırma Tavan Olmadan Ölçeklenir. Klippa, fiyatlarını yayımlamaz. Belirgin bir belge hacminde — bir gider yönetim sisteminde ayda 10.000 makbuz, bir AP otomasyon iş akışında günde 500 fatura — belge başına faturalama modeli, asla yapılmayacak olan bir süresiz lisans maliyet birikir. Yapım maliyet eğrisi, işletme büyümesine doğrudan bağlıdır, bu da altyapı harcaması için olması gerekenin tersidir.

Uzmanlık Kapsamı Gereksinimler Genişlediğinde Bozulur. Klippa, makbuzlar, faturalar ve kimlik belgeleri üzerine eğitilmiştir. Gider yönetimi olarak başlayan bir uygulama nadiren orada kalır. Bu üç kategori dışında bir belge türü — taranan iş sözleşmesi, tıbbi form, teknik çizim, standart olmayan düzen makbuz dahil olmak üzere — ortaya çıktığında, Klippa hiçbir şey sağlamaz. IronOCR, metin içeren herhangi bir belgeyi, kategori kısıtlamaları olmadan işler.

Yalnızca Asenkron REST Çağrıları Senkron Bağlamlarda Gecikme Ekler. Her Klippa çağrısı asenkron bir HTTP işlemidir. Tek bir belge turu 500ms ile 2000ms arasında ağ üzerinden sürer. IronOCR, aynı belgeyi yerel olarak 100-400ms içinde işleme tabi tutar ve senkron işlemenin daha iyi uyan bir mimariye sığdığı senaryolarda asenkron yükü yoktur.

Temel Sorun

Klippa'nın SDK yok. OCR, bir HTTP isteği oluşturmayı ve göndermeyi ve ardından JSON'ı deserialization etmeyi ifade eder:

// Klippa: 15+ lines of HTTP plumbing before you read a single character
var content = new MultipartFormDataContent();
content.Add(new ByteArrayContent(File.ReadAllBytes(imagePath)), "document", "receipt.jpg");
_client.DefaultRequestHeaders.Add("X-Auth-Key", _apiKey); // auth header — rotates, breaks, leaks

var response = await _client.PostAsync(
    "https://custom-ocr.klippa.com/api/v1/parseDocument", content);
response.EnsureSuccessStatusCode(); // throws on 4xx/5xx — no retry, document lost

var json = await response.Content.ReadAsStringAsync();
var parsed = JsonSerializer.Deserialize<KlippaResponse>(json); // your schema, your maintenance
var text = parsed?.Data?.ParsedDocument?.Text; // nullable chain — breaks when schema changes
C#

IronOCR tümünü değiştirir:

// IronOCR: no HTTP, no auth headers, no JSON — just text
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
C#

IronOCR veKlippa OCRKarşılaştırması

Aşağıdaki tablo, üretim göç kararında en önemli olan boyutlarda iki kütüphaneyi karşılaştırır.

ÖzellikKlippa OCRIronOCR
Dağıtım modeliYalnızca bulut (AB sunucuları)Yerel, tamamen yerel
.NET SDK / NuGet paketiNoneIronOcr NuGet paketi
İnternet gerekliEvet, her çağrıdaAsla
Belge verileri ağdan ayrılıyorHer zamanAsla
Genel amaçlı OCRHayır (yalnızca makbuzlar, faturalar, kimlikler)Evet (herhangi bir belge türü)
Kimlik doğrulama kurulumuX-Auth-Key HTTP başlığıIronOcr.License.LicenseKey dize
HTTP istemcisi gerekliEvetHayır
Yanıt serileştirmeManuel JSON ayrıştırmaTiplenmiş OcrResult nesnesi
Yeniden deneme/zaman aşımı mantığıElle yazılmışGerekli değil (yerel arama)
Çevrimdışı / hava boşluğu desteğiHayırEvet
PDF girdisiEvet (bulut)Evet (yerel, yerel)
Çok sayfalı TIFF girişiBilinmiyorEvet
Görüntü girdi formatlarıJPG, PNG (bulut)JPG, PNG, BMP, TIFF, GIF ve daha fazlası
Akış ve bayt dizisi girdisiSDK yokEvet
Otomatik görüntü ön işlemeBulut tarafı (opak)Evet (Deskew, DeNoise, Kontrast, Binarize, Keskinleştir)
Yapılandırılmış çıkış: kelime koordinatlarıHayırEvet
Kelime başına güven puanlarıHayırEvet
Aranabilir PDF çıktısıHayırEvet
OCR sırasında barkod okumaHayırEvet
Çok dilli destekEğitilmiş belge türleriyle sınırlı125+ dil
İş parçacığı güvenliğiN/A (HTTP çağrıları)Evet (her iş parçacığı için bir IronTesseract)
Çapraz platform dağıtımıREST-agnostikWindows, Linux, macOS, Docker, Azure, AWS
HIPAA / ITAR / izole uyumlulukHayırEvet
Fiyatlandırma modeliBelge başına SaaS (yayınlanmamış fiyatlar)$999'dan süresiz lisans
Ölçekte sayfa başı maliyetEvet, sınırsızNone

Hızlı Başlangıç: Klippa OCR'dan IronOCR'a Geçiş

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

Klippa'nın resmi bir NuGet paketi yok. Yalnızca Klippa entegrasyonunu desteklemek için var olan HTTP istemci bağımlılıklarını kaldırın:

# Remove Klippa-related packages (if installed for REST support)
dotnet remove package Newtonsoft.Json
dotnet remove package System.Net.Http.Json
SHELL

NuGet kullanarak IronOCR'u yükleyin:

dotnet add package IronOcr

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

Klippa entegrasyonunun gerektirdiği HTTP ve JSON ad alanlarını kaldırın. Tek bir IronOCR ad alanı ekleyin:

// Before (Klippa integration)
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text.Json;
using System.Text.Json.Serialization;

// After (IronOCR)
using IronOcr;
C#

Adım 3: Lisansa İzin Verin

Lisans başlatmasını uygulamanın başlangıcında bir kez ekleyin - Program.cs, Startup.cs içinde veya ilk OCR çağrısından önce:

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

Kod Göç Örnekleri

HTTP İstemci Hizmeti Sınıfını Değiştirme

Klippa entegrasyonu, HTTP altyapısını saran tam bir hizmet sınıfı gerektirir. Bunu önlemenin bir yolu yok çünkü bir SDK yok.

Klippa Yaklaşımı:

// Klippa: entire service class just to send one HTTP request
public class KlippaOcrService : IDisposable
{
    private readonly HttpClient _httpClient;
    private readonly string _baseUrl = "https://custom-ocr.klippa.com/api/v1";

    public KlippaOcrService(string apiKey)
    {
        _httpClient = new HttpClient();
        _httpClient.DefaultRequestHeaders.Add("X-Auth-Key", apiKey);
        _httpClient.Timeout = TimeSpan.FromSeconds(30); // network timeout required
    }

    public async Task<string> ReadDocumentTextAsync(string filePath)
    {
        using var form = new MultipartFormDataContent();
        var fileBytes = await File.ReadAllBytesAsync(filePath);
        form.Add(new ByteArrayContent(fileBytes), "document", Path.GetFileName(filePath));

        var response = await _httpClient.PostAsync($"{_baseUrl}/parseDocument", form);
        response.EnsureSuccessStatusCode();

        var json = await response.Content.ReadAsStringAsync();
        using var doc = JsonDocument.Parse(json);
        // navigate Klippa's nested JSON schema
        return doc.RootElement
            .GetProperty("data")
            .GetProperty("parsed_document")
            .GetProperty("text")
            .GetString() ?? string.Empty;
    }

    public void Dispose() => _httpClient.Dispose();
}
C#

IronOCR Yaklaşımı:

// IronOCR: no HTTP, no JSON navigation, no Dispose plumbing
public class OcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ReadDocumentText(string filePath)
    {
        return _ocr.Read(filePath).Text;
    }
}

// At startup:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// Usage — identical call site, different internals:
var service = new OcrService();
var text = service.ReadDocumentText("invoice.jpg"); // local, synchronous, zero network
C#

Klippa hizmet sınıfı tamamen API'nin HTTP altyapısını gerektirdiği için vardır.IronOCR eşdeğeri, tek bir Read() çağrısına indirgenir. Zaman aşımları, kimlik doğrulama başlıkları ve imha modelleri tamamen ortadan kalkar çünkü ağ yoktur. IronTesseract kurulum kılavuzu başlatma seçeneklerini ve temel OCR örneğini çalıştıran kodla görün.

Multipart Form Yüklemesini Ortadan Kaldırma

Klippa, belgeleri multipart form yüklemeleri olarak alır. Yükleme kodu mekaniktir ama kırılgandır: dosya okuma, içerik türü başlıkları, sınır oluşturma ve yükleme boyutu yönetimi.

Klippa Yaklaşımı:

// Klippa: multipart upload — every document is an HTTP form POST
public async Task<KlippaResult> UploadAndParseAsync(
    string filePath, string documentType = "financial")
{
    using var form = new MultipartFormDataContent();

    // read file into memory — entire document in RAM before upload
    var fileBytes = await File.ReadAllBytesAsync(filePath);
    var byteContent = new ByteArrayContent(fileBytes);
    byteContent.Headers.ContentType =
        new System.Net.Http.Headers.MediaTypeHeaderValue("image/jpeg");

    form.Add(byteContent, "document", Path.GetFileName(filePath));
    form.Add(new StringContent(documentType), "DocumentType");

    // document leaves your server here
    var response = await _httpClient.PostAsync(
        "https://custom-ocr.klippa.com/api/v1/parseDocument", form);

    if (!response.IsSuccessStatusCode)
    {
        var error = await response.Content.ReadAsStringAsync();
        throw new InvalidOperationException($"Klippa API error: {response.StatusCode}{error}");
    }

    var json = await response.Content.ReadAsStringAsync();
    return JsonSerializer.Deserialize<KlippaResult>(json,
        new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
}
C#

IronOCR Yaklaşımı:

// IronOCR: load from file path, byte array, or stream — no upload, no form
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// From file path
using var input = new OcrInput();
input.LoadImage("invoice.jpg");
var result = new IronTesseract().Read(input);

// From byte array (same bytes Klippa was uploading)
byte[] fileBytes = await File.ReadAllBytesAsync("invoice.jpg");
using var inputFromBytes = new OcrInput();
inputFromBytes.LoadImage(fileBytes);
var resultFromBytes = new IronTesseract().Read(inputFromBytes);

Console.WriteLine(result.Text);
C#

MultipartFormDataContent yapısı, içerik türü başlıkları ve yüklemenin kendisi tamamen kaldırılmıştır. IronOCR, dosya yolundan, bir byte dizisinden veya Stream'dan doğrudan okur — Klippa'nın buluta aktardığı aynı veri yerel kalır. görsel girişi kılavuzu desteklenen tüm giriş formatlarını kapsar ve akış girişi kılavuzu yukarı akış işlemlerinden bayt dizileri olarak gelen belgeler için hafıza akışı yolunu kapsar.

JSON Yanıt Deserializasyonunu Değiştirme

Klippa, iç içe geçmiş bir JSON yapısı döndürür. Bu yapıya ulaşmak, ya uygun bir C# modeli ya da çevrimiçi JsonDocument ile gezinti gerektirir — her ikisi de Klippa yanıt şemasını değiştirdiğinde bozulur.

Klippa Yaklaşımı:

// Klippa: deserialization model — breaks when API schema changes
public class KlippaResponse
{
    [JsonPropertyName("data")]
    public KlippaData Data { get; set; }
}

public class KlippaData
{
    [JsonPropertyName("parsed_document")]
    public KlippaParsedDocument ParsedDocument { get; set; }
}

public class KlippaParsedDocument
{
    [JsonPropertyName("text")]
    public string Text { get; set; }

    [JsonPropertyName("amount")]
    public decimal? Amount { get; set; }

    [JsonPropertyName("merchant")]
    public string Merchant { get; set; }

    [JsonPropertyName("date")]
    public string Date { get; set; }
}

// Usage: navigate the nullable chain every time
public async Task<string> GetExtractedTextAsync(string imagePath)
{
    var klippaResult = await UploadAndParseAsync(imagePath);
    // every property access is nullable — schema drift breaks this silently
    return klippaResult?.Data?.ParsedDocument?.Text ?? string.Empty;
}
C#

IronOCR Yaklaşımı:

// IronOCR: typed result object — no JSON schema, no nullable chains
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var ocr = new IronTesseract();
var result = ocr.Read("invoice.jpg");

// Direct property access — no deserialization, no nullable navigation
string fullText   = result.Text;
double confidence = result.Confidence;
int pageCount     = result.Pages.Count();

// Structured data: lines and words with coordinates
foreach (var page in result.Pages)
{
    foreach (var line in page.Lines)
    {
        Console.WriteLine($"Line: '{line.Text}' at Y={line.Y}");
    }
}
C#

OcrResult bir tiplenmiş .NET nesnesidir. Pars edilecek JSON, sürdürülecek model sınıfı ve şema sapması üretim deserializasyonunu bozma riski yoktur. Okuma sonuçları kılavuzu, kelime koordinatları, güven puanları ve yapılandırılmış sayfa hiyerarşisi dahil olmak üzere tam OcrResult nesne modelini belgeler. OcrResult üzerine kurulu fatura-özel alan çıkarma kalıpları için fatura OCR eğitimi uçtan uca çıkarma mantığını kapsar.

Hata İşleme ve Tekrar İnfrastructur'unu Kaldırma

Klippa entegrasyonu, HTTP üzerinden bir ağ çağrısının üretebileceği her hata modu için hata işleme gerektirir: zaman aşımı, 4xx yanıtları, 5xx yanıtları, oran limitleri ve kısmen JSON. Üretim entegrasyonlarını yürüten ekipler, Polly veya özel mantık kullanarak tekrar politikaları ekler. Ağ çağrısı ortadan kalktığında bu altyapı da ortadan kalkar.

Klippa Yaklaşımı:

// Klippa: retry policy required — cloud calls fail unpredictably
public async Task<string> ReadWithRetryAsync(string filePath, int maxRetries = 3)
{
    var delay = TimeSpan.FromSeconds(1);

    for (int attempt = 1; attempt <= maxRetries; attempt++)
    {
        try
        {
            using var form = new MultipartFormDataContent();
            form.Add(
                new ByteArrayContent(await File.ReadAllBytesAsync(filePath)),
                "document",
                Path.GetFileName(filePath));

            using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(30));
            var response = await _httpClient.PostAsync(
                "https://custom-ocr.klippa.com/api/v1/parseDocument", form, cts.Token);

            if (response.StatusCode == System.Net.HttpStatusCode.TooManyRequests)
            {
                // rate limited — back off and retry
                await Task.Delay(delay * attempt);
                continue;
            }

            response.EnsureSuccessStatusCode();
            var json = await response.Content.ReadAsStringAsync(cts.Token);
            var parsed = JsonSerializer.Deserialize<KlippaResponse>(json);
            return parsed?.Data?.ParsedDocument?.Text ?? string.Empty;
        }
        catch (HttpRequestException) when (attempt < maxRetries)
        {
            await Task.Delay(delay * attempt); // exponential backoff
        }
        catch (TaskCanceledException) when (attempt < maxRetries)
        {
            await Task.Delay(delay * attempt); // timeout — retry
        }
    }

    throw new InvalidOperationException($"Klippa API failed after {maxRetries} attempts");
}
C#

IronOCR Yaklaşımı:

// IronOCR: no network, no retry policy needed — local call either works or throws once
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

public string ReadDocument(string filePath)
{
    // No retry loop. No CancellationTokenSource. No HTTP status checks.
    // No rate limit handling. No partial-JSON guards.
    var result = new IronTesseract().Read(filePath);
    return result.Text;
}
C#

Tüm yeniden deneme altyapısı — döngü, gecikme hesaplaması, CancellationTokenSource, HTTP durum kodu dallanması, TaskCanceledException catch bloğu — tamamen ağ nedeniyle vardır. Ağ çağrısını kaldırın ve hepsi ortadan kalkar. Yerel OCR çağrısı, giriş dosyası eksik veya okunamıyorsa hızlı bir şekilde türlenmiş bir istisna ile başarısız olur; aksi takdirde başarılı olur. hız optimizasyonu kılavuzu taahhüt önemli bir konuysa IronOCR performans ayarlamasını kapsar.

Buluta Yükleme Yapmadan Çok Sayfalı PDF'leri İşleme

Klippa, aynı parseDocument uç noktası aracılığıyla PDF yüklemelerini kabul eder. Çok sayfalı PDF'ler hala ağınızı terk eder. IronOCR, PDF'leri işleme içinde, sayfa bazında sonuç erişimiyle yerel olarak okur.

Klippa Yaklaşımı:

// Klippa: PDF upload — entire document transmitted, results depend on cloud availability
public async Task<List<string>> ExtractPdfPagesAsync(string pdfPath)
{
    var pages = new List<string>();

    // Klippa parses the entire PDF server-side and returns combined results
    // You cannot control per-page processing or access raw page text
    using var form = new MultipartFormDataContent();
    form.Add(
        new ByteArrayContent(await File.ReadAllBytesAsync(pdfPath)),
        "document",
        Path.GetFileName(pdfPath));

    var response = await _httpClient.PostAsync(
        "https://custom-ocr.klippa.com/api/v1/parseDocument", form);
    response.EnsureSuccessStatusCode();

    var json = await response.Content.ReadAsStringAsync();
    var result = JsonSerializer.Deserialize<KlippaResponse>(json);
    // Klippa returns the combined parsed text — no per-page breakdown in basic API
    pages.Add(result?.Data?.ParsedDocument?.Text ?? string.Empty);

    return pages;
}
C#

IronOCR Yaklaşımı:

// IronOCR: native PDF OCR with per-page structured access — no upload
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

using var input = new OcrInput();
input.LoadPdf("multi-page-invoice.pdf"); // reads locally — no HTTP

var ocr = new IronTesseract();
var result = ocr.Read(input);

// Per-page access — not available from Klippa's combined response
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Lines.Count()} lines");
    Console.WriteLine(page.Text);
}

// Or produce a searchable PDF from the scanned original
result.SaveAsSearchablePdf("searchable-output.pdf");
C#

IronOCR, PDF dosyalarını yerel olarak, herhangi bir dönüştürme adımı olmadan okur. Her sayfa, tüm satır, kelime ve karakter hiyerarşisiyle bireysel olarak erişilebilir. SaveAsSearchablePdf() çağrısı, taranmış bir belgeden metin katmanlı bir PDF üretir — Klippa'nın sunmadığı bir yetenek. PDF girişi kılavuzu yükleme seçeneklerini ve arama yapılabilir PDF kılavuzu PDF/A dahil arşiv uygunluğu için çıktı seçeneklerini kapsar.

Klippa OCRAPI'den IronOCR'a Haritalama Referansı

Klippa, bir REST API'dir, türlenmiş bir SDK değildir. Aşağıdaki eşleme, Klippa'nın entegrasyon yüzeyini IronOCR eşdeğerlerine çevirir.

Klippa KavramıIronOCR Karşılığı
HttpClient ile X-Auth-Key başlığıIronTesseract örneği — kimlik doğrulama ayarı yok
MultipartFormDataContentOcrInput.LoadImage(path) veya OcrInput.LoadPdf(path)
POST /api/v1/parseDocumentIronTesseract.Read(input)
await _client.PostAsync(...)ocr.Read(input) — senkronize, await gerekmez
response.EnsureSuccessStatusCode()Gerekli değil — HTTP yanıtı yok
JsonSerializer.Deserialize<KlippaResponse>(json)Tiplenmiş OcrResult — ayrıştırma yok
KlippaResponse.Data.ParsedDocument.TextOcrResult.Text
KlippaResponse.Data.ParsedDocument.AmountOcrResult.Text veya OcrResult.Lines üzerinde özel regex
KlippaResponse.Data.ParsedDocument.MerchantOcrResult.Pages[0].Lines[0].Text
Task.Delay ile yeniden deneme döngüsüGerekli değil — ağ arızası modu yok
CancellationTokenSource(TimeSpan.FromSeconds(30))Gerekli değil — yerel yürütme
Oran sınırı işleme (HTTP 429)Gerekli değil — oran limitleri yok
Bulut belge yönlendirmesi AB sunucularınaYerel işlem içinde yürütme
KlippaService.Dispose() / HttpClient.Dispose()OcrInput aracılığıyla using bildirimi ile bertaraf
Yapılandırılmış JSON yanıt alanlarıOcrResult.Text + OcrResult.Pages + OcrResult.Words
SaaS API aboneliğiIronOcr.License.LicenseKey dizesi — süresiz

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

Sorun 1: HTTP Kaldırıldıktan Sonra Yalnızca Eşzamansız Çağrı Noktaları

Klippa: Klippa entegrasyonunun her biri, HTTP çağrıları bunu gerektirdiği için eşzamansızdır. Yazı tabanınızda bulunan denetleyiciler, servisler ve arka plan işçileri await ProcessDocumentAsync(...) çağırır. HTTP çağrısının kaldırılması, await artık gerekmediği anlamına gelir, ancak async yöntem imzaları kalır.

**Çözüm:**IronOCR hem senkron hem de asenkron API'ler sağlar. Asenkron kalması gereken çağrı yerleri için (ASP.NET Core denetleyicileri, CancellationToken'lu arka plan hizmetleri), ReadAsync kullanın:

// Keep async method signatures — switch the implementation
public async Task<string> ProcessDocumentAsync(
    string filePath, CancellationToken cancellationToken = default)
{
    // Previously: await _httpClient.PostAsync(...)
    // Now: local call, same awaitable pattern
    var ocr = new IronTesseract();
    var result = await ocr.ReadAsync(filePath);
    return result.Text;
}
C#

asenkron OCR kılavuzu, ASP.NET Core ve barındırılan hizmet desenleri için ReadAsync ve CancellationToken entegrasyonunu kapsar.

Sorun 2: Bağımlılık Enjeksiyon Kayıt

Klippa: KlippaService sınıfı, DI içinde bir singleton veya kapsamlı servis olarak kaydedilir ve HttpClient'yi sarar. Onu kaldırmak, DI kaydını ve tüm enjeksiyon noktalarını güncellemeyi gerektirir.

Çözüm: IronTesseract'yi bir singleton olarak kaydedin (iş parçacığına güvenlidir) ve doğrudan enjekte edin, veya mevcut servis arayüzünüzü yansıtan ince bir sarmalayıcı oluşturun:

// In Program.cs or Startup.cs
builder.Services.AddSingleton<IronTesseract>();

// Or wrap for interface compatibility
builder.Services.AddSingleton<IOcrService, IronOcrService>();

public class IronOcrService : IOcrService
{
    private readonly IronTesseract _ocr;
    public IronOcrService(IronTesseract ocr) => _ocr = ocr;

    public string ReadDocument(string path) => _ocr.Read(path).Text;
}
C#

Bir IronTesseract örneği, iki paralel isteği yönetmek için singleton olarak kaydedilir. Her Read() çağrısı iş parçacığına güvenlidir.

Sorun 3: Daha Önceden Ayrıştırılmış JSON Olmadan Yapılandırılmış Alan Çıkarma

Klippa: Klippa, amount, merchant, date ve vat_amount'yı tiplenmiş JSON özellikleri olarak döner. IronOCR'a geçiş, bu alanların artık önceden ayrıştırılmış olarak gelmeyeceği anlamına gelir.

Çözüm: IronOCR'ın OcrResult'ı, eşdeğer çıkarım oluşturmak için ham metin ve kelime düzeyinde koordinatlar sağlar. Öngörülebilir düzenleri olan belgeler için, bölge tabanlı OCR belirli alanları doğrudan hedefler:

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

// Target specific layout regions instead of relying on pre-parsed cloud fields
var totalRegion   = new CropRectangle(350, 580, 250, 50); // bottom-right total area
var merchantRegion = new CropRectangle(50, 30, 400, 60);  // top header area

using var merchantInput = new OcrInput();
merchantInput.LoadImage("receipt.jpg", merchantRegion);
var merchantName = new IronTesseract().Read(merchantInput).Text.Trim();

using var totalInput = new OcrInput();
totalInput.LoadImage("receipt.jpg", totalRegion);
var totalText = new IronTesseract().Read(totalInput).Text.Trim();
C#

Bölge tabanlı OCR kılavuzu, CropRectangle kullanımını ayrıntılı olarak kapsar. Fiş ve fatura düzenleri genelinde tam çıkarma desenleri için, fiş tarama öğreticisi eksiksiz çalışma kodunu sağlar.

Sorun 4: Yukarı Akış Hizmetlerinden Gelen Akışlar Olarak Gelen Belgeler

Klippa: Klippa belgeleri, multipart form yüklemeleri olarak alır — HTTP form içeriğine sarmalanmış dosya baytları. Uygulamanız belgeleri S3, Azure Blob Storage veya dahili API'lerden akışlar olarak alıyorsa, akışı baytlara okuyordu ve ardından bu baytları Klippa'ya yüklüyordunuz.

**Çözüm:**IronOCR doğrudan Stream nesnelerini kabul eder. Bayt dönüştürme adımı ortadan kalkar:

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

// Stream from S3, Azure Blob, or any upstream source
public async Task<string> ProcessDocumentStreamAsync(Stream documentStream)
{
    using var input = new OcrInput();
    input.LoadImage(documentStream); // accepts Stream directly

    var ocr = new IronTesseract();
    var result = ocr.Read(input);
    return result.Text;
}
C#

Veri yok, MultipartFormDataContent yapımı yok, HTTP POST yok. Akış doğrudan OcrInput'ya gider. akış girişi kılavuzu akış türlerini ve imha etme modellerini kapsar.

Sorun 5: HTTP Mocking'e Bağlı Entegrasyon Testleri

Klippa: Klippa kodu için entegrasyon testleri, HttpClient'yi taklit eder veya API yanıtlarını simüle etmek için HTTP engelleyicileri (örn. WireMock, MockHttp) kullanır. Bu testler HTTP katmanını değil, OCR mantığını mock etmektedir.

**Çözüm:**IronOCR testleri, bilinen beklenen çıktısı olan gerçek belgeler kullanır. Mocking altyapısına gerek yok. Testler çevrimdışında çalışır:

[Fact]
public void ReadDocument_ReturnsExpectedText()
{
    IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
    var ocr = new IronTesseract();

    // Use a real test fixture — no HTTP mocking, runs fully offline
    var result = ocr.Read("test-fixtures/sample-invoice.jpg");

    Assert.Contains("Invoice", result.Text, StringComparison.OrdinalIgnoreCase);
    Assert.True(result.Confidence > 70);
}
C#

Daha önce canlı bir Klippa bağlantısı veya karmaşık bir HTTP mock kurulumunu gerektiren testler, ağ erişimi olmadan CI'de çalışır.

Sorun 6: Klippa'nın Sunucu Tarafında İyileştirdiği Düşük Kaliteli Belgeler

Klippa: Tanıma öncesi bulut işleme görüntü iyileştirmeleri uygular. Geliştiriciler bunu asla yapılandırmaz — bu, Klippa'nın sunucularında otomatik olarak gerçekleşir. Geçiş sırasında, Klippa'nın sessizce işlediği belgeler, IronOCR'da açık ön işleme olmaksızın daha düşük doğruluk oranları üretebilir.

Çözüm: IronOCR'ın ön işleme filtrelerini açıkça uygulayın. Filtre seti, bulut hizmetlerinin sunucu tarafında uyguladığı şeylerle aynıdır:

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

using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");
input.Deskew();    // fix rotation from camera or scanner
input.DeNoise();   // remove compression noise
input.Contrast();  // boost faded ink
input.Binarize();  // clean background for clearer character edges

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
C#

görüntü kalitesi düzeltme kılavuzu her türlü belge bozunması için uygulanacak tüm ön işleme filtrelerini ve sıralarını kapsar.

Klippa OCRGeçiş Kontrol Listesi

Öncesi-Geçiş

Kod tabanınızı hiçbir şeyi kaldırmadan önce Klippa'ya özgü tüm kodları bulmak için denetleyin:

# Find all files containing Klippa HTTP integration code
grep -r "X-Auth-Key" --include="*.cs" .
grep -r "klippa.com" --include="*.cs" .
grep -r "KlippaService\|KlippaResponse\|KlippaResult\|KlippaData" --include="*.cs" .

# Find all files with MultipartFormDataContent (likely Klippa upload code)
grep -r "MultipartFormDataContent" --include="*.cs" .

# Find all JSON deserialization models that map to Klippa response fields
grep -r "parsed_document\|vat_amount\|merchant\|X-Auth-Key" --include="*.cs" .

# Find all async methods that wrap Klippa calls
grep -r "ParseDocumentAsync\|ProcessReceiptAsync\|UploadAndParseAsync" --include="*.cs" .

# Find test files with HTTP mocks for Klippa
grep -r "MockHttp\|WireMock\|klippa" --include="*.cs" .
SHELL

Envanter notları:

  • Klippa çağrıları için HttpClient'yi saran her sınıfı kaydedin
  • Tüm JSON ayrıştırma model sınıflarını listeleyin (KlippaResponse, KlippaParsedDocument vb.)
  • Klippa'nın önceden ayrıştırılmış JSON özelliklerini tüketen tüm alan eşlemelerini belgeleyin
  • Klippa için oluşturulmuş herhangi bir Polly tekrar politikası veya özel tekrar döngülerini not alın

Kod Geçişi

  1. IronOcr NuGet paketini kurun (dotnet add package IronOcr)
  2. Uygulama başlangıcına IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY" ekleyin
  3. Klippa servis dosyalarından System.Net.Http, System.Text.Json, Newtonsoft.Json ithalatlarını kaldırın
  4. KlippaService sınıfını silin (veya gövdesini IronTesseract çağrılarıyla değiştirerek arayüzü koruyun)
  5. IronTesseract'yi DI konteynerinde singleton olarak kaydedin
  6. MultipartFormDataContent yükleme bloklarını OcrInput.LoadImage() veya OcrInput.LoadPdf() ile değiştirin
  7. JSON yanıt model sınıflarını silin (KlippaResponse, KlippaData, KlippaParsedDocument)
  8. Nullable JSON gezinme zincirlerini (.Data?.ParsedDocument?.Text) result.Text ile değiştirin
  9. Klippa çağrı noktalarından yeniden deneme döngülerini ve CancellationTokenSource zaman aşımını kaldırın
  10. Oran sınırı işleme (HTTP 429 catch blokları) kaldırın
  11. await ProcessDocumentAsync(...)'yi await ocr.ReadAsync(...) veya senkronize ocr.Read(...) ile değiştirin
  12. Düşük kaliteli belge girdileri için OcrInput ön işleme filtrelerini (Deskew, DeNoise, Contrast) ekleyin
  13. HTTP mock test altyapısını gerçek belge donanım testi ile değiştirin
  14. Klippa'ya özel Polly tekrar politikalarını veya özel tekrar aracılarını silin

Geçiş Sonrası

  • Metin çıkarma çıktısının bilinen test belgelerinden beklenen içerikle eşleştiğini doğrulayın
  • Üretim belge türleri için güven puanlarının kabul edilebilir eşik değerini (genellikle %70+) aştığını doğrulayın
  • Test PDF girişi: çok sayfalı PDF'leri yerinde yükleyin ve result.Pages üzerinden sayfa bazında metin erişimini doğrulayın
  • Akış girişini test et: MemoryStream aktarın ve OcrInput.LoadImage(stream) doğru çıktıyı üretip üretmediğini doğrulayın
  • Ön işleme filtrelerinin işlenmemiş temel çizgiye kıyasla düşük kaliteli taramalar üzerindeki doğruluğu artırdığını doğrulayın
  • DI ile enjekte edilmiş IronTesseract singleton'ın iki eşzamanlı isteği çekişme olmadan yönettiğini doğrulayın
  • Entegrasyon testlerini çevrimdışı çalıştırın (ağ bağlantısı yok) — tüm testler bulut erişimi olmadan geçmelidir
  • Tarama belge akışları için result.SaveAsSearchablePdf("output.pdf") ile aranabilir PDF çıktısını doğrulayın
  • ReadAsync'ın ASP.NET Core denetleyici bağlamında CancellationToken yayılımı ile çalıştığını test edin
  • using var input = new OcrInput() bertaraf modelinin sürekli yük altında bellek sızdırmadığını doğrulayın

IronOCR'a Geçişin Ana Faydaları

Bağımsızlık Günü'nüz Bugün'den İtibaren. Geçişten sonra, hassas finansal belgeler, kimlik taramaları ve gizli faturalar asla altyapınızı terk etmez. Denetim kapsamı içinde üçüncü taraf işleyici yok, gözden geçirilecek veri saklama politikası yok ve sürdürülecek veri aktarım anlaşması yok. Önceden Klippa'yı sorunlu hale getiren HIPAA, ITAR, CMMC ve FedRAMP kısıtlamaları varsayılan olarak karşılanır. Docker, AWS veya Azure üzerine dağıtım, her şeyi kendi altyapı sınırınızın içinde tutar.

Altyapı Karmaşıklığı Ortadan Kaldırıldı. Hizmet sınıfı, HTTP istemcisi, form yükleme kodu, JSON modelleri, tekrar politikası, zaman aşımı yapılandırması — hepsi bir ağ çağrısını sarmak için vardı. Ağ çağrısını kaldırın ve hepsi birlikte gider. Sonuçtaki kod tabanı daha küçük, okunması daha kolay ve daha az hata modu barındırır. DI üzerinden enjekte edilen tek bir IronTesseract örneği, tüm HTTP entegrasyon katmanının yerini alır.

Hacimden Bağımsız Tahmin Edilebilir Maliyet. $999 (Lite), 1.499 $ (Professional) veya 2.999 $ (Enterprise) süresiz IronOCR lisansı, sınırsız belge işlemeyi kapsar. Aylık 500 belge işleyin ya da aylık 500.000 belge işleyin, maliyet aynı. Klippa'yı ölçeklendirmede pahalı yapan belge başına faturalandırma dinamiği yapısal olarak yoktur. IronOCR lisanslama sayfası tüm seviyeleri ve her birinin ne içerdiğini detaylandırır.

Sınır Tanımayan Belge Kapsamı. IronOCR, metin içeren her tür belgeyi işler. Taralayan sözleşmeler, teknik çizimler, tıbbi formlar, satın alma siparişleri, el yazısı notlar, ekran görüntüleri, TIFF arşivleri — hepsi aynı Read() çağrısı ve aynı API ile yönetilir. Klippa'nın eğitilmiş kategorilerinin dışındaki belgeler için ikinci bir sistem gerektiren uzmanlık kapsamı kısıtlaması gider. Bir kütüphane, bir entegrasyon noktası, her tür belge.

Artık Desteklenen Çevrimdışı ve Kısıtlı Ağ Ortamları. Banka ağları, hükümet sistemleri, uç ortamlar veya giden çıkışın kısıtlandığı herhangi bir altyapıya dağıtılan uygulamalar açık ortamlarda olduğu gibi çalışır. Bir bulut uca sağlık ping'i veya internet mevcut olmadığında bozulan mod yok, hiçbir bağlantı kontrolü yok. Hava boşluğu dağıtımları ayar olmaksızın çalışır. Linux dağıtım kılavuzu ve Docker dağıtım kılavuzu, bu ortamlar için konteynerleştirilmiş ve sunucu tarafı dağıtım yollarını kapsar.

Görüntü İyileştirme Üzerinde Tam Kontrol. Bulut ön işlemi kara kutuydu — Klippa bunu uygulardı, sonuçları gözlemlerdiniz, ayarlayacak parametreleriniz yoktu. IronOCR'nın ön işleme hattı net ve birleştirilebilir: Deskew(), DeNoise(), Contrast(), Binarize(), Sharpen(), Scale(), Dilate(), DeepCleanBackgroundNoise(). Her filtre isteğe bağlı ve sıralıdır. Doğruluk iyileştirmeleri ölçülebilir, yeniden üretilebilir ve sizin kontrolünüz altındadır. görüntü kalitesi düzeltme kılavuzu ve ön işleme özellikleri sayfası tüm filtre kataloğunu ve her birinin uygulanması gerektiği zamanı kapsar.

Lütfen dikkate alın: Klippa ve Tesseract, ilgili sahiplerinin tescilli markalarıdır. Bu site, Google veya Klippa ile münasebet halinde değildir, onaylanmamıştır veya desteklenmemektedir. 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