Altbilgi içeriğine atla
DIğER BILEşENLERLE KARşıLAşTıRıN

IronOCR ile Nanonets OCR Arasında Bir Karşılaştırma

AWS Textract'ın sayfa başı fiyatlandırma modeli düşük hacimde ucuz gibi görünebilir, ancak ölçekte maliyetler sonsuz şekilde birikir. Uygulamanızın işlediği her belge ağınızı terk eder, Amazon veri merkezine gider, Amazon altyapısı tarafından işlenir ve fatura sonsuz şekilde birikir. .NET'te OCR seçeneklerini değerlendiren ekipler için soru sadece Textract'ın doğru sonuçlar üretip üretmediği - evet öyle - değil, aynı zamanda sayfa başına maliyet modeli, zorunlu bulut aktarımı ve eşzamanlı olmayan çok sayfalı belgeler için çalışan mimari, uygulamanızın gerçekten ihtiyaç duyduğu şeyle eşleşip eşleşmediğidir.

AWS Textract'ı Anlamak

AWS Textract, Amazon'un yönetilen doküman analiz hizmetidir ve .NET için AWS SDK aracılığıyla AWSSDK.Textract NuGet paketi üzerinden erişilebilir. Ağınıza doğrudan bir bulut API olarak çalışır: belgelerinizin verilerini Amazon'un altyapısına gönderir ve yapılandırılmış sonuçlar alır. Hizmet, her tek OCR işlemi için bir AWS hesabı, Textract izinleri olan IAM kimlik bilgileri ve bir internet bağlantısı gerektirir.

Textract, her biri ayrı fiyatlandırılan birkaç farklı analiz modunu açığa çıkarır:

  • DetectDocumentText: Temel metin çıkarımı (geçerli sayfa başı ücretler için AWS Textract fiyatlandırması'na bakın)
  • AnalyzeDocument (Tablolar): Yapılandırılmış tablo çıkarımı, temel metinden daha yüksek bir sayfa başı ücrete tabidir
  • AnalyzeDocument (Formlar): Anahtar-değer form çıkarımı, tablo çıkarımından daha yüksek bir sayfa başı ücrete tabidir
  • AnalyzeExpense: Faturalar ve makbuzları ayırma sayfa başına 0,01 $
  • AnalyzeID: Kimlik belgesi çıkarımı sayfa başına 0,025 $
  • StartDocumentTextDetection / StartDocumentAnalysis: Herhangi bir çok sayfalı PDF için gerekli eşzamanlı olmayan API, bir S3 bekletme kovası, iş anketi ve sonuç sayfalaması zorunlu kılar

Sonuç modeli, tablolara, formlara veya herhangi bir yapılandırılmış çıktıyı yeniden inşa etmek için dolaşılması gereken ilişki kimliklerine sahip düz bir Block nesneler listesi kullanır. Basit bir tablo çıkarımı, BlockType.TABLE bloklarının yinelemelerini, ardından BlockType.CELL bloklarının RelationshipType.CHILD ilişki kimlikleri aracılığıyla bulunmasını ve her hücrenin metni için BlockType.WORD bloklarının getirilmesini gerektirir. Bu ilişki grafiği modeli, karmaşık belge yapılarını ele alır, ancak hafif değildir.

S3-Asenkron Boru Hattı

Tek görüntü OCR, DetectDocumentTextAsync aracılığıyla belge baytlarını doğrudan istek içinde geçirebilir. Çok sayfalı PDF'ler ise bunu yapamaz. Herhangi bir PDF, tam asenkron boru hattını gerektirir:

// AWS Textract:Çok sayfalı PDFrequires S3 + async job
public async Task<string> ProcessPdfAsync(string pdfPath)
{
    // Step 1: Upload to S3 — credentials for two services required
    var key = $"uploads/{Guid.NewGuid()}.pdf";
    using (var fileStream = File.OpenRead(pdfPath))
    {
        await _s3Client.PutObjectAsync(new PutObjectRequest
        {
            BucketName = _bucketName,
            Key = key,
            InputStream = fileStream
        });
    }

    try
    {
        // Step 2: Start async Textract job
        var startResponse = await _textractClient.StartDocumentTextDetectionAsync(
            new StartDocumentTextDetectionRequest
            {
                DocumentLocation = new DocumentLocation
                {
                    S3Object = new S3Object { Bucket = _bucketName, Name = key }
                }
            });

        var jobId = startResponse.JobId;

        // Step 3: Poll every 5 seconds until complete
        GetDocumentTextDetectionResponse getResponse;
        do
        {
            await Task.Delay(5000);
            getResponse = await _textractClient.GetDocumentTextDetectionAsync(
                new GetDocumentTextDetectionRequest { JobId = jobId });
        } while (getResponse.JobStatus == JobStatus.IN_PROGRESS);

        if (getResponse.JobStatus != JobStatus.SUCCEEDED)
            throw new Exception($"Textract job failed: {getResponse.StatusMessage}");

        // Step 4: Paginate through result blocks
        var allText = new StringBuilder();
        string nextToken = null;
        do
        {
            var pageResponse = await _textractClient.GetDocumentTextDetectionAsync(
                new GetDocumentTextDetectionRequest
                {
                    JobId = jobId,
                    NextToken = nextToken
                });

            foreach (var block in pageResponse.Blocks.Where(b => b.BlockType == BlockType.LINE))
                allText.AppendLine(block.Text);

            nextToken = pageResponse.NextToken;
        } while (nextToken != null);

        return allText.ToString();
    }
    finally
    {
        // Step 5:Her zamanclean up S3
        await _s3Client.DeleteObjectAsync(_bucketName, key);
    }
}
// AWS Textract:Çok sayfalı PDFrequires S3 + async job
public async Task<string> ProcessPdfAsync(string pdfPath)
{
    // Step 1: Upload to S3 — credentials for two services required
    var key = $"uploads/{Guid.NewGuid()}.pdf";
    using (var fileStream = File.OpenRead(pdfPath))
    {
        await _s3Client.PutObjectAsync(new PutObjectRequest
        {
            BucketName = _bucketName,
            Key = key,
            InputStream = fileStream
        });
    }

    try
    {
        // Step 2: Start async Textract job
        var startResponse = await _textractClient.StartDocumentTextDetectionAsync(
            new StartDocumentTextDetectionRequest
            {
                DocumentLocation = new DocumentLocation
                {
                    S3Object = new S3Object { Bucket = _bucketName, Name = key }
                }
            });

        var jobId = startResponse.JobId;

        // Step 3: Poll every 5 seconds until complete
        GetDocumentTextDetectionResponse getResponse;
        do
        {
            await Task.Delay(5000);
            getResponse = await _textractClient.GetDocumentTextDetectionAsync(
                new GetDocumentTextDetectionRequest { JobId = jobId });
        } while (getResponse.JobStatus == JobStatus.IN_PROGRESS);

        if (getResponse.JobStatus != JobStatus.SUCCEEDED)
            throw new Exception($"Textract job failed: {getResponse.StatusMessage}");

        // Step 4: Paginate through result blocks
        var allText = new StringBuilder();
        string nextToken = null;
        do
        {
            var pageResponse = await _textractClient.GetDocumentTextDetectionAsync(
                new GetDocumentTextDetectionRequest
                {
                    JobId = jobId,
                    NextToken = nextToken
                });

            foreach (var block in pageResponse.Blocks.Where(b => b.BlockType == BlockType.LINE))
                allText.AppendLine(block.Text);

            nextToken = pageResponse.NextToken;
        } while (nextToken != null);

        return allText.ToString();
    }
    finally
    {
        // Step 5:Her zamanclean up S3
        await _s3Client.DeleteObjectAsync(_bucketName, key);
    }
}
Imports System
Imports System.IO
Imports System.Text
Imports System.Threading.Tasks
Imports Amazon.S3
Imports Amazon.Textract
Imports Amazon.Textract.Model

Public Class PdfProcessor
    Private _s3Client As IAmazonS3
    Private _textractClient As IAmazonTextract
    Private _bucketName As String

    Public Async Function ProcessPdfAsync(pdfPath As String) As Task(Of String)
        ' Step 1: Upload to S3 — credentials for two services required
        Dim key = $"uploads/{Guid.NewGuid()}.pdf"
        Using fileStream = File.OpenRead(pdfPath)
            Await _s3Client.PutObjectAsync(New PutObjectRequest With {
                .BucketName = _bucketName,
                .Key = key,
                .InputStream = fileStream
            })
        End Using

        Try
            ' Step 2: Start async Textract job
            Dim startResponse = Await _textractClient.StartDocumentTextDetectionAsync(
                New StartDocumentTextDetectionRequest With {
                    .DocumentLocation = New DocumentLocation With {
                        .S3Object = New S3Object With {.Bucket = _bucketName, .Name = key}
                    }
                })

            Dim jobId = startResponse.JobId

            ' Step 3: Poll every 5 seconds until complete
            Dim getResponse As GetDocumentTextDetectionResponse
            Do
                Await Task.Delay(5000)
                getResponse = Await _textractClient.GetDocumentTextDetectionAsync(
                    New GetDocumentTextDetectionRequest With {.JobId = jobId})
            Loop While getResponse.JobStatus = JobStatus.IN_PROGRESS

            If getResponse.JobStatus <> JobStatus.SUCCEEDED Then
                Throw New Exception($"Textract job failed: {getResponse.StatusMessage}")
            End If

            ' Step 4: Paginate through result blocks
            Dim allText = New StringBuilder()
            Dim nextToken As String = Nothing
            Do
                Dim pageResponse = Await _textractClient.GetDocumentTextDetectionAsync(
                    New GetDocumentTextDetectionRequest With {
                        .JobId = jobId,
                        .NextToken = nextToken
                    })

                For Each block In pageResponse.Blocks.Where(Function(b) b.BlockType = BlockType.LINE)
                    allText.AppendLine(block.Text)
                Next

                nextToken = pageResponse.NextToken
            Loop While nextToken IsNot Nothing

            Return allText.ToString()
        Finally
            ' Step 5: Always clean up S3
            Await _s3Client.DeleteObjectAsync(_bucketName, key)
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Bu, güvenilir PDF işleme için minimum uygulanabilir uygulamadır — beş farklı aşama, iki AWS hizmet istemcisi ve bir finally blokunda temizlik mantığı. Uygun hata işleme, oran sınırı tekrar deneme mantığı ve zaman aşımı yönetimi ile tamamlanmış üretim sürümü 150-300 satır çalışır.

IronOCR'u Anlamak

IronOCR, tamamen kendi altyapınızda çalışan ticari bir .NET OCR kütüphanesidir. Optimizasyonlu bir Tesseract 5 motorunu otomatik görüntü ön işleme ile saran, yerel PDF desteği ve sonuçları doğrudan üreten eşzamanlı bir API'yi, dış hizmet çağrıları veya aşamalı adımlar olmadan saran bir yapıttır.

IronOCR mimarisinin anahtar özellikleri:

  • Yalnızca yerel iş: Uygulamanızı çalıştıran makineyi terk eden belge verisi yok
  • Tek NuGet paketi: dotnet add package IronOcr, yerel ikili dosyalar dahil her şeyi yükler
  • Otomatik ön işleme: Kötü kaliteli girişlerde otomatik olarak deskew, denoise, kontrast artırımı, binarizasyon ve çözünürlük ölçekleme gerçekleşir
  • Yerel PDF desteği: S3 aşama kovası veya eşzamanlı olmayan işler olmadan dosya yolu veya akış üzerinden doğrudan PDF'ler okur
  • Thread-safe (İletişim Güvenliği): Tek bir IronTesseract örneği, iletişim hatları arasında eşzamanlı istekleri çekişme olmadan işler
  • Süresiz lisanslama: $999 Lite / $1,499 Plus / $2,999 Professional / $5,999 Unlimited — tek ödeme, sayfa başına ücret yok, kullanım metreme yok
  • 125+ dil paketi: Ayrı NuGet paketleri olarak yüklenir, yerel olarak yüklenir, ağ çağrısı yok

Özellik Karşılaştırması

Özellik AWS Textract IronOCR
İşleme yeri Amazon bulutu (zorunlu) Yerel / yerinde
Çok sayfalı PDF S3 + eşzamanlı iş gerektirir Doğrudan eşzamanlı çağrı
Maliyet modeli Sayfa başına (güncel fiyatlar için AWS ile iletişime geçin) Süresiz lisans, sayfa başı ücret yok
İnternet gerekli mi Her zaman Asla
Kimlik bilgisi ayarı IAM kullanıcı/rol + isteğe bağlı S3 Tek lisans anahtarı dizesi
İzole konuşlandırma Mümkün değil Tam destekli
Şifreli PDF desteği Desteklenmiyor Dahili (şifre parametresi)

Ayrıntılı Özellik Karşılaştırması

Özellik AWS Textract IronOCR
Metin Çıkarımı
Temel OCR (görüntüler) Evet — DetectDocumentTextAsync Evet — ocr.Read(path)
Çok sayfalı PDF S3 + eşzamanlı anket gerektirir Doğrudan input.LoadPdf(path)
Şifre korumalı PDF Desteklenmiyor input.LoadPdf(path, Password: "x")
Akış girişi Evet (istekte bayt dizisi) Evet — input.LoadImage(stream)
Yapılandırılmış Çıkarma
Tablo çıkartma AnalyzeDocument + blok grafik geçişi Kelime pozisyonu bazlı yeniden yapılandırma
Form alanı çıkarımı AnalyzeDocument + ANAHTAR_DEĞER_SET blokları Bölge bazlı CropRectangle bölgeleri
Satır seviyesinde sonuçlar Block, BlockType.LINE ile filtreleme result.Lines doğrudan toplama
Koordinatlarla kelime seviyesi Block, BlockType.WORD ile filtreleme result.Words, .X, .Y, .Width ile birlikte
Güven skoru Blok başına güven Kelime başına ve genel result.Confidence
İşleme Modeli
Eşzamanlı (görüntüler) Evet (yalnızca tek sayfa) Evet (tüm belge türleri)
Eşzamansız PDF'ler için gereklidir İsteğe bağlı — Task.Run() sarıcı
Toplu işlem Oran limiti yönetimi gerektirir (5 TPS varsayılan) Sınırsız Parallel.ForEach
Ön işlem
Otomatik eğme Açığa çıkarılmamış input.Deskew()
Gürültü giderme Dahili (yapılandırılabilir değil) input.DeNoise()
Kontrast artırma Dahili (yapılandırılabilir değil) input.Contrast()
Çözünürlük iyileştirmesi Dahili (yapılandırılabilir değil) input.EnhanceResolution(300)
Binarizasyon Dahili input.Binarize()
Çıktı Formatları
Düz metin Evet Evet
Aranabilir PDF Hayır result.SaveAsSearchablePdf(path)
hOCR Hayır result.SaveAsHocrFile(path)
Yapılandırılmış JSON Blok serileştirme yoluyla result.Words / result.Lines
Dağıtım
Yerinde Hayır Evet
İzole Hayır Evet
Docker Evet (AWS kimlik bilgileri enjekte edilmiş) Evet (kimlik bilgileri gerekmiyor)
AWS Lambda Yerel Desteklenen
Azure Evet Evet
Linux Evet (AWS yönetiminde) Evet — get-started/linux/
Uyumluluk
HIPAA AWS ile BAA gerektirir Harici işlemci yok
GDPR Veri AWS bölgelerine geçiyor Veri sınır içinde kalıyor
ITAR Özel yetki olmadan yasaklanmış Tamamen yerinde
İzole / CMMC Seviye 3 Mümkün değil Desteklenen

Masraf Ölçeklendirme

Sayfa başı fiyatlandırma modeli, AWS Textract'ın belirleyici yapısal sınırlılığıdır. Sayfa başına küçük görünen maliyetler, gerçek bir belge iş akışında önemli ölçüde birikir.

AWS Textract Yaklaşımı

// Every call to this method costs money — per page, permanently
public async Task<string> DetectTextAsync(string imagePath)
{
    var imageBytes = File.ReadAllBytes(imagePath);  // Image leaves your network

    var request = new DetectDocumentTextRequest
    {
        Document = new Document
        {
            Bytes = new MemoryStream(imageBytes)
        }
    };

    var response = await _client.DetectDocumentTextAsync(request);  // per-page charge

    return string.Join("\n", response.Blocks
        .Where(b => b.BlockType == BlockType.LINE)
        .Select(b => b.Text));
}
// Every call to this method costs money — per page, permanently
public async Task<string> DetectTextAsync(string imagePath)
{
    var imageBytes = File.ReadAllBytes(imagePath);  // Image leaves your network

    var request = new DetectDocumentTextRequest
    {
        Document = new Document
        {
            Bytes = new MemoryStream(imageBytes)
        }
    };

    var response = await _client.DetectDocumentTextAsync(request);  // per-page charge

    return string.Join("\n", response.Blocks
        .Where(b => b.BlockType == BlockType.LINE)
        .Select(b => b.Text));
}
Imports System.IO
Imports System.Threading.Tasks

' Every call to this method costs money — per page, permanently
Public Async Function DetectTextAsync(imagePath As String) As Task(Of String)
    Dim imageBytes = File.ReadAllBytes(imagePath)  ' Image leaves your network

    Dim request = New DetectDocumentTextRequest With {
        .Document = New Document With {
            .Bytes = New MemoryStream(imageBytes)
        }
    }

    Dim response = Await _client.DetectDocumentTextAsync(request)  ' per-page charge

    Return String.Join(vbLf, response.Blocks _
        .Where(Function(b) b.BlockType = BlockType.LINE) _
        .Select(Function(b) b.Text))
End Function
$vbLabelText   $csharpLabel

Mevcut sayfa başına oranlar için AWS Textract fiyatlandırma sayfasına bakın. Farklı API özellikleri (temel metin algılama, tablo çıkarımı, form çıkarımı) farklı oranlara sahiptir. Tablo ve form alanları içeren bir belge, temel metin algılamadan daha yüksek ücretlere tabidir ve maliyetler hacimle artar, üst sınır olmadan ve ön ödeme imkanı olmadan.

Yüksek sayfa hacimlerinde, üç yıllık toplam maliyetler önemli olabilir ve sayaç çalışmaya devam eder.

IronOCR Yaklaşımı

// One license.Hayırper-page cost. Same code handles 1 page or 1,000,000.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var text = new IronTesseract().Read("document.jpg").Text;
// One license.Hayırper-page cost. Same code handles 1 page or 1,000,000.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr

' One license.Hayırper-page cost. Same code handles 1 page or 1,000,000.
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim text As String = New IronTesseract().Read("document.jpg").Text
$vbLabelText   $csharpLabel

$2,999 Professional lisansı, 10 geliştiriciyi, sınırsız projeleri ve sınırsız sayfa hacmini kapsar. İlk yıldan sonra, işlenen sayfa için devam eden maliyet sıfırdır. Belirgin sayfa hacimleri işleyen ekipler için,IronOCR lisansı bulut sayfa başına ücretlere kıyasla hızla kendini amorti eder.

IronOCR lisans sayfası, katman ayrıntılarını, kullanım bazlı faturalama senaryoları için SaaS abonelik seçeneklerini ve OEM yeniden dağıtım koşullarını kapsar.

Veri Egemenliği ve Uyumluluk

AWS Textract'ın mimarisi bir garantiyi imkansız kılar: belgelerinizin altyapınızda kalacağı. Her OCR işlemi, belge içeriğini Amazon'un sunucularına aktarır.

AWS Textract Yaklaşımı

// This code sends PHI, legal documents, financial records — whatever is in
// the file — to Amazon Web Services infrastructure
public async Task<string> ProcessSensitiveDocumentAsync(string documentPath)
{
    var imageBytes = File.ReadAllBytes(documentPath);

    // Data crosses your security perimeter here
    var request = new DetectDocumentTextRequest
    {
        Document = new Document
        {
            Bytes = new MemoryStream(imageBytes)
        }
    };

    // Amazon processes it; you receive text back
    var response = await _client.DetectDocumentTextAsync(request);

    return string.Join("\n", response.Blocks
        .Where(b => b.BlockType == BlockType.LINE)
        .Select(b => b.Text));
}
// This code sends PHI, legal documents, financial records — whatever is in
// the file — to Amazon Web Services infrastructure
public async Task<string> ProcessSensitiveDocumentAsync(string documentPath)
{
    var imageBytes = File.ReadAllBytes(documentPath);

    // Data crosses your security perimeter here
    var request = new DetectDocumentTextRequest
    {
        Document = new Document
        {
            Bytes = new MemoryStream(imageBytes)
        }
    };

    // Amazon processes it; you receive text back
    var response = await _client.DetectDocumentTextAsync(request);

    return string.Join("\n", response.Blocks
        .Where(b => b.BlockType == BlockType.LINE)
        .Select(b => b.Text));
}
Imports System.IO
Imports System.Threading.Tasks
Imports Amazon.Textract
Imports Amazon.Textract.Model

Public Class DocumentProcessor
    Private _client As AmazonTextractClient

    Public Sub New(client As AmazonTextractClient)
        _client = client
    End Sub

    ' This code sends PHI, legal documents, financial records — whatever is in
    ' the file — to Amazon Web Services infrastructure
    Public Async Function ProcessSensitiveDocumentAsync(documentPath As String) As Task(Of String)
        Dim imageBytes = File.ReadAllBytes(documentPath)

        ' Data crosses your security perimeter here
        Dim request As New DetectDocumentTextRequest With {
            .Document = New Document With {
                .Bytes = New MemoryStream(imageBytes)
            }
        }

        ' Amazon processes it; you receive text back
        Dim response = Await _client.DetectDocumentTextAsync(request)

        Return String.Join(vbLf, response.Blocks _
            .Where(Function(b) b.BlockType = BlockType.LINE) _
            .Select(Function(b) b.Text))
    End Function
End Class
$vbLabelText   $csharpLabel

AWS, kapsanan varlıklar için birHIPAAİş Ortağı Anlaşması sunar ve GovCloud bölgeleri FedRAMP Yüksek yetkilendirir. Bu çerçeveler temel mimariyi değiştirmez: belgeleriniz her işleminiz için altyapınızdan ayrılır.ITARile kontrol edilen teknik veriler için, bu bir uyumluluk nüansı değil — bir yasaktır. CMMC Seviye 3 iş yükleri ile CUI için, bulut aktarımı, çoğu savunma yüklenicisinin sahip olmadığı belirli yetkilendiriler gerektirir. İzole sistemler için — araştırma ağları, endüstriyel kontrol ortamları, sınıflandırılmış tesisler — Textract basitçe mevcut değildir.

AWS Textract, altı bölgede mevcuttur: us-east-1, us-west-2, eu-west-1, eu-west-2, ap-southeast-1 ve ap-southeast-2. Bu bölgeler dışındaki veri yerleşimi gereksinimlerine sahip kuruluşlar için uygun bir seçenek yoktur.

IronOCR Yaklaşımı

// IronOCR: document bytes never leave this process
public string ProcessSensitiveDocument(string documentPath)
{
    // Processes entirely on local hardware — no network call
    var ocr = new IronTesseract();
    return ocr.Read(documentPath).Text;
}
// IronOCR: document bytes never leave this process
public string ProcessSensitiveDocument(string documentPath)
{
    // Processes entirely on local hardware — no network call
    var ocr = new IronTesseract();
    return ocr.Read(documentPath).Text;
}
' IronOCR: document bytes never leave this process
Public Function ProcessSensitiveDocument(documentPath As String) As String
    ' Processes entirely on local hardware — no network call
    Dim ocr As New IronTesseract()
    Return ocr.Read(documentPath).Text
End Function
$vbLabelText   $csharpLabel

IronOCR yerel olarak yürütüldüğü için, PHI işleyen sağlık iş akışlarına, ayrıcalıklı iletişimleri işleyen yasal belge sistemlerine, ödeme kartı görüntülerini işleyen finansal uygulamalara ve CUI işleyen savunma yüklenici boru hatlarına doğal bir şekilde uyum sağlar. Denetlenecek harici işlemci yok, müzakere edilecek BAA yok, verilerinin yerleşimi sınırlaması tatmin edilecek. Uyumluluk kapsamı, kuruluşunuzun kendi altyapısıdır.

AWS altyapısında dağıtım yapan ancak yerel işlemeye ihtiyaç duyan ekipler için,IronOCRAWS EC2 ve Lambda üzerinde çalışır herhangi bir Textract bağımlılığı olmadan — işleme, Amazon'un yönetilen servisi yerine, kendi AWS hesap sınırınız içinde gerçekleşir.

Async Anket vs. Senkron İşleme

Textract'ın eşzamanlı (tek görüntü) ve eşzamansız (çok sayfalı PDF) API'leri arasındaki mimari bölünme, önemsiz bir API detayı değildir. Hizmetlerin nasıl inşa edildiğini, hataların nasıl ele alındığını ve kod bakıcılarının ne kadar kod okuması ve mantık yürütmesi gerektiğini şekillendirir.

AWS Textract Yaklaşımı

// Full production-grade async processor for Textract PDF handling
public class TextractAsyncProcessor
{
    private readonly AmazonTextractClient _textractClient;
    private readonly AmazonS3Client _s3Client;
    private readonly string _bucketName;
    private readonly TimeSpan _pollInterval = TimeSpan.FromSeconds(5);
    private readonly TimeSpan _maxWaitTime = TimeSpan.FromMinutes(10);

    public async Task<DocumentResult> ProcessDocumentAsync(
        string localFilePath,
        CancellationToken cancellationToken = default)
    {
        var s3Key = $"textract-uploads/{Guid.NewGuid()}{Path.GetExtension(localFilePath)}";

        try
        {
            // Phase 1: Upload to S3
            await UploadToS3Async(localFilePath, s3Key, cancellationToken);

            // Phase 2: Start Textract job
            var jobId = await StartTextractJobAsync(s3Key, cancellationToken);

            // Phase 3: Poll until complete (up to 10 minutes)
            var pollResult = await PollForCompletionAsync(jobId, cancellationToken);

            if (!pollResult.Success)
                throw new Exception($"Textract job failed: {pollResult.ErrorMessage}");

            // Phase 4: Retrieve paginated results
            return await GetAllResultsAsync(jobId, cancellationToken);
        }
        finally
        {
            // Phase 5: S3 cleanup — must succeed or storage costs accumulate
            await DeleteFromS3Async(s3Key, cancellationToken);
        }
    }

    private async Task<(bool Success, string ErrorMessage)> PollForCompletionAsync(
        string jobId, CancellationToken cancellationToken)
    {
        var startTime = DateTime.UtcNow;
        int pollCount = 0;

        while (DateTime.UtcNow - startTime < _maxWaitTime)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var response = await _textractClient.GetDocumentTextDetectionAsync(
                new GetDocumentTextDetectionRequest { JobId = jobId }, cancellationToken);

            pollCount++;

            switch (response.JobStatus)
            {
                case JobStatus.SUCCEEDED: return (true, null);
                case JobStatus.FAILED: return (false, response.StatusMessage ?? "Unknown error");
                case JobStatus.IN_PROGRESS:
                    await Task.Delay(_pollInterval, cancellationToken);
                    break;
                default:
                    throw new Exception($"Unknown job status: {response.JobStatus}");
            }
        }

        return (false, "Job timed out");
    }
}
// Full production-grade async processor for Textract PDF handling
public class TextractAsyncProcessor
{
    private readonly AmazonTextractClient _textractClient;
    private readonly AmazonS3Client _s3Client;
    private readonly string _bucketName;
    private readonly TimeSpan _pollInterval = TimeSpan.FromSeconds(5);
    private readonly TimeSpan _maxWaitTime = TimeSpan.FromMinutes(10);

    public async Task<DocumentResult> ProcessDocumentAsync(
        string localFilePath,
        CancellationToken cancellationToken = default)
    {
        var s3Key = $"textract-uploads/{Guid.NewGuid()}{Path.GetExtension(localFilePath)}";

        try
        {
            // Phase 1: Upload to S3
            await UploadToS3Async(localFilePath, s3Key, cancellationToken);

            // Phase 2: Start Textract job
            var jobId = await StartTextractJobAsync(s3Key, cancellationToken);

            // Phase 3: Poll until complete (up to 10 minutes)
            var pollResult = await PollForCompletionAsync(jobId, cancellationToken);

            if (!pollResult.Success)
                throw new Exception($"Textract job failed: {pollResult.ErrorMessage}");

            // Phase 4: Retrieve paginated results
            return await GetAllResultsAsync(jobId, cancellationToken);
        }
        finally
        {
            // Phase 5: S3 cleanup — must succeed or storage costs accumulate
            await DeleteFromS3Async(s3Key, cancellationToken);
        }
    }

    private async Task<(bool Success, string ErrorMessage)> PollForCompletionAsync(
        string jobId, CancellationToken cancellationToken)
    {
        var startTime = DateTime.UtcNow;
        int pollCount = 0;

        while (DateTime.UtcNow - startTime < _maxWaitTime)
        {
            cancellationToken.ThrowIfCancellationRequested();

            var response = await _textractClient.GetDocumentTextDetectionAsync(
                new GetDocumentTextDetectionRequest { JobId = jobId }, cancellationToken);

            pollCount++;

            switch (response.JobStatus)
            {
                case JobStatus.SUCCEEDED: return (true, null);
                case JobStatus.FAILED: return (false, response.StatusMessage ?? "Unknown error");
                case JobStatus.IN_PROGRESS:
                    await Task.Delay(_pollInterval, cancellationToken);
                    break;
                default:
                    throw new Exception($"Unknown job status: {response.JobStatus}");
            }
        }

        return (false, "Job timed out");
    }
}
Imports System
Imports System.IO
Imports System.Threading
Imports System.Threading.Tasks
Imports Amazon.Textract
Imports Amazon.S3
Imports Amazon.Textract.Model

' Full production-grade async processor for Textract PDF handling
Public Class TextractAsyncProcessor
    Private ReadOnly _textractClient As AmazonTextractClient
    Private ReadOnly _s3Client As AmazonS3Client
    Private ReadOnly _bucketName As String
    Private ReadOnly _pollInterval As TimeSpan = TimeSpan.FromSeconds(5)
    Private ReadOnly _maxWaitTime As TimeSpan = TimeSpan.FromMinutes(10)

    Public Async Function ProcessDocumentAsync(localFilePath As String, Optional cancellationToken As CancellationToken = Nothing) As Task(Of DocumentResult)
        Dim s3Key = $"textract-uploads/{Guid.NewGuid()}{Path.GetExtension(localFilePath)}"

        Try
            ' Phase 1: Upload to S3
            Await UploadToS3Async(localFilePath, s3Key, cancellationToken)

            ' Phase 2: Start Textract job
            Dim jobId = Await StartTextractJobAsync(s3Key, cancellationToken)

            ' Phase 3: Poll until complete (up to 10 minutes)
            Dim pollResult = Await PollForCompletionAsync(jobId, cancellationToken)

            If Not pollResult.Success Then
                Throw New Exception($"Textract job failed: {pollResult.ErrorMessage}")
            End If

            ' Phase 4: Retrieve paginated results
            Return Await GetAllResultsAsync(jobId, cancellationToken)
        Finally
            ' Phase 5: S3 cleanup — must succeed or storage costs accumulate
            Await DeleteFromS3Async(s3Key, cancellationToken)
        End Try
    End Function

    Private Async Function PollForCompletionAsync(jobId As String, cancellationToken As CancellationToken) As Task(Of (Success As Boolean, ErrorMessage As String))
        Dim startTime = DateTime.UtcNow
        Dim pollCount As Integer = 0

        While DateTime.UtcNow - startTime < _maxWaitTime
            cancellationToken.ThrowIfCancellationRequested()

            Dim response = Await _textractClient.GetDocumentTextDetectionAsync(New GetDocumentTextDetectionRequest With {.JobId = jobId}, cancellationToken)

            pollCount += 1

            Select Case response.JobStatus
                Case JobStatus.SUCCEEDED
                    Return (True, Nothing)
                Case JobStatus.FAILED
                    Return (False, If(response.StatusMessage, "Unknown error"))
                Case JobStatus.IN_PROGRESS
                    Await Task.Delay(_pollInterval, cancellationToken)
                Case Else
                    Throw New Exception($"Unknown job status: {response.JobStatus}")
            End Select
        End While

        Return (False, "Job timed out")
    End Function
End Class
$vbLabelText   $csharpLabel

Bu, oluşturulup unutulabilecek bir kalıp değildir. Bir Textract işi yolun ortasında başarısız olduğunda, S3 temizliği yine de çalışmalıdır. Bir iş 10 dakika sonra zaman aşımına uğradığında, çağıranın temiz bir hata alması gerekir. Anket sırasında ağ kesildiğinde, yeniden deneme stratejisi, kopya işleri oluşturmamalıdır. Her bir bu hata modu explícit bir işleme gerektirir - yukarıda gösterilen yapı, minimum sorumlu gerçekleştirmedir.

Toplu işleme, başka bir katman ekler: Textract'ın varsayılan StartDocumentTextDetection TPS limiti saniyede 5 istektir. 100 belgeyi işlemek için bir SemaphoreSlim sınırlaması, bir hız yenileme zamanlayıcısı ve ProvisionedThroughputExceededException için yeniden deneme mantığı gereklidir.

IronOCR Yaklaşımı

// IronOCR: same synchronous API regardless of document type or size
public string ProcessDocument(string filePath)
{
    using var input = new OcrInput();

    if (Path.GetExtension(filePath).Equals(".pdf", StringComparison.OrdinalIgnoreCase))
        input.LoadPdf(filePath);
    else
        input.LoadImage(filePath);

    return new IronTesseract().Read(input).Text;
}
// IronOCR: same synchronous API regardless of document type or size
public string ProcessDocument(string filePath)
{
    using var input = new OcrInput();

    if (Path.GetExtension(filePath).Equals(".pdf", StringComparison.OrdinalIgnoreCase))
        input.LoadPdf(filePath);
    else
        input.LoadImage(filePath);

    return new IronTesseract().Read(input).Text;
}
Imports System.IO

' IronOCR: same synchronous API regardless of document type or size
Public Function ProcessDocument(filePath As String) As String
    Using input As New OcrInput()
        If Path.GetExtension(filePath).Equals(".pdf", StringComparison.OrdinalIgnoreCase) Then
            input.LoadPdf(filePath)
        Else
            input.LoadImage(filePath)
        End If

        Return New IronTesseract().Read(input).Text
    End Using
End Function
$vbLabelText   $csharpLabel

Anket döngüsü, iş kimliği takibi, S3 kovası, sonuç sayfalandırma yoktur. Aynı kod bir tek JPEG ve 200 sayfalık bir PDF'yi işler. İşleme tamamlanır veya atılır — yönetmek için ara "ilerleme halinde" durumu yoktur. Toplu işleme için IronOCR, iletişim güvenliği (thread-safe) ve tek bir IronTesseract örneği Parallel.ForEach, kilitler veya işaretçiler olmadan işler.

IronTesseract kurulum kılavuzu yapılandırmayı kapsar ve PDF girişi kılavuzu, sayfa aralığı seçimi, şifre korumalı PDF'ler ve veritabanlarından veya HTTP yanıtlarından alınan PDF'ler için akış tabanlı giriş belgelerini içerir.

Kimlik Bilgileri Yönetimi Yükü

AWS Textract ile bir OCR işlemi başlatmak, tek bir sayfa işlenmeden önce IAM yapılandırmasını içerir.

AWS Textract Yaklaşımı

DetectDocumentTextAsync çağrılmadan önce, bir geliştiricinin:

  1. Bir AWS hesabı oluşturması veya mevcut bir hesaba erişim sağlaması gerekir
  2. textract:DetectDocumentText ve textract:AnalyzeDocument izinleri ile bir IAM kullanıcı veya rolü oluşturması gerekir
  3. Erişim anahtarı kimliği ve gizli erişim anahtarını üretmesi ve güvenli bir şekilde saklaması
  4. Kimlik bilgisi çözümlemesini yapılandırması — ortam değişkenleri, AWS kimlik bilgileri dosyası veya EC2 örnek profili
  5. PDF'leri işlerken: bir S3 kovası oluşturun, kova politikasını yapılandırın ve s3:PutObject ve s3:DeleteObject izinlerini ekleyin
  6. Güvenlik standartlarını karşılamak için kimlik bilgisi döndürme politikalarını uygulaması
  7. Kimlik bilgilerini her dağıtım ortamında güvenli bir şekilde saklaması —Dockersırları, Kubernetes sırları, AWS Secrets Manager veya CI/CD boru hattı değişkenleri kullanılarak
// Every environment needs these configured before this constructor succeeds
public TextractOcrService()
{
    // Reads credentials from environment, ~/.aws/credentials, or IAM role
    _client = new AmazonTextractClient(Amazon.RegionEndpoint.USEast1);
}
// Every environment needs these configured before this constructor succeeds
public TextractOcrService()
{
    // Reads credentials from environment, ~/.aws/credentials, or IAM role
    _client = new AmazonTextractClient(Amazon.RegionEndpoint.USEast1);
}
' Every environment needs these configured before this constructor succeeds
Public Sub New()
    ' Reads credentials from environment, ~/.aws/credentials, or IAM role
    _client = New AmazonTextractClient(Amazon.RegionEndpoint.USEast1)
End Sub
$vbLabelText   $csharpLabel

Kimlik bilgileri süresinin dolduğunda, döndüğünde veya yanlış yapılandırıldığında, tüm OCR çağrıları AmazonTextractException ile ErrorCode == "AccessDeniedException" taşıyan hatalarla başarısız olur. Bir üretim sisteminde, bu, kimlik bilgisi hataları için belirli yakalama blokları uygulamak ve IAM politikası sürüklenmesini izlemek anlamına gelir.

IronOCR Yaklaşımı

// One-time setup at application startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// Or from environment — recommended for deployments
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// One-time setup at application startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// Or from environment — recommended for deployments
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' One-time setup at application startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

' Or from environment — recommended for deployments
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
$vbLabelText   $csharpLabel

Lisans anahtarı statik bir dizgedir. Operasyon ortasında sona ermez, döndürme gerektirmez ve yönetilecek izinler taşımaz. Belgeleri işleyen birDockerkonteynerı, enjekte edilmiş AWS kimlik bilgilerine, bir yürütme bağlamına bağlı bir IAM rolüne veya belirteç yenilemek için AWS STS'ye ağ erişimine ihtiyaç duymaz.

Textract'tan IronOCR'ye geçerken eksiksiz kimlik bilgisi maliyet azaltımı: Üç NuGet paketi kaldırılır (AWSSDK.Textract, AWSSDK.S3, AWSSDK.Core), tüm AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_DEFAULT_REGION ortam değişkenleri kaldırılır ve IAM rolleri ve S3 kova yapılandırmaları iptal edilir. görüntü girişi kılavuzu ve akış girişi kılavuzu, Textract'ın bayt dizi ve S3 nesne belge modellerini değiştiren tüm giriş yöntemlerini kapsar.

API Eşleme Başvurusu

AWS Textract API IronOCR Karşılığı
AmazonTextractClient IronTesseract
AmazonS3Client Gerekli değil
DetectDocumentTextRequest OcrInput
DetectDocumentTextResponse OcrResult
AnalyzeDocumentRequest OcrInput ve bölgeler için CropRectangle
StartDocumentTextDetectionRequest OcrInput — eşzamanlı, başlatmaya gerek yok
GetDocumentTextDetectionRequest Gerekli değil — sonuçlar anında
Document.Bytes input.LoadImage(bytes) veya input.LoadImage(stream)
S3Object (belge hazırlama) Dosya yolu dizgesi veya akışı
Block (BlockType.LINE) result.Lines
Block (BlockType.WORD) result.Words
Block (BlockType.TABLE) Kelime konumu gruplaması result.Words aracılığıyla
Block (BlockType.KEY_VALUE_SET) CropRectangle bölge çıkarımı
Block.Confidence word.Confidence / result.Confidence
JobStatus.SUCCEEDED Uygulanamaz — eşzamanlı dönüş
JobStatus.IN_PROGRESS Uygulanamaz — eşzamansız durum yok
response.NextToken (sayfalandırma) Uygulanamaz — sonuçlar sayfalandırılmamış
ProvisionedThroughputExceededException Uygulanamaz — TPS sınırları yok
client.DetectDocumentTextAsync(request) ocr.Read(path)
client.AnalyzeDocumentAsync(request) ocr.Read(input)
client.StartDocumentTextDetectionAsync(request) ocr.Read(input)
client.GetDocumentTextDetectionAsync(request) Uygulanamaz

Ekipler AWS Textract'tan IronOCR'ye Geçmeyi Düşündüğünde

Aylık Fatura Bir Bütçe Kalemi Olduğunda

Düşük hacimle Textract ile başlayan ekipler, sıklıkla belirli bir anla karşılaşır: OCR işleme için AWS faturası, üç aylık bir bütçe incelemesinde belirir ve birisi bunun maliyetinin sabit olup olmadığını sorar. Değil. Yüksek sayfa hacimlerinde, yıllık Textract maliyetleri önemli olabilir — mevcut oranlar için AWS Textract fiyatlandırma sayfasına bakın.IronOCR Professional lisansı, $2,999 bir kereye mahsus ödemede, orta ila yüksek sayfa hacimlerinde kendini hızla amorti eder.

Bir Uyumluluk Gereksinimi Bulut İşlemeyi Engellediğinde

Doküman dijitalleştirme iş akışlarını uygulayan sağlık kuruluşları, çoğu kez proje ortasında keşfeder kiHIPAAPHI, BAA olmadan ve ek yasal inceleme yapılmadan bulut hizmetleri üzerinden akamaz veya güvenlik ekibinin bulut aktarımını tamamen yasakladığını keşfeder. Teknik çizimler, teknik özellikler veya herhangi bir CUI'yi işleyen savunma yüklenicileri, AWS Textract'ı göz önüne aldırmayanITARve CMMC kısıtlamaları ile karşılaşır. Ayrıcalıklı iletişimleri işleyen hukuk firmalarının benzer endişeleri vardır. Bunlar teorik uyumluluk kenar durumları değildir — satın alma incelemelerinde, güvenlik denetimlerinde ve sözleşme müzakerelerinde düzenli olarak ortaya çıkar.IronOCR yerel olarak işler, bu nedenle belge verileri için uyumluluk sorusu, Amazon'un altyapısının kapsamda olup olmadığı değil, kendi altyapınızın kapsamda olup olmadığına indirgenir.

Async PDF Karmaşıklığı Değerini Aştığında

Beş aşamalı S3 senkron boru hattı — yükleme, iş başlat, anket, sonuçları sayfalandır, temizle — teknik olarak uygulamak zor değildir. Sürdürülebilir, test edilmesi ve işletilmesi zordur. Her aşama bir hata noktasıdır. S3 yükleme hataları, yeniden deneme mantığı gerektirir. Textract iş hataları, geçici ve kalıcı hataları ayırt etmeyi gerektirir. Anket zaman aşımı, iptalden ayrı zaman aşımı işleme gerektirir. Sonuç sayfalandırma, birden fazla API çağrısı boyunca durum biriktirmeyi gerektirir. S3 temizleme hataları, uyarı gerektirir çünkü yetim nesneler maliyetleri biriktirir. Bu boru hattını üretime taşıyan ekipler, genellikle onu inşa etmekten daha fazla, sürekli mühendislik zamanı harcamaktadırlar.IronOCR eşdeğeri — input.LoadPdf(path) ardından ocr.Read(input) — beş aşamanın tamamını ve ilgili başarısızlık modlarını ortadan kaldırır.

Dağıtım Ortamları İnternet Erişiminden Yoksun Olduğunda

İzole ağ segmentlerinde, internet çıkışsız yerinde sunucularda, hava-şeritli araştırma ortamlarında ve sıkı ağ kontrolüne sahip endüstriyel sistemlerde çalışanDockerkonteynerları, bir ortak özelliği paylaşıyor:AWS Textractmevcut değil. IronOCR, standart bir NuGet paketi olarak yüklenir ve kurulumdan sonra herhangi bir ağ çağrısı yapmadan çalışır. .NET uygulamalarını bu ortamlarda çalıştıran ekipler, Textract seçeneğine sahip değil ve yerel olarak işleyen bir kütüphaneye ihtiyaç duyuyor. Docker dağıtım kılavuzu ve Linux dağıtım kılavuzu konteynerleştirilmiş ortamlar için özel yapılandırmayı kapsar.

Oran Limiti Boğulması Toplu İş Akışlarını Kestiğinde

Varsayılan StartDocumentTextDetection TPS limiti saniyede 5 istektir. DetectDocumentText eşzamanlı çağrıları da hız sınırlıdır. Yüzlerce veya binlerce belgeyi işleyen toplu işler, SemaphoreSlim hız sınırlamasını, ProvisionedThroughputExceededException üzerinde üstel geri çekilmeyi ve hız yenileme zamanlayıcılarını uygulamalıdır. AWS TPS sınır artış taleplerini destekler, ancak bunlar gerekçe, inceleme gerektirir ve garanti edilmez. IronOCR, yerel CPU'nun izin verdiği hızda işler — 32 çekirdekli bir sunucu, throttle yapılandırması veya servis katmanı müzakeresi olmadan eşzamanlı olarak 32 belge işler.

Genel Geçiş Dikkat Edilmesi Gereken Hususlar

Bloğ Grafik
anlamışte&Yaşların yerine Doğrudan Koleksiyonlar Konulduğunda

Textract, tüm sonuçları bir List<Block> düzleminde temsil eder; burada satırlar, kelimeler, hücreler, tablolar ve anahtar-değer çiftleri BlockType ile ayırt edilir ve ilişki kimlik dizileri ile bağlantı kurulur.IronOCR doğrudan tip toplulukları sunar.

// Textract: filter flat block list by type
var lines = response.Blocks.Where(b => b.BlockType == BlockType.LINE);
var words = response.Blocks.Where(b => b.BlockType == BlockType.WORD);

// IronOCR: direct access to typed collections
var result = ocr.Read(imagePath);
var lines = result.Lines;   // IEnumerable<OcrResult.OcrResultLine>
var words = result.Words;   // IEnumerable<OcrResult.OcrResultWord>
foreach (var word in result.Words)
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence {word.Confidence}%");
// Textract: filter flat block list by type
var lines = response.Blocks.Where(b => b.BlockType == BlockType.LINE);
var words = response.Blocks.Where(b => b.BlockType == BlockType.WORD);

// IronOCR: direct access to typed collections
var result = ocr.Read(imagePath);
var lines = result.Lines;   // IEnumerable<OcrResult.OcrResultLine>
var words = result.Words;   // IEnumerable<OcrResult.OcrResultWord>
foreach (var word in result.Words)
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence {word.Confidence}%");
' Textract: filter flat block list by type
Dim lines = response.Blocks.Where(Function(b) b.BlockType = BlockType.LINE)
Dim words = response.Blocks.Where(Function(b) b.BlockType = BlockType.WORD)

' IronOCR: direct access to typed collections
Dim result = ocr.Read(imagePath)
Dim lines = result.Lines   ' IEnumerable(Of OcrResult.OcrResultLine)
Dim words = result.Words   ' IEnumerable(Of OcrResult.OcrResultWord)
For Each word In result.Words
    Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) confidence {word.Confidence}%")
Next
$vbLabelText   $csharpLabel

Yapılandırılmış sonuçlar kılavuzu, result.Pages, result.Paragraphs, result.Lines, result.Words ve yerleşim farkında doküman işleme için koordinatlardan erişimi kapsar.

S3 Aşamalı PDF İşleme ile Doğrudan LoadPdf ile Değiştirildiğinde

Bir tespitleme işi başlatmadan önce S3'e yükleme yapan herhangi bir Textract kodu doğrudan PDF yükleme ile değiştirilebilir. Aşama kovası yok, yükleme zamanı yok, temizleme mantığı yok.

// Textract: upload to S3 → start job → poll → paginate → cleanup (50+ lines)
//IronOCR equivalent:
public string ProcessPdf(string pdfPath)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadPdf(pdfPath);
    return ocr.Read(input).Text;
}

// Specific page ranges (no Textract equivalent without async job per range)
public string ProcessPdfPages(string pdfPath, int startPage, int endPage)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadPdfPages(pdfPath, startPage, endPage);
    return ocr.Read(input).Text;
}
// Textract: upload to S3 → start job → poll → paginate → cleanup (50+ lines)
//IronOCR equivalent:
public string ProcessPdf(string pdfPath)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadPdf(pdfPath);
    return ocr.Read(input).Text;
}

// Specific page ranges (no Textract equivalent without async job per range)
public string ProcessPdfPages(string pdfPath, int startPage, int endPage)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadPdfPages(pdfPath, startPage, endPage);
    return ocr.Read(input).Text;
}
Imports IronOcr

Public Class PdfProcessor
    ' Textract: upload to S3 → start job → poll → paginate → cleanup (50+ lines)
    ' IronOCR equivalent:
    Public Function ProcessPdf(pdfPath As String) As String
        Dim ocr As New IronTesseract()
        Using input As New OcrInput()
            input.LoadPdf(pdfPath)
            Return ocr.Read(input).Text
        End Using
    End Function

    ' Specific page ranges (no Textract equivalent without async job per range)
    Public Function ProcessPdfPages(pdfPath As String, startPage As Integer, endPage As Integer) As String
        Dim ocr As New IronTesseract()
        Using input As New OcrInput()
            input.LoadPdfPages(pdfPath, startPage, endPage)
            Return ocr.Read(input).Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Textract'ta Düşük Güven Üreten Belgeler için Ön İşleme Eklemek

Textract'ın ön işlem süreci içsel ve yapılandırılamazdır. Taralı bir belge zayıf sonuçlar ürettiğinde, tek seçenekler yeniden denemek veya düşük güven çıktısını kabul etmektir. IronOCR, ön işleme hattını doğrudan açığa çıkarır.

// For documents that returned low-confidence results from Textract
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();              // Fix rotation from scanner misalignment
input.DeNoise();             // Remove scanner noise artifacts
input.Contrast();            // Boost faint text
input.EnhanceResolution(300); // Scale to optimal OCR resolution

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// For documents that returned low-confidence results from Textract
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();              // Fix rotation from scanner misalignment
input.DeNoise();             // Remove scanner noise artifacts
input.Contrast();            // Boost faint text
input.EnhanceResolution(300); // Scale to optimal OCR resolution

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

Dim input As New OcrInput()
input.LoadImage("low-quality-scan.jpg")

input.Deskew()              ' Fix rotation from scanner misalignment
input.DeNoise()             ' Remove scanner noise artifacts
input.Contrast()            ' Boost faint text
input.EnhanceResolution(300) ' Scale to optimal OCR resolution

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

Görüntü kalitesi düzeltme rehberi ve görüntü filtreleri eğitimi, tam ön işleme sürecini ve belirli belge türleri için en iyi çalışan kombinasyonları belgeler. Güven skoru yorumlaması ve öğe başına güvene erişim için güven puanları kılavuzu, result.Confidence özelliğini ve kelime başına güven değerlerini kapsar.

Eşzamansız'dan Senkron Mod Değişikliklerini Yönetmek

Mevcut Textract kodu, SDK'nin yalnızca async (eşzamansız) olduğu için zorunlu olarak async Task<t> olarak yazılmıştır.IronOCR işlemleri senkron yapar. Zaten bir async çağrı zinciri olan uygulama kodları için, async sınırını korumak için IronOCR çağrısını Task.Run ile sarın.

// Preserves async call site for minimal refactoring
public async Task<string> ExtractTextAsync(string path)
{
    return await Task.Run(() => new IronTesseract().Read(path).Text);
}
// Preserves async call site for minimal refactoring
public async Task<string> ExtractTextAsync(string path)
{
    return await Task.Run(() => new IronTesseract().Read(path).Text);
}
Imports System.Threading.Tasks

' Preserves async call site for minimal refactoring
Public Async Function ExtractTextAsync(path As String) As Task(Of String)
    Return Await Task.Run(Function() New IronTesseract().Read(path).Text)
End Function
$vbLabelText   $csharpLabel

Bu bir kolaylık kaplamasıdır, bir gereklilik değildir. Arka planda çalışan kodda zaten bir arka plan iş parçacığında olan sunucu tarafı işlem için, senkron çağrı doğrudan tercih edilir.

Ek IronOCR Yetenekleri

Yukarıdaki karşılaştırma noktalarının ötesinde, IronOCR'ninAWS Textracteşdeğeri olmayan yetenekler sunar:

  • OCR sırasında barkod okuma: ocr.Configuration.ReadBarCodes = true ayarlayın ve belgelerdeki barkodlar, metinle birlikte tek geçişte çıkarılır — ayrı bir barkod taraması adımı gerektirmez
  • Uzun işler için ilerleme takibi: Çok sayfalı işleme için bir dış hizmet tarama olmadan ilerleme olaylarına abone olun.
  • Taralı belge işleme: Tipik ofis tarayıcı çıkışı için optimize edilmiş hat, çift yönlü taramalar ve karışık yönlendirme sayfalarını içerir.
  • Çok dilli eşzamanlı çıkarım: okuma sırasında dil paketlerini birleştirin — OcrLanguage.French + OcrLanguage.German — API katman değişikliği gerekmez
  • Pasaport ve kimlik okuma: Mısralı kimlik belgeleri için adanmış hat, manuel bölge tanımı olmadan yapılandırılmış alanları çıkartır.

.NET Uyumluluğu ve Geleceğe Hazırlık

IronOCR, .NET 8 ve .NET 9'u hedef alıyor ve .NET Standard 2.0 projeleri ve .NET Framework 4.6.2 üzerinden 4.8 için etkin uyumluluk sağlıyor. Kütüphane, tek bir NuGet paket aracılığıyla Windows x64, Windows x86,Linuxx64 ve macOS için yerel ikili dosyalar sağlar — çalışma zamanı tanımlayıcı değiştirme veya platforma özel paket referansları gerektirmez. AWS Textract'ın AWSSDK.Textract paketi aynı modern .NET hedeflerini destekler ancak dağıtım modeli tam AWS SDK bağımlılık ağacını, IAM kimlik bilgisi altyapısını ve bu makale boyunca belgelenmiş mimari kısıtlamaları taşır. IronOCR, Tesseract 5 motor güncellemelerini izleyen düzenli sürümlerle etkin geliştirme sürdürür ve .NET 10 piyasaya sürüldüğünde uyumluluk dahil .NET çalışma zamanı gelişmelerini izler.

Sonuç

AWS Textract ve IronOCR aynı sorunu çözer — .NET uygulamalarında belgelerden metin çıkarma — ancak temelde uyumsuz mimari varsayımlar ile. Textract belgelerin ağınızdan ayrılabileceğini varsayar, bulut hizmet maliyetlerinin hacme göre lineer ölçeğe sahip olduğunu varsayar ve çok sayfalı PDF'lerin S3 aşamalandırmasıyla beş aşamalı eşzamansız bir boru hattını gerektirdiğini varsayar.IronOCR belgelerin işlendiği yerde kaldığını varsayar, lisans maliyetlerinin hacimden ayrılması gerektiğini varsayar ve PDF işlemenin görüntü işlemesi ile aynı üç satır kodu gerektirdiğini varsayar.

Maliyet aritmetiği en net ayrım çizgisi. Düşük hacimlerde, Textract'ın sayfa başına ücretleri yönetilebilir. Hacim arttıkça, yıllık maliyetler önemli ölçüde artar. Yüksek sayfa hacimlerinde tablo çıkarımı ile çok yıllık Textract maliyetleri, $5,999 IronOCR'nin Unlimited lisansını bile büyük ölçüde aşabilir. Başlangıç matematiği geçerlidir: sayfa başına model hızla toplanır ve asla durmaz.

Veri egemenliği ikinci yapısal sınırlılıktır. Sağlık, hukuk, finans ve hükümet iş yükleri için, belgelerin işlendiği yer özü itibariyle tercihte değil — bu bir uyumluluk gereksinimidir. IronOCR, tasarım gereği yerel olarak işler, yapılandırma ile değil. Herhangi bir "yerel mod" etkinleştirme yok; yerel işleme, tek moddur. Bu nedenle uyumluluk cevabı basittir: belgeleriniz kendi altyapınızda kalır çünkü gitmek için başka bir yer yoktur.

OCR'yi gerçek ölçekte değerlendiren veya belgelerin iç altyapıdan çıkamayacağı ortamlarda çalışan ekipler için, IronOCR'un belgelendirmesi, temel görüntü okuma işlemlerinden aranabilir PDF oluşturma ve çok dilli çıkarma işlemlerine kadar tam kapsam API referansı, Docker, AWS,AzureveLinuxiçin dağıtım kılavuzları ve OCR kullanım durumlarının tamamını kapsayan öğreticiler sağlar.

[{i: (AWS Textract ve Tesseract, sahiplerinin tescilli markalarıdır. Bu site, Amazon Web Services veya Google tarafından onaylanmayan, bağlantılı olmayan veya sponsorlanmayan bir sitedir. 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

Amazon Textract nedir?

Amazon Textract, geliştiriciler ve işletmeler tarafından görüntülerden ve belgelerden metin çıkarmak için kullanılan bir OCR çözümüdür. .NET uygulama geliştirme için IronOCR ile birlikte değerlendirilen birkaç OCR seçeneğinden biridir.

.NET geliştiricileri için IronOCR, Amazon Textract ile nasıl karşılaştırılır?

IronOCR, IronTesseract'ı temel motoru olarak kullanan bir NuGet yerli .NET OCR kütüphanesidir. Amazon Textract'e kıyasla, daha basit bir dağıtım (herhangi bir SDK yükleyici yok), sabit fiyatlandırma ve COM ara yüzde ya da bulut bağımlılıkları olmadan temiz bir C# API sunar.

IronOCR, Amazon Textract'ten daha mı kolay kurulabilir?

IronOCR, tek bir NuGet paketi aracılığıyla yüklenir. SDK kurulumları, kopyalamak için lisans dosyaları, kaydedilecek COM bileşenleri veya yönetilecek ayrı çalışma zamanı ikili dosyaları yoktur. Tüm OCR motoru paket içinde yer alır.

Amazon Textract ile IronOCR arasında hangi doğruluk farkları vardır?

IronOCR, standart iş belgeleri, faturalar, makbuzlar ve taranmış formlar için yüksek tanıma doğruluğu sağlar. Çok kötü durumda olan belgeler ya da nadir yazılar için ise doğruluk, kaynak kalitesine göre değişiklik gösterebilir. IronOCR, düşük kaliteli girişlerde tanımayı geliştirmek için görüntü ön işleme filtreleri içerir.

IronOCR, PDF metin çıkarma desteği sunuyor mu?

Evet. IronOCR, tek bir çağrıda hem yerel PDF'lerden hem de taranmış PDF görüntülerinden metin çıkarır. Çok sayfalı TIFF dosyaları, görüntüler ve akıntılar da desteklenir. Taranmış PDF'ler için, OCR sayfa bazında uygulanır ve her sayfa için sonuç nesneleri sağlanır.

Amazon Textract lisanslaması ile IronOCR'yi nasıl karşılaştırılır?

IronOCR, sayfa veya tarama başına ücret içermeyen sabit oranlı bir süresiz lisans kullanır. Yüksek belge hacmi işleyen kuruluşlar, hacme rağmen aynı lisans maliyetini öder. Ayrıntılar ve hacim fiyatlandırması IronOCR lisans sayfasında mevcuttur.

IronOCR hangi dilleri destekliyor?

IronOCR, ayrı NuGet dil paketleri aracılığıyla 127 dili destekler. Bir dil eklemek için tek bir 'dotnet add package IronOcr.Languages.{Language}' komutu gerekir. Manuel dosya yerleştirme veya yol yapılandırması gerekmez.

.NET projesine IronOCR'yi nasıl kurarım?

NuGet üzerinden kurun: 'Install-Package IronOcr' Package Manager Console'da veya 'dotnet add package IronOcr' CLI'de. Ek dil paketleri aynı şekilde yüklenir. Yerel SDK kurucusu gerekmez.

IronOCR, Amazon Textract'ten farklı olarak Docker ve konteynerize dağıtımlar için uygun mu?

Evet. IronOCR, NuGet paketi aracılığıyla Docker konteynerlerinde çalışır. Lisans anahtarı, bir ortam değişkeni aracılığıyla ayarlanır. Lisans dosyaları, SDK yolları veya OCR motoru için hacimlerin bağlanmasına gerek yoktur.

Amazon Textract karşısında IronOCR'yi satın almadan önce deneyebilir miyim?

Evet. IronOCR deneme modu, belgeleri işler ve çıkış üzerine bir filigran eklemeli OCR sonuçları döndürür. Lisans satın almadan önce kendi belgeleriniz üzerinde doğruluğu kontrol edebilirsiniz.

IronOCR, metin çıkarma yanında barkod okuma desteği sunar mı?

IronOCR, metin çıkarma ve OCR'ye odaklanır. Barkod okuma için Iron Software, eşlik eden bir kütüphane olan IronBarcode'u sağlar. Her ikisi de ayrı ayrı veya Iron Suite paketi olarak mevcuttur.

Amazon Textract'ten IronOCR'ye geçiş yapmak kolay mı?

Amazon Textract'ten IronOCR'ye geçiş genellikle başlangıç dizilerini IronTesseract oluşturma ile değiştirmeyi, COM yaşam döngüsü yönetimini kaldırmayı ve API çağrılarını güncellemeyi içerir. Çoğu geçişler, kod karmaşıklığını önemli ölçüde azaltı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ı...

Daha Fazla Oku

Iron Destek Ekibi

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