Zum Fußzeileninhalt springen
MIT ANDEREN KOMPONENTEN VERGLEICHEN

Ein Vergleich zwischen IronOCR und Nanonets OCR

Das Per-Page-Preismodell von AWS Textractkann bei niedrigem Volumen kostengünstig wirken, aber die Kosten summieren sich unbegrenzt im großen Maßstab. Jedes Dokument, das Ihre Anwendung bearbeitet, verlässt Ihr Netzwerk, reist zu einem Amazon-Datenzentrum, wird von der Amazon-Infrastruktur verarbeitet und die Rechnung summiert sich unbegrenzt. Für Teams, die OCR-Optionen in .NET evaluieren, stellt sich nicht nur die Frage, ob Textract genaue Ergebnisse liefert – was es tut –, sondern auch, ob das Seitenkostenmodell, die obligatorische Cloud-Übertragung und die asynchrone Abfragearchitektur für mehrseitige Dokumente den tatsächlichen Anforderungen Ihrer Anwendung entsprechen.

AWS Textractverstehen

AWS Textract ist Amazons verwalteter Dokumentenanalyse-Dienst, zugänglich über das AWS SDK for .NET durch das AWSSDK.Textract NuGet-Paket. Es funktioniert als Cloud-API: Ihre Anwendung sendet Dokumentdaten an die Infrastruktur von Amazon und erhält strukturierte Ergebnisse. Für den Dienst sind ein AWS-Konto, IAM-Anmeldedaten mit Textract-Berechtigungen sowie eine Internetverbindung für jeden einzelnen OCR-Vorgang erforderlich.

Textract bietet mehrere unterschiedliche Analysemodi an, die jeweils separat berechnet werden:

  • DetectDocumentText: Grundlegende Textextraktion (siehe AWS Textract Preisgestaltung für aktuelle Per-Page-Konditionen)
  • AnalyzeDocument (Tables): Strukturiertes Tabellenauszug zu einem höheren Per-Page-Preis als bei der grundlegenden Texterkennung
  • AnalyzeDocument (Forms): Schlüssel-Wert-Formularauszug zu einem höheren Per-Seiten Preis als bei Tabellenauszug
  • AnalyzeExpense: Analyse von Rechnungen und Belegen für 0,01 $ pro Seite
  • AnalyzeID: Extraktion von Ausweisdaten für 0,025 $ pro Seite
  • StartDocumentTextDetection / StartDocumentAnalysis: Asynchrone API, die für jede mehrseitige PDF-Datei erforderlich ist und einen S3-Staging-Bucket, Job-Abfrage sowie eine Paginierung der Ergebnisse voraussetzt

Das Ergebnismodell verwendet eine flache Liste von Block Objekten mit Beziehungs-IDs, die durchlaufen werden müssen, um Tabellen, Formulare oder jegliche strukturierte Ausgabe zu rekonstruieren. Eine einfache Tabellenextraktion erfordert das Iterieren von BlockType.TABLE Blöcken, das Finden von Kinder-BlockType.CELL Blöcken über RelationshipType.CHILD Beziehungs-IDs und das Abrufen von BlockType.WORD Blöcken für den Text jeder Zelle. Dieses Beziehungsgraphenmodell verarbeitet komplexe Dokumentstrukturen, ist jedoch nicht besonders ressourcenschonend.

Die S3-Async-Pipeline

Einzelbild-OCR über DetectDocumentTextAsync kann Dokumentbytes direkt in der Anfrage übergeben. Mehrseitige PDFs können dies nicht. Jedes PDF erfordert die vollständige asynchrone Pipeline:

// AWS Textract: Mehrseitiges PDF requires 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: Stets clean up S3
        await _s3Client.DeleteObjectAsync(_bucketName, key);
    }
}
// AWS Textract: Mehrseitiges PDF requires 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: Stets clean 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 As String = $"uploads/{Guid.NewGuid()}.pdf"
        Using fileStream As 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 As String = 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 As 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: Stets clean up S3
            Await _s3Client.DeleteObjectAsync(_bucketName, key)
        End Try
    End Function
End Class
$vbLabelText   $csharpLabel

Dies ist die minimale funktionsfähige Implementierung für eine zuverlässige PDF-Verarbeitung — fünf verschiedene Phasen, zwei AWS Dienst-Clients und Aufräumlogik in einem finally Block. Die vollständige Produktionsversion mit korrekter Fehlerbehandlung, Logik für Wiederholungsversuche bei Ratenbegrenzung und Zeitüberschreitungsmanagement umfasst 150–300 Zeilen.

IronOCR verstehen

IronOCR ist eine kommerzielle .NET-OCR-Bibliothek, die vollständig auf Ihrer Infrastruktur läuft. Sie umfasst eine optimierte Tesseract 5-Engine mit automatischer Bildvorverarbeitung, nativer PDF-Unterstützung und einer synchronen API, die Ergebnisse direkt ohne externe Dienstaufrufe oder Zwischenschritte liefert.

Wichtige Merkmale der IronOCR-Architektur:

  • Nur lokale Verarbeitung: Es verlassen keine Dokumentdaten den Rechner, auf dem Ihre Anwendung läuft
  • Einzelnes NuGet-Paket: dotnet add package IronOcr installiert alles, einschließlich nativer Binärdateien
  • Automatische Vorverarbeitung: Entzerrung, Rauschunterdrückung, Kontrastverbesserung, Binarisierung und Auflösungsskalierung erfolgen automatisch bei Eingaben von schlechter Qualität
  • Native PDF-Unterstützung: Liest PDFs direkt über Dateipfad oder Stream ohne S3-Staging oder asynchrone Jobs
  • Thread-sicher: Eine einzelne IronTesseract Instanz behandelt gleichzeitige Anfragen über Threads ohne Konflikt
  • Unbefristete Lizenzierung: $999 Lite / $1,499 Plus / $2,999 Professional / $5,999 Unlimited — eine Zahlung, keine Gebühren pro Seite, keine Nutzungsmessung
  • Über 125 Sprachpakete: Als separate NuGet-Pakete installiert, lokal geladen, keine Netzwerkaufrufe

Funktionsvergleich

Feature AWS Textract IronOCR
Verarbeitungsort Amazon Cloud (obligatorisch) Lokal / vor Ort
Mehrseitiges PDF Erfordert S3 + asynchronen Job Direkter synchroner Anruf
Kostenmodell Per-Seite (kontaktieren Sie AWS für aktuelle Preisgestaltung) Dauerlizenz, keine Gebühr pro Seite
Internet erforderlich Stets Niemals
Einrichtung der Anmeldeinformationen IAM-Benutzer/Rolle + optional S3 Einzelner Lizenzschlüssel
Air-Gap-Bereitstellung Nicht möglich Vollständig unterstützt
Unterstützung für verschlüsselte PDFs Nicht unterstützt Eingebaut (Passwortparameter)

Detaillierter Funktionsvergleich

Feature AWS Textract IronOCR
Textextraktion
Grundlegende OCR (Bilder) Ja — DetectDocumentTextAsync Ja — ocr.Read(path)
Mehrseitiges PDF Erfordert S3 + asynchrones Polling Direkte input.LoadPdf(path)
Passwortgeschütztes PDF Nicht unterstützt input.LoadPdf(path, Password: "x")
Stream-Eingabe Ja (Byte-Array in der Anfrage) Ja — input.LoadImage(stream)
Strukturierte Extraktion
Tabellenextraktion AnalyzeDocument + Graphdurchlauf durch Blöcke Rekonstruktion basierend auf der Wortposition
Formularfeldextraktion AnalyzeDocument + KEY_VALUE_SET Blöcke Regionenbasierte CropRectangle Zonen
Ergebnisse auf Linienebene Block Filterung nach BlockType.LINE result.Lines direkte Sammlung
Wortebene mit Koordinaten Block Filterung nach BlockType.WORD result.Words mit .X, .Y, .Width
Konfidenzwerte Konfidenz pro Block Wortgenaue und Gesamt-result.Confidence
Verarbeitungsmodell
Synchron (Bilder) Ja (nur eine Seite) Ja (alle Dokumenttypen)
Asynchron Erforderlich für PDFs Optional — Task.Run() Wrapper
Stapelverarbeitung Erfordert Ratenbegrenzungsmanagement (Standard: 5 Transaktionen pro Sekunde). Unbegrenzte Parallel.ForEach
Vorverarbeitung
Automatische Entzerrung Nicht ausgesetzt input.Deskew()
Rauschunterdrückung Intern (nicht konfigurierbar) input.DeNoise()
Kontrastverbesserung Intern (nicht konfigurierbar) input.Contrast()
Auflösungsverbesserung Intern (nicht konfigurierbar) input.EnhanceResolution(300)
Binärisierung Intern input.Binarize()
Ausgabeformate
Klartext Ja Ja
Durchsuchbares PDF Nein result.SaveAsSearchablePdf(path)
hOCR Nein result.SaveAsHocrFile(path)
Strukturiertes JSON Über Blockserialisierung result.Words / result.Lines
Einsatz
Vor Ort Nein Ja
Luftgetrennt Nein Ja
Docker Ja (mit eingefügten AWS-Zugangsdaten) Ja (keine Anmeldeinformationen erforderlich)
AWS Lambda Native Unterstützt
Azure Ja Ja
Linux Ja (AWS-verwaltet) Ja — get-started/linux/
Konformität
HIPAA Erfordert eine BAA mit AWS Kein externer Prozessor
DSGVO Daten werden in AWS-Regionen übertragen Die Daten bleiben innerhalb der Grenzen.
ITAR Ohne Sondergenehmigung verboten. Vollständig vor Ort
Luftgetrennt / CMMC Level 3 Nicht möglich Unterstützt

Kosten im Maßstab

Das Preismodell pro Seite ist die bestimmende strukturelle Einschränkung von AWS Textract. Kosten, die pro Seite klein erscheinen, summieren sich erheblich im Rahmen eines realen Dokumentenablaufs.

AWS Textract-Ansatz

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

Konsultieren Sie die AWS Textract Preisgestaltungsseite für aktuelle Per-Seiten-Tarife. Unterschiedliche API-Features (grundlegende Textdetektion, Tabellenauszug, Formularauszug) haben unterschiedliche Tarife. Ein Dokument, das Tabellen und Formularfelder enthält, zieht höhere Gebühren als die Grundtextdetektion nach sich, und Kosten wachsen mit dem Volumen ohne Obergrenze und ohne Möglichkeit, im Voraus zu zahlen.

Bei hohem Seitenvolumen können die Gesamtkosten über drei Jahre erheblich sein, und das Zählen läuft weiter.

IronOCR-Ansatz

// One license.Neinper-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.Neinper-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.Neinper-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

Die $2,999 Professional-Lizenz deckt 10 Entwickler, unbegrenzte Projekte und unbegrenztes Seitenvolumen ab. Nach dem ersten Jahr fallen keine weiteren Kosten mehr für die Verarbeitung der Seiten an. Für Teams, die erhebliche Seitenvolumina bearbeiten, zahlt sich die IronOCR-Lizenz schnell im Vergleich zu fortlaufenden Cloud-Kosten pro Seite aus.

Die IronOCR -Lizenzseite enthält Informationen zu den Lizenzstufen, SaaS-Abonnementoptionen für nutzungsbasierte Abrechnungsszenarien und OEM-Weitervertriebsbedingungen.

Datensouveränität und Compliance

Die Architektur von AWS Textractmacht eine Garantie unmöglich: dass Ihre Dokumente innerhalb Ihrer Infrastruktur bleiben. Bei jedem OCR-Vorgang werden Dokumentinhalte an die Server von Amazon übertragen.

AWS Textract-Ansatz

// 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 bietet eine HIPAA-Geschäftspartnervereinbarung für betroffene Einrichtungen an, und GovCloud-Regionen bieten eine FedRAMP High-Autorisierung. Diese Frameworks ändern nichts an der grundlegenden Architektur: Dokumente verlassen bei jeder Operation Ihre Infrastruktur. Bei ITAR-kontrollierten technischen Daten handelt es sich nicht um eine Frage der Compliance, sondern um ein Verbot. Für CMMC Level 3-Workloads mit CUI erfordert die Cloud-Übertragung spezielle Autorisierungen, über die die meisten Rüstungsunternehmen nicht verfügen. Für luftabgeschottete Systeme – Forschungsnetzwerke, industrielle Kontrollumgebungen, klassifizierte Einrichtungen – ist Textract schlichtweg nicht verfügbar.

AWS Textract ist in sechs Regionen verfügbar: us-east-1, us-west-2, eu-west-1, eu-west-2, ap-southeast-1 und ap-southeast-2. Organisationen, deren Datenspeicherungsanforderungen außerhalb dieser Regionen liegen, haben keine konforme Option.

IronOCR-Ansatz

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

Da IronOCR lokal ausgeführt wird, fügt es sich nahtlos in Arbeitsabläufe im Gesundheitswesen ein, die PHI verarbeiten, in Rechtsdokumentensysteme, die vertrauliche Kommunikation handhaben, in Finanzanwendungen, die Zahlungskartenbilder verarbeiten, und in die Pipelines von Verteidigungsunternehmen, die CUI verarbeiten. Es gibt keinen externen Prozessor, der geprüft werden müsste, keine BAA, die ausgehandelt werden müsste, und keine Datenresidenzbeschränkungen, die erfüllt werden müssten. Der Geltungsbereich der Compliance bezieht sich auf die Infrastruktur Ihres Unternehmens.

Für Teams, die auf AWS-Infrastruktur arbeiten, aber eine lokale Verarbeitung benötigen, läuft IronOCRauf AWS EC2 und Lambda ohne Abhängigkeit von Textract – die Verarbeitung findet innerhalb der Grenzen Ihres eigenen AWS-Kontos statt und nicht im verwalteten Dienst von Amazon.

Asynchrones Polling vs. synchrone Verarbeitung

Die architektonische Trennung zwischen den synchronen (Einzelbild) und asynchronen (mehrseitigen PDF) APIs von Textract ist kein unbedeutendes API-Detail. Es prägt die Art und Weise, wie Dienste entwickelt werden, wie mit Fehlern umgegangen wird und wie viel Code die Wartungsfachleute lesen und analysieren müssen.

AWS Textract-Ansatz

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

Dies ist kein Standardtext, der einmal erstellt und dann vergessen werden kann. Wenn ein Textract-Job während der Ausführung fehlschlägt, muss die S3-Bereinigung trotzdem ausgeführt werden. Wenn ein Auftrag nach 10 Minuten abbricht, benötigt der Aufrufer eine saubere Fehlermeldung. Wenn die Netzwerkverbindung während des Abfragevorgangs abbricht, darf die Wiederholungsstrategie keine doppelten Aufträge erzeugen. Jeder dieser Fehlermodi erfordert eine explizite Behandlung – die oben dargestellte Struktur ist die minimale, verantwortungsvolle Implementierung.

Stapelverarbeitung fügt eine weitere Schicht hinzu: Textracts Standard-StartDocumentTextDetection TPS-Limit ist 5 Anfragen pro Sekunde. Für die Verarbeitung von 100 Dokumenten sind ein SemaphoreSlim Drosselungs-, ein Ratenauffüllungs-Timer und eine Wiederholungslogik für ProvisionedThroughputExceededException erforderlich.

IronOCR-Ansatz

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

Es gibt keine Abfrageschleife, keine Job-ID-Verfolgung, keinen S3-Bucket und keine Ergebnispaginierung. Derselbe Code verarbeitet sowohl ein einzelnes JPEG als auch ein 200-seitiges PDF. Die Verarbeitung wird abgeschlossen oder es wird ein Fehler ausgelöst – es gibt keinen Zwischenzustand "in Bearbeitung", der verwaltet werden müsste. Für die Stapelverarbeitung ist IronOCR thread-sicher und eine einzige IronTesseract Instanz behandelt Parallel.ForEach ohne Sperren oder Semaphore.

Die IronTesseract-Einrichtungsanleitung behandelt die Konfiguration, und die PDF-Eingabeanleitung dokumentiert die Seitenbereichsauswahl, passwortgeschützte PDFs und die stream-basierte Eingabe für PDFs, die aus Datenbanken oder HTTP-Antworten abgerufen werden.

Overhead für die Verwaltung von Anmeldeinformationen

Um einen OCR-Vorgang mit AWS Textractzu starten, ist eine IAM-Konfiguration erforderlich, bevor auch nur eine einzige Seite verarbeitet werden kann.

AWS Textract-Ansatz

Bevor DetectDocumentTextAsync aufgerufen wird, muss ein Entwickler:

  1. Erstellen Sie ein AWS-Konto oder verschaffen Sie sich Zugriff auf ein bestehendes Konto.
  2. Erstellen Sie einen IAM-Benutzer oder eine Rolle mit textract:DetectDocumentText und textract:AnalyzeDocument Berechtigungen
  3. Generieren und sicher speichern Sie die Zugriffsschlüssel-ID und den geheimen Zugriffsschlüssel.
  4. Konfigurieren Sie die Auflösung der Anmeldeinformationen – Umgebungsvariablen, AWS-Anmeldeinformationsdatei oder EC2-Instanzprofil
  5. Wenn PDFs verarbeitet werden: Erstellen Sie einen S3-Bucket, konfigurieren Sie die Bucket-Richtlinie, fügen Sie s3:PutObject und s3:DeleteObject Berechtigungen hinzu
  6. Implementieren Sie Richtlinien zur Rotation von Anmeldeinformationen, um die Sicherheitsstandards zu erfüllen.
  7. Speichern Sie Anmeldeinformationen sicher in jeder Bereitstellungsumgebung – Docker-Secrets, Kubernetes-Secrets, AWS Secrets Manager oder CI/CD-Pipeline-Variablen.
// 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

Wenn Anmeldeinformationen ablaufen, rotieren oder falsch konfiguriert sind, schlägt jeder OCR-Aufruf mit AmazonTextractException fehl, der ErrorCode == "AccessDeniedException" enthält. In einem Produktionssystem bedeutet dies die Implementierung spezifischer Abfangmechanismen für Anmeldefehler und die Überwachung von IAM-Richtlinienabweichungen.

IronOCR-Ansatz

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

Der Lizenzschlüssel ist eine statische Zeichenkette. Es läuft nicht während des Betriebs ab, erfordert keine Rotation und beinhaltet keine Verwaltungsberechtigungen. Ein Docker-Container, der Dokumente verarbeitet, benötigt keine injizierten AWS-Anmeldeinformationen, keine an einen Ausführungskontext gebundene IAM-Rolle und keinen Netzwerkzugriff auf AWS STS zur Tokenaktualisierung.

Die vollständige Reduzierung des Anmeldeinformationen-Aufwands beim Wechsel von Textract zu IronOCR: Drei NuGet-Pakete entfernt (AWSSDK.Textract, AWSSDK.S3, AWSSDK.Core), alle AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY / AWS_DEFAULT_REGION Umgebung Variablen entfernt, und IAM-Rollen und S3-Bucket-Konfigurationen außer Betrieb genommen. Die Anleitungen zur Bild- und Stream-Eingabe decken die gesamte Bandbreite der Eingabemethoden ab, die die Byte-Array- und S3-Objekt-Dokumentmodelle von Textract ersetzen.

API-Mapping-Referenz

AWS Textract-API IronOCR-Äquivalent
AmazonTextractClient IronTesseract
AmazonS3Client Nicht erforderlich
DetectDocumentTextRequest OcrInput
DetectDocumentTextResponse OcrResult
AnalyzeDocumentRequest OcrInput mit CropRectangle für Zonen
StartDocumentTextDetectionRequest OcrInput — synchron, kein Start erforderlich
GetDocumentTextDetectionRequest Nicht erforderlich – sofortige Ergebnisse
Document.Bytes input.LoadImage(bytes) oder input.LoadImage(stream)
S3Object (Dokumentenstaging) Dateipfadzeichenfolge oder -stream
Block (BlockType.LINE) result.Lines
Block (BlockType.WORD) result.Words
Block (BlockType.TABLE) Wortpositionsgruppierung über result.Words
Block (BlockType.KEY_VALUE_SET) CropRectangle Regionsextraktion
Block.Confidence word.Confidence / result.Confidence
JobStatus.SUCCEEDED Nicht zutreffend – synchrone Rückgabe
JobStatus.IN_PROGRESS Nicht anwendbar – kein asynchroner Zustand
response.NextToken (Paginierung) Nicht zutreffend – Ergebnisse nicht paginiert
ProvisionedThroughputExceededException Nicht anwendbar – keine Drosselklappenpotentiometer-Grenzwerte
client.DetectDocumentTextAsync(request) ocr.Read(path)
client.AnalyzeDocumentAsync(request) ocr.Read(input)
client.StartDocumentTextDetectionAsync(request) ocr.Read(input)
client.GetDocumentTextDetectionAsync(request) Nicht zutreffend

Wenn Teams einen Wechsel von AWS Textractzu IronOCR erwägen

Wenn die monatliche Rechnung zu einem Budgetposten wird

Teams, die mit Textract bei geringem Volumen begonnen haben, stoßen oft auf einen bestimmten Moment: Die AWS-Rechnung für die OCR-Verarbeitung taucht bei einer vierteljährlichen Budgetprüfung auf und jemand fragt, ob diese Kosten fix sind. Das ist es nicht. Bei hohen Seitenvolumina können die jährlichen Textract-Kosten beträchtlich sein — konsultieren Sie die AWS Textract-Preisgestaltungsliste für aktuelle Tarife. Die IronOCR Professional-Lizenz bei $2,999 einmalig refinanziert sich schnell bei moderaten bis hohen Seitenvolumen.

Wenn eine Compliance-Anforderung die Cloud-Verarbeitung blockiert

Bei der Implementierung von Workflows zur Dokumentendigitalisierung stellen Organisationen im Gesundheitswesen häufig erst mitten im Projekt fest, dass HIPAA-geschützte Gesundheitsdaten (PHI) nicht ohne eine BAA (Business Associate Agreement) und eine zusätzliche rechtliche Prüfung über Cloud-Dienste fließen können oder dass ihr Sicherheitsteam die Cloud-Übertragung gänzlich untersagt. Auftragnehmer im Verteidigungsbereich, die mit technischen Zeichnungen, Spezifikationen oder CUI (Controlled Unclassified Information) arbeiten, unterliegen ITAR- und CMMC-Beschränkungen, die AWS Textractvon der Berücksichtigung ausschließen. Rechtsanwaltskanzleien, die vertrauliche Kommunikation verarbeiten, haben ähnliche Bedenken. Hierbei handelt es sich nicht um theoretische Grenzfälle der Compliance – sie treten regelmäßig bei Beschaffungsprüfungen, Sicherheitsaudits und Vertragsverhandlungen auf.IronOCR verarbeitet Daten lokal, daher reduziert sich die Frage der Compliance für Dokumentendaten darauf, ob Ihre eigene Infrastruktur in den Geltungsbereich fällt, und nicht darauf, ob die Infrastruktur von Amazon in den Geltungsbereich fällt.

Wenn die Komplexität des asynchronen PDFs ihren Wert überschreitet

Die fünfphasige S3-async-Pipeline – Hochladen, Job starten, Abfragen, Paginieren der Ergebnisse, Aufräumen – ist technisch nicht schwierig zu implementieren. Es ist schwierig zu warten, zu testen und zu betreiben. Jede Phase birgt ein potenzielles Fehlerrisiko. Bei S3-Upload-Fehlern ist eine Wiederholungslogik erforderlich. Bei Fehlern im Textract-Prozess muss zwischen vorübergehenden und permanenten Fehlern unterschieden werden. Bei Abfrage-Timeouts ist eine separate Timeout-Behandlung von der Abbruchbehandlung erforderlich. Die Ergebnispaginierung erfordert das Sammeln von Zuständen über mehrere API-Aufrufe hinweg. Fehler bei der S3-Bereinigung erfordern eine Benachrichtigung, da verwaiste Objekte Kosten verursachen. Teams, die diese Pipeline in die Produktion überführt haben, verbringen in der Regel mehr Zeit mit der laufenden Wartung als mit der Entwicklung. Das IronOCR-Äquivalent — input.LoadPdf(path) gefolgt von ocr.Read(input) — eliminiert alle fünf Phasen und ihre damit verbundenen Ausfallmodi.

Wenn Bereitstellungsumgebungen keinen Internetzugang haben

Docker-Container, die in isolierten Netzwerksegmenten laufen, lokale Server ohne ausgehende Internetverbindung, abgeschottete Forschungsumgebungen und industrielle Systeme mit strengen Netzwerkkontrollen haben alle eine Gemeinsamkeit: AWS Textractist nicht verfügbar.IronOCR wird als Standard NuGet Paket installiert und funktioniert nach der Installation ohne Netzwerkaufrufe. Teams, die .NET Anwendungen in diesen Umgebungen ausführen, haben keine Textract-Option und benötigen eine Bibliothek, die lokal verarbeitet. Der Docker-Bereitstellungsleitfaden und der Linux-Bereitstellungsleitfaden beschreiben die spezifische Konfiguration für containerisierte Umgebungen.

Wenn die Drosselung der Datenrate Batch-Workflows stört

Das Standard-StartDocumentTextDetection TPS-Limit beträgt 5 Anfragen pro Sekunde. DetectDocumentText synchrone Anrufe sind ebenfalls ratengesetzt. Batch-Jobs, die Hunderte oder Tausende von Dokumenten verarbeiten, müssen SemaphoreSlim Drosselung, exponentielles Backoff bei ProvisionedThroughputExceededException und Ratenauffüllungstimer implementieren. AWS unterstützt Anträge auf Erhöhung des TPS-Limits, diese erfordern jedoch eine Begründung, eine Überprüfung und können nicht garantiert werden.IronOCR verarbeitet so schnell, wie es die lokale CPU zulässt – ein Server mit 32 Kernen verarbeitet 32 ​​Dokumente gleichzeitig ohne Drosselungskonfiguration oder Service-Tier-Aushandlung.

Gemeinsame Überlegungen zur Migration

Ersetzen des Blockgraphen durch direkte Sammlungen

Textract stellt alle Ergebnisse als flache List<Block> dar, bei denen Zeilen, Wörter, Zellen, Tabellen und Schlüsselwertpaare durch BlockType unterschieden und durch Beziehungs-ID-Arrays verknüpft sind.IronOCR bietet direkt typisierte Sammlungen.

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

Der Leitfaden für strukturierte Ergebnisse behandelt result.Pages, result.Paragraphs, result.Lines, result.Words und den koordinierten Zugriff für den Aufbau von layoutbewusster Dokumentenverarbeitung.

Ersetzen der S3-gestuften PDF-Verarbeitung durch Direct LoadPdf

Jeglicher Textract-Code, der vor Beginn eines Erkennungsauftrags Daten auf S3 hochlädt, kann durch einen direkten PDF-Ladevorgang ersetzt werden. Kein Staging-Bucket, keine Upload-Zeitsteuerung, keine Bereinigungslogik.

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

Hinzufügen einer Vorverarbeitung für Dokumente, die in Textract eine geringe Konfidenz ergaben.

Die Vorverarbeitung von Textract ist intern und nicht konfigurierbar. Wenn ein gescanntes Dokument schlechte Ergebnisse liefert, bleiben nur zwei Möglichkeiten: den Scanvorgang wiederholen oder ein Ergebnis mit geringer Zuverlässigkeit akzeptieren.IronOCR legt die Vorverarbeitungspipeline direkt offen.

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

Der Leitfaden zur Bildqualitätskorrektur und das Tutorial zu Bildfiltern dokumentieren die gesamte Vorverarbeitungspipeline und Kombinationen, die am besten für bestimmte Dokumenttypen funktionieren. Für die Interpretation der Vertrauenswürdigkeitspunkte und den Zugriff auf elementweise Vertrauenswerte behandelt der Leitfaden für Vertrauenspunktbewertungen die result.Confidence Eigenschaft und wortgenaue Vertrauenswerte.

Umgang mit der Änderung des asynchronen zu synchronen Musters

Vorhandener Textract-Code ist notwendigerweise async Task<t> im gesamten, da das SDK nur asynchron ist. Die Operationen von IronOCR sind synchron. Für Anwendungscode, der bereits eine asynchrone Aufrufkette hat, umschließen Sie den IronOCR-Aufruf in Task.Run, um die asynchrone Grenze beizubehalten.

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

Dies ist eine optionale Verpackung, keine Pflicht. Bei serverseitiger Verarbeitung, bei der der aufrufende Code bereits in einem Hintergrundthread ausgeführt wird, ist der synchrone Aufruf direkt vorzuziehen.

Zusätzliche Funktionen von IronOCR

Über die oben genannten Vergleichspunkte hinaus bietet IronOCR Funktionen, die kein Äquivalent zu AWS Textracthaben:

  • Barcodes beim OCR-Lesen: Setzen Sie ocr.Configuration.ReadBarCodes = true und Barcodes im Dokument werden zusammen mit dem Text in einem Durchgang extrahiert — kein separater Barcode-Scan-Schritt
  • Fortschrittsverfolgung für lange Aufträge : Abonnieren Sie Fortschrittsereignisse für die Verarbeitung mehrseitiger Daten, ohne einen externen Dienst abzufragen.
  • Verarbeitung gescannter Dokumente : Optimierte Pipeline für typische Büroscannerausgaben, einschließlich Duplexscans und Seiten mit unterschiedlicher Ausrichtung.
  • Mehrsprachige gleichzeitige Extraktion: Kombinieren Sie Sprachpakete zur Lesezeit — OcrLanguage.French + OcrLanguage.German — ohne Änderung der API-Stufe
  • Pass- und Ausweislesen : Spezielle Pipeline für maschinenlesbare Bereiche auf Ausweisdokumenten, die strukturierte Felder ohne manuelle Bereichsdefinition extrahiert.

.NET-Kompatibilität und Zukunftsfähigkeit

IronOCR zielt auf .NET 8 und .NET 9 ab und bietet aktive Kompatibilität for .NET Standard 2.0-Projekte sowie .NET Framework 4.6.2 bis 4.8. Die Bibliothek liefert native Binärdateien für Windows x64, Windows x86, Linuxx64 und macOS über ein einziges NuGet Paket – ohne Laufzeitidentifikatorwechsel oder plattformspezifische Paketverweise. AWS Textracts AWSSDK.Textract Paket unterstützt die gleichen modernen .NET-Ziele, aber das Bereitstellungsmodell umfasst die gesamte AWS SDK-Abhängigkeitsstruktur, IAM-Anmeldeinfrastruktur und die architektonischen Einschränkungen, die in diesem Artikel dokumentiert sind.IronOCR wird aktiv weiterentwickelt und veröffentlicht regelmäßig Updates, die die Aktualisierungen der Tesseract 5-Engine und die Fortschritte der .NET Laufzeitumgebung berücksichtigen, einschließlich der Kompatibilität mit .NET 10 nach dessen Veröffentlichung.

Abschluss

AWS Textract und IronOCR lösen das gleiche Problem – das Extrahieren von Text aus Dokumenten in .NET -Anwendungen – mit grundlegend inkompatiblen architektonischen Annahmen. Textract geht davon aus, dass Dokumente Ihr Netzwerk verlassen können, dass die Kosten für Cloud-Dienste linear mit dem Volumen skalieren und dass mehrseitige PDFs eine fünfphasige asynchrone Pipeline mit S3-Staging rechtfertigen.IronOCR geht davon aus, dass Dokumente dort bleiben, wo sie verarbeitet werden, dass die Lizenzkosten vom Volumen entkoppelt sein sollten und dass die PDF-Verarbeitung die gleichen drei Codezeilen wie die Bildverarbeitung erfordern sollte.

Die Kostenarithmetik ist die deutlichste Trennlinie. Bei niedrigem Volumen sind die Per-Pages-Gebühren von Textract zu bewältigen. Mit zunehmendem Volumen steigen die jährlichen Kosten erheblich. Bei hohen Seitenvolumen mit Tabellenextraktion können die Textract-Kosten über mehrere Jahre hinweg die Lizenzkosten von IronOCRs Unlimited-Lizenz bei $5,999 erheblich übersteigen. Das einleitende Rechnen hält: Das Per-Seiten-Modell summiert sich schnell und hört nie auf.

Datensouveränität ist die zweite strukturelle Einschränkung. Bei Arbeitsabläufen im Gesundheitswesen, im Rechtswesen, im Finanzwesen und bei Behörden ist die Frage, wo Dokumente bearbeitet werden, keine Frage der Präferenz – es handelt sich um eine gesetzliche Vorgabe.IronOCR verarbeitet Prozesse standardmäßig lokal, nicht durch Konfiguration. Es gibt keinen "lokalen Modus", der aktiviert werden könnte; Die lokale Verarbeitung ist der einzige Modus. Damit ist die Antwort in Sachen Compliance ganz einfach: Ihre Dokumente bleiben in Ihrer Infrastruktur, weil es keinen anderen Ort gibt, an den sie gelangen könnten.

Für Teams, die OCR im großen Maßstab evaluieren oder in Umgebungen arbeiten, in denen Dokumentendaten die interne Infrastruktur nicht verlassen dürfen, bietet die Dokumentation von IronOCR die vollständige API-Referenz, Bereitstellungsleitfäden für Docker, AWS, Azureund Linuxsowie Tutorials, die das gesamte Spektrum der OCR-Anwendungsfälle abdecken – von der einfachen Bilderkennung bis hin zur Generierung durchsuchbarer PDFs und der Extraktion mehrerer Sprachen.

Hinweis:AWS Textract und Tesseract sind eingetragene Marken ihrer jeweiligen Eigentümer. Diese Seite ist nicht verbunden, anerkannt oder gesponsert von Amazon Web Services oder Google. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

Häufig gestellte Fragen

Was ist Amazon Textract?

Amazon Textract ist eine OCR-Lösung, die von Entwicklern und Unternehmen verwendet wird, um Text aus Bildern und Dokumenten zu extrahieren. Es ist eine von mehreren OCR-Optionen, die neben IronOCR for .NET Application Development evaluiert wurden.

Wie ist IronOCR im Vergleich zu Amazon Textract for .NET-Entwickler?

IronOCR ist eine NuGet-native OCR-Bibliothek für .NET, die IronTesseract als Kern-Engine verwendet. Im Vergleich zu Amazon Textract bietet sie eine einfachere Bereitstellung (keine SDK-Installationsprogramme), Pauschalpreise und eine saubere C#-API ohne COM-Interop oder Cloud-Abhängigkeiten.

Ist IronOCR einfacher einzurichten als Amazon Textract?

IronOCR wird über ein einziges NuGet-Paket installiert. Es gibt keine SDK-Installationsprogramme, keine Lizenzdateien, die kopiert werden müssen, keine COM-Komponenten, die registriert werden müssen, und keine separaten Laufzeit-Binärdateien, die verwaltet werden müssen. Die gesamte OCR-Engine ist in diesem Paket enthalten.

Welche Genauigkeitsunterschiede bestehen zwischen Amazon Textract und IronOCR?

IronOCR erreicht eine hohe Erkennungsgenauigkeit für Standardgeschäftsdokumente, Rechnungen, Quittungen und gescannte Formulare. Bei stark degradierten Dokumenten oder ungewöhnlichen Skripten variiert die Genauigkeit je nach Qualität der Quelle. IronOCR enthält Bildvorverarbeitungsfilter zur Verbesserung der Erkennung bei Eingaben von geringer Qualität.

Unterstützt IronOCR die PDF-Textextraktion?

Ja, IronOCR extrahiert Text sowohl aus nativen PDF-Dateien als auch aus gescannten PDF-Bildern in einem einzigen Aufruf. Es unterstützt auch mehrseitige TIFF-Dateien, Bilder und Streams. Bei gescannten PDFs wird die OCR seitenweise mit seitenweisen Ergebnisobjekten angewendet.

Wie ist die Lizenzierung von Amazon Textract im Vergleich zu IronOCR?

IronOCR verwendet eine unbefristete Pauschallizenz, bei der keine Gebühren pro Seite oder pro Scan anfallen. Unternehmen, die große Dokumentenmengen verarbeiten, zahlen unabhängig vom Volumen die gleichen Lizenzkosten. Einzelheiten und Volumenpreise finden Sie auf der IronOCR-Lizenzierungsseite.

Welche Sprachen unterstützt IronOCR?

IronOCR unterstützt 127 Sprachen über separate NuGet-Sprachpakete. Das Hinzufügen einer Sprache erfordert einen einzigen Befehl 'dotnet add package IronOcr.Languages.{Language}'. Es ist keine manuelle Dateiablage oder Pfadkonfiguration erforderlich.

Wie installiere ich IronOCR in einem .NET -Projekt?

Installation über NuGet: 'Install-Package IronOcr' in der Paketmanager-Konsole oder 'dotnet add package IronOcr' in der CLI. Zusätzliche Sprachpakete werden auf die gleiche Weise installiert. Es ist kein natives SDK-Installationsprogramm erforderlich.

Ist IronOCR im Gegensatz zu Amazon Textract für Docker und containerisierte Bereitstellungen geeignet?

Ja, IronOCR funktioniert in Docker-Containern über sein NuGet-Paket. Der Lizenzschlüssel wird über eine Umgebungsvariable festgelegt. Für die OCR-Engine selbst sind keine Lizenzdateien, SDK-Pfade oder Volume-Mounts erforderlich.

Kann ich IronOCR im Vergleich zu Amazon Textract vor dem Kauf ausprobieren?

Ja. Der IronOCR-Testmodus verarbeitet Dokumente und liefert OCR-Ergebnisse mit einem Wasserzeichen als Overlay auf der Ausgabe. Sie können die Genauigkeit an Ihren eigenen Dokumenten überprüfen, bevor Sie eine Lizenz erwerben.

Unterstützt IronOCR neben der Textextraktion auch das Lesen von Barcodes?

IronOCR konzentriert sich auf die Textextraktion und OCR. Für das Lesen von Barcodes bietet Iron Software IronBarcode als Begleitbibliothek an. Beide sind einzeln oder als Teil des Iron Suite-Pakets erhältlich.

Ist es einfach, von Amazon Textract zu IronOCR zu migrieren?

Die Migration von Amazon Textract zu IronOCR umfasst in der Regel das Ersetzen von Initialisierungssequenzen durch IronTesseract-Instanziierung, das Entfernen des COM-Lebenszyklusmanagements und das Aktualisieren von API-Aufrufen. Die meisten Migrationen reduzieren die Code-Komplexität erheblich.

Kannaopat Udonpant
Software Ingenieur
Bevor er Software-Ingenieur wurde, absolvierte Kannapat ein PhD in Umweltressourcen an der Hokkaido University in Japan. Während seines Studiums wurde Kannapat auch Mitglied des Vehicle Robotics Laboratory, das Teil der Fakultät für Bioproduktionstechnik ist. Im Jahr 2022 nutzte er seine C#-Kenntnisse, um dem Engineering-Team von Iron Software ...
Weiterlesen

Iron-Support-Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an