Altbilgi içeriğine atla
VIDEOLAR

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

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
// 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
Imports System.Net.Http
Imports System.IO
Imports System.Text.Json
Imports System.Threading.Tasks

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

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

Dim json As String = Await response.Content.ReadAsStringAsync()
Dim parsed As KlippaResponse = JsonSerializer.Deserialize(Of KlippaResponse)(json) ' your schema, your maintenance
Dim text As String = parsed?.Data?.ParsedDocument?.Text ' nullable chain — breaks when schema changes
$vbLabelText   $csharpLabel

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;
// IronOCR: no HTTP, no auth headers, no JSON — just text
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
' IronOCR: no HTTP, no auth headers, no JSON — just text
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text = New IronTesseract().Read(imagePath).Text
$vbLabelText   $csharpLabel

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.

Özellik Klippa OCR IronOCR
Dağıtım modeli Yalnızca bulut (AB sunucuları) Yerel, tamamen yerel
.NET SDK / NuGet paketi None IronOcr NuGet paketi
İnternet gerekli Evet, her çağrıda Asla
Belge verileri ağdan ayrılıyor Her zaman Asla
Genel amaçlı OCR Hayır (yalnızca makbuzlar, faturalar, kimlikler) Evet (herhangi bir belge türü)
Kimlik doğrulama kurulumu X-Auth-Key HTTP başlığı IronOcr.License.LicenseKey dize
HTTP istemcisi gerekli Evet Hayır
Yanıt serileştirme Manuel JSON ayrıştırma Tiplenmiş OcrResult nesnesi
Yeniden deneme/zaman aşımı mantığı Elle yazılmış Gerekli değil (yerel arama)
Çevrimdışı / hava boşluğu desteği Hayır Evet
PDF girdisi Evet (bulut) Evet (yerel, yerel)
Çok sayfalı TIFF girişi Bilinmiyor Evet
Görüntü girdi formatları JPG, PNG (bulut) JPG, PNG, BMP, TIFF, GIF ve daha fazlası
Akış ve bayt dizisi girdisi SDK yok Evet
Otomatik görüntü ön işleme Bulut tarafı (opak) Evet (Deskew, DeNoise, Kontrast, Binarize, Keskinleştir)
Yapılandırılmış çıkış: kelime koordinatları Hayır Evet
Kelime başına güven puanları Hayır Evet
Aranabilir PDF çıktısı Hayır Evet
OCR sırasında barkod okuma Hayır Evet
Çok dilli destek Eğitilmiş belge türleriyle sınırlı 125+ dil
İş parçacığı güvenliği N/A (HTTP çağrıları) Evet (her iş parçacığı için bir IronTesseract)
Çapraz platform dağıtımı REST-agnostik Windows, Linux, macOS, Docker, Azure, AWS
HIPAA / ITAR / izole uyumluluk Hayır Evet
Fiyatlandırma modeli Belge başına SaaS (yayınlanmamış fiyatlar) $999'dan süresiz lisans
Ölçekte sayfa başı maliyet Evet, sınırsız None

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
# 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;
// 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;
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text.Json
Imports System.Text.Json.Serialization

Imports IronOcr
$vbLabelText   $csharpLabel

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";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

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();
}
// 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();
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Threading.Tasks
Imports System.Text.Json

' Klippa: entire service class just to send one HTTP request
Public Class KlippaOcrService
    Implements IDisposable

    Private ReadOnly _httpClient As HttpClient
    Private ReadOnly _baseUrl As String = "https://custom-ocr.klippa.com/api/v1"

    Public Sub New(apiKey As String)
        _httpClient = New HttpClient()
        _httpClient.DefaultRequestHeaders.Add("X-Auth-Key", apiKey)
        _httpClient.Timeout = TimeSpan.FromSeconds(30) ' network timeout required
    End Sub

    Public Async Function ReadDocumentTextAsync(filePath As String) As Task(Of String)
        Using form As New MultipartFormDataContent()
            Dim fileBytes = Await File.ReadAllBytesAsync(filePath)
            form.Add(New ByteArrayContent(fileBytes), "document", Path.GetFileName(filePath))

            Dim response = Await _httpClient.PostAsync($"{_baseUrl}/parseDocument", form)
            response.EnsureSuccessStatusCode()

            Dim json = Await response.Content.ReadAsStringAsync()
            Using doc = JsonDocument.Parse(json)
                ' navigate Klippa's nested JSON schema
                Return doc.RootElement _
                    .GetProperty("data") _
                    .GetProperty("parsed_document") _
                    .GetProperty("text") _
                    .GetString() OrElse String.Empty
            End Using
        End Using
    End Function

    Public Sub Dispose() Implements IDisposable.Dispose
        _httpClient.Dispose()
    End Sub
End Class
$vbLabelText   $csharpLabel

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
// 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
Imports IronOcr

Public Class OcrService
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ReadDocumentText(filePath As String) As String
        Return _ocr.Read(filePath).Text
    End Function
End Class

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

' Usage — identical call site, different internals:
Dim service As New OcrService()
Dim text As String = service.ReadDocumentText("invoice.jpg") ' local, synchronous, zero network
$vbLabelText   $csharpLabel

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 });
}
// 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 });
}
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports System.Threading.Tasks

Public Class KlippaUploader
    Private ReadOnly _httpClient As HttpClient

    Public Sub New(httpClient As HttpClient)
        _httpClient = httpClient
    End Sub

    Public Async Function UploadAndParseAsync(filePath As String, Optional documentType As String = "financial") As Task(Of KlippaResult)
        Using form As New MultipartFormDataContent()
            ' read file into memory — entire document in RAM before upload
            Dim fileBytes = Await File.ReadAllBytesAsync(filePath)
            Dim 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
            Dim response = Await _httpClient.PostAsync("https://custom-ocr.klippa.com/api/v1/parseDocument", form)

            If Not response.IsSuccessStatusCode Then
                Dim error = Await response.Content.ReadAsStringAsync()
                Throw New InvalidOperationException($"Klippa API error: {response.StatusCode} — {error}")
            End If

            Dim json = Await response.Content.ReadAsStringAsync()
            Return JsonSerializer.Deserialize(Of KlippaResult)(json, New JsonSerializerOptions With {.PropertyNameCaseInsensitive = True})
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

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);
// 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);
Imports IronOcr
Imports System.IO

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

' From file path
Using input As New OcrInput()
    input.LoadImage("invoice.jpg")
    Dim result = New IronTesseract().Read(input)

    ' From byte array (same bytes Klippa was uploading)
    Dim fileBytes As Byte() = Await File.ReadAllBytesAsync("invoice.jpg")
    Using inputFromBytes As New OcrInput()
        inputFromBytes.LoadImage(fileBytes)
        Dim resultFromBytes = New IronTesseract().Read(inputFromBytes)

        Console.WriteLine(result.Text)
    End Using
End Using
$vbLabelText   $csharpLabel

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;
}
// 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;
}
Imports System.Text.Json.Serialization

' Klippa: deserialization model — breaks when API schema changes
Public Class KlippaResponse
    <JsonPropertyName("data")>
    Public Property Data As KlippaData
End Class

Public Class KlippaData
    <JsonPropertyName("parsed_document")>
    Public Property ParsedDocument As KlippaParsedDocument
End Class

Public Class KlippaParsedDocument
    <JsonPropertyName("text")>
    Public Property Text As String

    <JsonPropertyName("amount")>
    Public Property Amount As Decimal?

    <JsonPropertyName("merchant")>
    Public Property Merchant As String

    <JsonPropertyName("date")>
    Public Property Date As String
End Class

' Usage: navigate the nullable chain every time
Public Async Function GetExtractedTextAsync(imagePath As String) As Task(Of String)
    Dim klippaResult = Await UploadAndParseAsync(imagePath)
    ' every property access is nullable — schema drift breaks this silently
    Return If(klippaResult?.Data?.ParsedDocument?.Text, String.Empty)
End Function
$vbLabelText   $csharpLabel

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}");
    }
}
// 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}");
    }
}
Imports IronOcr

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

Dim ocr As New IronTesseract()
Dim result = ocr.Read("invoice.jpg")

' Direct property access — no deserialization, no nullable navigation
Dim fullText As String = result.Text
Dim confidence As Double = result.Confidence
Dim pageCount As Integer = result.Pages.Count()

' Structured data: lines and words with coordinates
For Each page In result.Pages
    For Each line In page.Lines
        Console.WriteLine($"Line: '{line.Text}' at Y={line.Y}")
    Next
Next
$vbLabelText   $csharpLabel

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");
}
// 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");
}
Imports System
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports System.Threading
Imports System.Threading.Tasks

Public Class KlippaService
    Private ReadOnly _httpClient As HttpClient

    Public Sub New(httpClient As HttpClient)
        _httpClient = httpClient
    End Sub

    ' Klippa: retry policy required — cloud calls fail unpredictably
    Public Async Function ReadWithRetryAsync(filePath As String, Optional maxRetries As Integer = 3) As Task(Of String)
        Dim delay As TimeSpan = TimeSpan.FromSeconds(1)

        For attempt As Integer = 1 To maxRetries
            Try
                Using form As New MultipartFormDataContent()
                    form.Add(New ByteArrayContent(Await File.ReadAllBytesAsync(filePath)), "document", Path.GetFileName(filePath))

                    Using cts As New CancellationTokenSource(TimeSpan.FromSeconds(30))
                        Dim response As HttpResponseMessage = Await _httpClient.PostAsync("https://custom-ocr.klippa.com/api/v1/parseDocument", form, cts.Token)

                        If response.StatusCode = System.Net.HttpStatusCode.TooManyRequests Then
                            ' rate limited — back off and retry
                            Await Task.Delay(delay * attempt)
                            Continue For
                        End If

                        response.EnsureSuccessStatusCode()
                        Dim json As String = Await response.Content.ReadAsStringAsync(cts.Token)
                        Dim parsed As KlippaResponse = JsonSerializer.Deserialize(Of KlippaResponse)(json)
                        Return If(parsed?.Data?.ParsedDocument?.Text, String.Empty)
                    End Using
                End Using
            Catch ex As HttpRequestException When attempt < maxRetries
                Await Task.Delay(delay * attempt) ' exponential backoff
            Catch ex As TaskCanceledException When attempt < maxRetries
                Await Task.Delay(delay * attempt) ' timeout — retry
            End Try
        Next

        Throw New InvalidOperationException($"Klippa API failed after {maxRetries} attempts")
    End Function
End Class

Public Class KlippaResponse
    Public Property Data As KlippaData
End Class

Public Class KlippaData
    Public Property ParsedDocument As ParsedDocument
End Class

Public Class ParsedDocument
    Public Property Text As String
End Class
$vbLabelText   $csharpLabel

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;
}
// 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;
}
Imports IronOcr

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

Public Function ReadDocument(filePath As String) As String
    ' No retry loop. No CancellationTokenSource. No HTTP status checks.
    ' No rate limit handling. No partial-JSON guards.
    Dim result = New IronTesseract().Read(filePath)
    Return result.Text
End Function
$vbLabelText   $csharpLabel

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;
}
// 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;
}
Imports System.IO
Imports System.Net.Http
Imports System.Text.Json
Imports System.Threading.Tasks

Public Class PdfExtractor
    Private ReadOnly _httpClient As HttpClient

    Public Sub New(httpClient As HttpClient)
        _httpClient = httpClient
    End Sub

    ' Klippa: PDF upload — entire document transmitted, results depend on cloud availability
    Public Async Function ExtractPdfPagesAsync(pdfPath As String) As Task(Of List(Of String))
        Dim pages As New List(Of String)()

        ' Klippa parses the entire PDF server-side and returns combined results
        ' You cannot control per-page processing or access raw page text
        Using form As New MultipartFormDataContent()
            form.Add(New ByteArrayContent(Await File.ReadAllBytesAsync(pdfPath)), "document", Path.GetFileName(pdfPath))

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

            Dim json = Await response.Content.ReadAsStringAsync()
            Dim result = JsonSerializer.Deserialize(Of KlippaResponse)(json)
            ' Klippa returns the combined parsed text — no per-page breakdown in basic API
            pages.Add(If(result?.Data?.ParsedDocument?.Text, String.Empty))
        End Using

        Return pages
    End Function
End Class

Public Class KlippaResponse
    Public Property Data As KlippaData
End Class

Public Class KlippaData
    Public Property ParsedDocument As ParsedDocument
End Class

Public Class ParsedDocument
    Public Property Text As String
End Class
$vbLabelText   $csharpLabel

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");
// 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");
Imports IronOcr

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

Using input As New OcrInput()
    input.LoadPdf("multi-page-invoice.pdf") ' reads locally — no HTTP

    Dim ocr As New IronTesseract()
    Dim result = ocr.Read(input)

    ' Per-page access — not available from Klippa's combined response
    For Each page In result.Pages
        Console.WriteLine($"Page {page.PageNumber}: {page.Lines.Count()} lines")
        Console.WriteLine(page.Text)
    Next

    ' Or produce a searchable PDF from the scanned original
    result.SaveAsSearchablePdf("searchable-output.pdf")
End Using
$vbLabelText   $csharpLabel

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
MultipartFormDataContent OcrInput.LoadImage(path) veya OcrInput.LoadPdf(path)
POST /api/v1/parseDocument IronTesseract.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.Text OcrResult.Text
KlippaResponse.Data.ParsedDocument.Amount OcrResult.Text veya OcrResult.Lines üzerinde özel regex
KlippaResponse.Data.ParsedDocument.Merchant OcrResult.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ına Yerel 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ği IronOcr.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;
}
// 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;
}
Imports System.Threading
Imports System.Threading.Tasks

Public Class DocumentProcessor
    Public Async Function ProcessDocumentAsync(filePath As String, Optional cancellationToken As CancellationToken = Nothing) As Task(Of String)
        Dim ocr As New IronTesseract()
        Dim result = Await ocr.ReadAsync(filePath)
        Return result.Text
    End Function
End Class
$vbLabelText   $csharpLabel

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;
}
// 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;
}
Imports Microsoft.Extensions.DependencyInjection

' In Program.vb or Startup.vb
builder.Services.AddSingleton(Of IronTesseract)()

' Or wrap for interface compatibility
builder.Services.AddSingleton(Of IOcrService, IronOcrService)()

Public Class IronOcrService
    Implements IOcrService

    Private ReadOnly _ocr As IronTesseract

    Public Sub New(ocr As IronTesseract)
        _ocr = ocr
    End Sub

    Public Function ReadDocument(path As String) As String Implements IOcrService.ReadDocument
        Return _ocr.Read(path).Text
    End Function
End Class
$vbLabelText   $csharpLabel

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();
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();
Imports IronOcr

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

' Target specific layout regions instead of relying on pre-parsed cloud fields
Dim totalRegion As New CropRectangle(350, 580, 250, 50) ' bottom-right total area
Dim merchantRegion As New CropRectangle(50, 30, 400, 60) ' top header area

Using merchantInput As New OcrInput()
    merchantInput.LoadImage("receipt.jpg", merchantRegion)
    Dim merchantName As String = New IronTesseract().Read(merchantInput).Text.Trim()
End Using

Using totalInput As New OcrInput()
    totalInput.LoadImage("receipt.jpg", totalRegion)
    Dim totalText As String = New IronTesseract().Read(totalInput).Text.Trim()
End Using
$vbLabelText   $csharpLabel

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;
}
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;
}
Imports System.IO
Imports System.Threading.Tasks
Imports IronOcr

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

Public Async Function ProcessDocumentStreamAsync(documentStream As Stream) As Task(Of String)
    Using input As New OcrInput()
        input.LoadImage(documentStream) ' accepts Stream directly

        Dim ocr As New IronTesseract()
        Dim result = ocr.Read(input)
        Return result.Text
    End Using
End Function
$vbLabelText   $csharpLabel

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);
}
[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);
}
<Fact>
Public Sub ReadDocument_ReturnsExpectedText()
    IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
    Dim ocr = New IronTesseract()

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

    Assert.Contains("Invoice", result.Text, StringComparison.OrdinalIgnoreCase)
    Assert.True(result.Confidence > 70)
End Sub
$vbLabelText   $csharpLabel

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}%");
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}%");
Imports IronOcr

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

Using input As 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

    Dim result = New IronTesseract().Read(input)
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
$vbLabelText   $csharpLabel

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" .
# 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ınKlippa 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.

Sıkça Sorulan Sorular

Klippa OCR API'dan IronOCR'ye neden geçmeliyim?

Yaygın geçiş nedenleri arasında COM ara bağlamının karmaşıklığını ortadan kaldırmak, dosya tabanlı lisans yönetimini değiştirmek, sayfa başına fatura düzenlemekten kaçınmak, Docker/kapsayıcı dağıtımını etkinleştirmek ve standart .NET araçlarıyla entegre olan bir NuGet doğal iş akışı benimsemek yer almaktadır.

Klippa OCR API'dan IronOCR'ye geçişteki ana kod değişiklikleri nelerdir?

Klippa başlangıç dizilerini IronTesseract örneği ile değiştirin, COM yaşam döngüsü yönetimini (açık Create/Load/Close desenleri) kaldırın ve sonuç özellik adlarını güncelleyin. Sonuç, önemli ölçüde daha az boilerplate satırıdır.

Geçişi başlatmak için IronOCR'u nasıl kurarım?

Paket Yöneticisi Konsolunda 'Install-Package IronOcr' veya CLI'da 'dotnet add package IronOcr' çalıştırın. Dil paketleri ayrı paketlerdir: Örneğin, Fransızca için 'dotnet add package IronOcr.Languages.French'.

IronOCR, Klippa OCR API'nin standart iş belgeleri için OCR doğruluğunu karşılıyor mu?

IronOCR, faturalar, sözleşmeler, makbuzlar ve yazılı formlar dahil olmak üzere standart işletme içerikleri için yüksek doğruluğa ulaşır. Görüntü ön işleme filtreleri (dengelemeyi düzeltme, gürültü kaldırma, kontrast artırma) bozulmuş girdiler üzerindeki tanımayı daha da iyileştirir.

IronOCR, Klippa OCR API'nin ayrı kurduğu dil verilerini nasıl yönetiyor?

IronOCR'daki dil verileri, NuGet paketleri olarak dağıtılır. 'dotnet add package IronOcr.Languages.German' komutuyla Almanca desteği yüklenir. Herhangi bir manuel dosya yerleştirme veya dizin yolu gerekmez.

Klippa OCR API'dan IronOCR'ye geçiş, dağıtım altyapısında değişiklik gerektiriyor mu?

IronOCR, Klippa OCR API'dan daha az altyapı değişikliği gerektirir. SDK ikili yolları, lisans dosyası yerleşimleri veya lisans sunucu yapılandırmaları yoktur. NuGet paketi, tam OCR motorunu içerir ve lisans anahtarı uygulama kodunda belirlenmiş bir dizgedir.

Geçişten sonra IronOCR lisanslamasını nasıl yapılandırırım?

Uygulama başlangıç ​​kodunda IronOcr.License.LicenseKey = "SİZİN-ANAHTARINIZ" atayın. Docker veya Kubernetes'te, anahtarı bir ortam değişkeni olarak saklayın ve başlangıçta okuyun. Trafiği kabul etmeden önce doğrulamak için License.IsValidLicense kullanın.

IronOCR, PDF'leri Klippa gibi işleyebilir mi?

Evet. IronOCR hem yerel hem de taranmış PDF'leri okur. Bir PDF yolu veya OcrPdfInput olan girdiye ocr.Read(input) çağrısı yapmak için IronTesseract örneği çağırın ve OcrResult sayfalarını yineleyin. Ayrı bir PDF işleme hattı gerekmez.

IronOCR, yüksek hacim işleme sırasında iş parçacığı nasıl ele alır?

IronTesseract, iş parçacığı başına örnek olacak şekilde güvenlidir. Paralel.ForEach veya Görev havuzunda her iş parçacığı için bir örnek oluşturun, OCR'u eşzamanlı olarak çalıştırın ve her örneği iş tamamlandığında bırakın. Küresel durum veya kilitleme gerekmez.

IronOCR metin çıktıktan sonra hangi çıktıları destekler?

IronOCR, metin, kelime koordinatları, güven skorları ve sayfa yapısını içeren yapılandırılmış sonuçlar döndürür. Dışa aktarma seçenekleri düz metin, aranabilir PDF ve aşağı akış işlemesi için yapılandırılmış sonuç nesneleri içerir.

IronOCR'ın fiyatlandırması, ölçeklendirme iş yükleri için Klippa OCR API'dan daha öngörülebilir mi?

IronOCR, sayfa başına veya hacim ücretlendirmesi olmadan düz oranlı sürekli lisanslama kullanır. 10.000 veya 10 milyon sayfa işleseniz de lisans maliyeti sabit kalır. Hacim ve ekip lisanslama seçenekleri IronOCR fiyatlandırma sayfasındadır.

Klippa OCR API'dan IronOCR'ye geçtikten sonra mevcut testlerime ne olacak?

Çıkarılmış metin içeriğini doğrulayan testler, geçişten sonra çalışmaya devam etmelidir. API çağrı şablonlarını veya COM nesne yaşam döngüsünü doğrulayan testler, IronOCR'un daha basit başlatma ve sonuç modelini yansıtacak şekilde güncellenmelidir.

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ı...

Daha Fazla Oku

Iron Destek Ekibi

Haftada 5 gün, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara