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
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
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
$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
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
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
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
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:
- Bir AWS hesabı oluşturması veya mevcut bir hesaba erişim sağlaması gerekir
textract:DetectDocumentTextvetextract:AnalyzeDocumentizinleri ile bir IAM kullanıcı veya rolü oluşturması gerekir- Erişim anahtarı kimliği ve gizli erişim anahtarını üretmesi ve güvenli bir şekilde saklaması
- Kimlik bilgisi çözümlemesini yapılandırması — ortam değişkenleri, AWS kimlik bilgileri dosyası veya EC2 örnek profili
- PDF'leri işlerken: bir S3 kovası oluşturun, kova politikasını yapılandırın ve
s3:PutObjectves3:DeleteObjectizinlerini ekleyin - Güvenlik standartlarını karşılamak için kimlik bilgisi döndürme politikalarını uygulaması
- 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
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")
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
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
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}%")
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
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 = trueayarlayı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.

