IRONSOFTWAREHOME
VIDEOS

Umstellung von AWS Textract auf IronOCR

Kannaopat Udonpant
Kannapat Udonpant
Updated: 20. Juni 2026

Dieser Leitfaden führt Sie durch eine vollständige Migration von AWS Textractzu IronOCR for .NET Entwickler, die eine lokale Dokumentenverarbeitung ohne Cloud-Abhängigkeiten benötigen. Es umfasst die Entfernung der Anmeldeinformationen, die Beseitigung der asynchronen Pipeline, die Eliminierung von S3 und die spezifischen Codeersetzungen, die erforderlich sind, um jede Textract-Operation in ihr IronOCR Äquivalent zu überführen.

Warum von AWS Textractmigrieren?

AWS Textract ist ein leistungsfähiger Managed Service, aber seine Architektur verursacht Kosten – finanzieller und betrieblicher Art –, die mit dem Wachstum Ihres Dokumenten-Workloads steigen. Teams, die professionelle Dokumentenverarbeitungssysteme entwickeln, stoßen früher oder später auf all diese Reibungspunkte.

Die AWS-Zugangsdateninfrastruktur erschwert jede Bereitstellung. Jede Umgebung, in der Textract-Code ausgeführt wird, benötigt AWS-Zugangsdaten: IAM-Benutzer oder -Rolle, Zugriffsschlüssel und -geheimnis, Regionskonfiguration und – für die PDF-Verarbeitung – zusätzlich S3-Bucket-Berechtigungen. Das sind fünf separate Konfigurationsschritte, bevor die erste Seite verarbeitet wird. Produktionsbereitstellungen erfordern Richtlinien zur Drehung von Anmeldeinformationen, sichere Injektion in Docker-Container oder Kubernetes-Pods und Überwachung für AccessDeniedException, wenn IAM-Richtlinienabweichungen stille Fehler verursachen.IronOCR benötigt eine einzige Zeichenkette: einen Lizenzschlüssel, der einmalig beim Start festgelegt wird.

Preise pro Seite haben keine Obergrenze. Der Basissatz von 0,0015 $ pro Seite für DetectDocumentText ist die Untergrenze, nicht die Kosten. Jedes Dokument mit Tabellen löst AnalyzeDocument bei 0,015 $ pro Seite aus - das Zehnfache der Grundrate. Formulare kosten zusätzlich 0,05 $ pro Seite. Ein gemischter Dokumentenworkflow mit 100.000 Seiten pro Monat und Tabellenextraktion kostet 18.000 US-Dollar pro Jahr, wobei diese Zahl jedes Jahr im Januar zurückgesetzt wird. Die IronOCR Professional -Lizenz kostet einmalig 2.999 US-Dollar. Danach betragen die Kosten pro Seite unabhängig vom Umfang null.

Die asynchrone PDF-Pipeline ist eine Wartungshaftung. Das Verarbeiten eines mehrseitigen PDFs durch Textract erfordert fünf verschiedene Phasen: S3-Upload, StartDocumentTextDetection, Polling-Schleife, Paginierte Ergebnisabfrage und S3-Bereinigung. Jede Phase ist ein unabhängiger Fehlermodus, der eine eigene Fehlerbehandlung, Rückversuchsstrategie und Timeout-Management erfordert. Teams, die diese Pipeline in die Produktion überführen, berichten übereinstimmend, dass sie mehr Zeit für deren Wartung aufwenden als für deren Entwicklung.IronOCR liest eine PDF-Datei mit nur zwei Codezeilen.

Kein Internetzugang bedeutet kein Textract. Docker-Container in isolierten Netzwerksegmenten, On-Premise-Server, abgeschottete Forschungsumgebungen und industrielle Systeme mit Beschränkungen des ausgehenden Datenverkehrs haben alle eine Gemeinsamkeit: Textract ist nicht verfügbar.IronOCR wird als NuGet Paket installiert und funktioniert nach dem ersten Herunterladen des Pakets ohne Netzwerkaufrufe.

Bei jedem Aufruf verlassen Daten Ihre Infrastruktur. Jeder OCR-Vorgang mit Textract überträgt Dokumentinhalte an die Server von Amazon. Für Organisationen im Gesundheitswesen, die PHI verarbeiten, für Rüstungsunternehmen, die CUI handhaben, für Rechtsteams, die privilegierte Kommunikation verarbeiten, und für Finanzinstitute, die Zahlungskartenbilder verarbeiten, handelt es sich hierbei nicht um eine Konfigurationsoption – es handelt sich um eine architektonische Einschränkung, die den Einsatz von Textract in regulierten Umgebungen gänzlich ausschließt.IronOCR verarbeitet Prozesse auf Ihrer Hardware. Es gibt keinen Cloud-Modus zum Deaktivieren; Die lokale Verarbeitung ist der einzige Modus.

Ratenbegrenzungen beschränken den Batch-Durchsatz. Das Standard-StartDocumentTextDetection TPS-Limit beträgt 5 Anfragen pro Sekunde. Batch-Jobs, die Hunderte von Dokumenten verarbeiten, erfordern SemaphoreSlim Drosselung, exponentielles Zurückgehen bei ProvisionedThroughputExceededException und Ratenauffüllungs-Timer. Für die Beantragung einer Erhöhung der Transaktionsanzahl pro Sekunde (TPS) ist ein formeller AWS-Supportfall erforderlich, dessen Ausgang nicht garantiert ist.IronOCR verarbeitet so schnell, wie es die lokale CPU erlaubt - ein 16-Kern-Server verarbeitet 16 Dokumente gleichzeitig mit einem einfachen Parallel.ForEach, keine Dienststufenaushandlung erforderlich.

Das grundsätzliche Problem

Jeder Textract-Einsatz beginnt mit dieser Zeremonie – bevor auch nur eine einzige Seite verarbeitet werden kann:

// Textract: five environment variables, an IAM role, and an S3 bucket
// — all required before the first OCR call

// Environment must have:
//   AWS_ACCESS_KEY_ID=AKIA...
//   AWS_SECRET_ACCESS_KEY=...
//   AWS_DEFAULT_REGION=us-east-1
//   IAM role: textract:DetectDocumentText, textract:AnalyzeDocument
//   IAM role: s3:PutObject, s3:DeleteObject (for any PDF processing)
//   S3 bucket: my-textract-staging-bucket (with lifecycle policy to prevent cost accumulation)

public class TextractOcrService
{
    private readonly AmazonTextractClient _textractClient;
    private readonly AmazonS3Client _s3Client; // required for PDFs

    public TextractOcrService()
    {
        // Fails with AmazonClientException if credentials not found in chain
        _textractClient = new AmazonTextractClient(Amazon.RegionEndpoint.USEast1);
        _s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);
    }
}
C#

IronOCR ersetzt die gesamte Anmeldeinformationskette durch eine einzige Zuweisung:

// IronOCR: one line, one string, done
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// Or from environment (no IAM, no rotation, no S3)
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
C#

##IronOCR vs. AWS Textract: Funktionsvergleich

Die folgende Tabelle vergleicht die Fähigkeiten beider Bibliotheken anhand der für Migrationsentscheidungen relevantesten Dimensionen.

FeatureAWS TextractIronOCR
BearbeitungsortAmazon Cloud (obligatorisch)Nur lokal / vor Ort
Internet erforderlichStetsNiemals
Einrichtung der AnmeldeinformationenIAM-Benutzer/Rolle + optionaler S3-BucketEinzelner Lizenzschlüssel
Mehrseitiges PDFErfordert S3-Staging + asynchronen JobDirekte synchrone input.LoadPdf()
Passwortgeschütztes PDFNicht unterstütztinput.LoadPdf(path, Password: "x")
Multi-Frame TIFFNicht unterstütztinput.LoadImageFrames("multi.tiff")
Asynchrone Abfrage erforderlichJa (für alle PDFs)Nein – standardmäßig synchron.
Ratengrenzen5 TPS Standard (StartDocumentTextDetection)Keine – nur CPU-gebunden
Kosten pro Seite0,0015–0,065 US-Dollar pro Seite0 € nach Lizenzkauf
Automatische VorverarbeitungIntern, nicht konfigurierbarEntzerren, Rauschen entfernen, Kontrast erhöhen, Binärisierung, Schärfen, Skalieren
Durchsuchbare PDF-AusgabeNicht verfügbarresult.SaveAsSearchablePdf()
hOCR-ExportNicht verfügbarresult.SaveAsHocrFile()
Barcode-LesungNicht verfügbarocr.Configuration.ReadBarCodes = true
Regionsbasierte OCRÜber AnalyzeDocument + BlockbeziehungenCropRectangle(x, y, width, height)
Strukturierte ErgebnisseFlache List<Block> gefiltert nach BlockTypeTypisierte Pages, Paragraphs, Lines, Words
Unterstützte SprachenEnglischsprachige Vorliebe (weitere auswählen)Über 125 Sprachpakete via NuGet
Mehrsprachige SimultanübertragungNicht unterstütztOcrLanguage.French + OcrLanguage.German
Air-Gapped-EinsatzNicht möglichVollständig unterstützt
HIPAA ohne BAANicht möglichKein externer Prozessor – nur lokal
Docker-BereitstellungErfordert die Eingabe von AWS-AnmeldeinformationenKeine Anmeldeinformationen erforderlich – einfaches NuGet Paket
PlattformübergreifendAWS-verwaltet (nur Linux)Windows, Linux, macOS, Docker, Azure, AWS EC2
LizenzierungsmodellAbrechnung pro Seite (laufende Kosten)Unbefristetes einmaliges ($999 / 1.499 $ / 2.999 $)

Schnellstart: Migration von AWS Textractzu IronOCR

Schritt 1: Ersetzen des NuGet-Pakets

Entfernen Sie die AWS SDK-Pakete:

dotnet remove package AWSSDK.Textract
dotnet remove package AWSSDK.S3
dotnet remove package AWSSDK.Core
SHELL

Installieren Sie IronOCR über NuGet :

dotnet add package IronOcr

Schritt 2: Namespaces aktualisieren

Ersetzen Sie alle AWS-Namespace-Importe durch den einzelnen IronOCR Namespace:

// Before (AWS Textract)
using Amazon.Textract;
using Amazon.Textract.Model;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.Runtime;

// After (IronOCR)
using IronOcr;
C#

Schritt 3: Lizenz initialisieren

Fügen Sie die Lizenzinitialisierung einmalig beim Anwendungsstart hinzu. Entfernen Sie alle eingerichteten AWS-Anmeldeinformationsumgebungsvariablen.

// Remove from startup:
//   AWS_ACCESS_KEY_ID environment variable
//   AWS_SECRET_ACCESS_KEY environment variable
//   AWS_DEFAULT_REGION environment variable
//   ~/.aws/credentials file entries
//   IAM role bindings on the execution context

// Add instead:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
C#

Beispiele für die Code-Migration

Ersetzen des AmazonTextractClient-Konstruktors und der IAM-Konfiguration

Die sichtbarste Änderung bei der Migration ist die Clientinitialisierung. Textract benötigt einen Client mit Dependency Injection und zugrundeliegender Credential Resolution – das heißt, sowohl der Client als auch alle seine Abhängigkeiten müssen in jeder Bereitstellungsumgebung vorkonfiguriert sein. Jede Fehlkonfiguration schlägt leise fehl, bis der erste OCR-Aufruf AmazonClientException auslöst.

AWS Textract-Ansatz:

// Requires: NuGet AWSSDK.Textract, AWSSDK.S3
// Requires: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION in environment
// Requires: IAM policy with textract:* and s3:PutObject, s3:DeleteObject

using Amazon.S3;
using Amazon.Textract;

public class DocumentOcrService
{
    private readonly AmazonTextractClient _textractClient;
    private readonly AmazonS3Client _s3Client;
    private readonly string _stagingBucket;

    public DocumentOcrService(IConfiguration config)
    {
        // Credential chain: environment → ~/.aws/credentials → EC2 instance profile
        // Fails if none found — runtime exception, not compile-time
        _textractClient = new AmazonTextractClient(Amazon.RegionEndpoint.USEast1);
        _s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1);
        _stagingBucket = config["Textract:StagingBucket"]; // bucket must exist and have permissions
    }

    public async Task<string> ReadImageAsync(string imagePath)
    {
        var bytes = File.ReadAllBytes(imagePath);
        var response = await _textractClient.DetectDocumentTextAsync(
            new DetectDocumentTextRequest
            {
                Document = new Document { Bytes = new MemoryStream(bytes) }
            });

        return string.Join("\n", response.Blocks
            .Where(b => b.BlockType == BlockType.LINE)
            .Select(b => b.Text));
    }
}
C#

IronOCR Ansatz:

// Requires: NuGet IronOcr
// Requires: one license key string — nothing else

using IronOcr;

public class DocumentOcrService
{
    private readonly IronTesseract _ocr;

    public DocumentOcrService()
    {
        IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"; // or set at Program.cs startup
        _ocr = new IronTesseract();
    }

    public string ReadImage(string imagePath)
    {
        // No credential chain, no region, no bucket — just read
        return _ocr.Read(imagePath).Text;
    }
}
C#

Die gesamte AWS-Anmeldeinfrastruktur – IAM-Rollen, Umgebungsvariablen, ~/.aws/credentials-Dateien, S3-Bucket-Lebenszyklusrichtlinien und Regionskonfiguration – wird entfernt. Der DocumentOcrService-Konstruktor wechselt von einer 3-Abhängigkeiten-Injektionsstelle mit Laufzeit-Fehlermodi zu einer einzigen Lizenzzuweisung. Für Details zu den Bereitstellungsmustern siehe den IronTesseract-Einrichtungsleitfaden .

Ersetzen von StartDocumentTextDetection durch TIFF-Mehrbildverarbeitung

Die asynchrone Job-API von Textract (StartDocumentTextDetection) wird für jedes mehrseitige Dokument benötigt. Ein gängiges Muster bei der Digitalisierung von Dokumenten ist der Empfang gescannter Dokumente als Multi-Frame-TIFFs – ein Frame pro gescannter Seite. Textract kann TIFF-Eingaben überhaupt nicht direkt verarbeiten; Das Dokument muss in das PDF-Format konvertiert und in S3 hochgeladen werden, bevor ein Auftrag beginnen kann.IronOCR liest TIFF-Dateien mit mehreren Einzelbildern nativ.

AWS Textract-Ansatz:

// Textract cannot accept TIFF directly — requires PDF conversion + S3 + async job
// This shows the conversion overhead plus the minimum async pipeline

using Amazon.S3;
using Amazon.S3.Model;
using Amazon.Textract;
using Amazon.Textract.Model;

public async Task<string> ProcessScannedTiffAsync(string tiffPath, string s3Bucket)
{
    // Step 0: Convert TIFF to PDF first (Textract does not accept TIFF for async jobs)
    // Requires a separate PDF conversion library — not shown here
    var pdfPath = Path.ChangeExtension(tiffPath, ".pdf");
    ConvertTiffToPdf(tiffPath, pdfPath); // external dependency required

    // Step 1: Upload converted PDF to S3
    var s3Key = $"staging/{Guid.NewGuid()}.pdf";
    using (var stream = File.OpenRead(pdfPath))
    {
        await _s3Client.PutObjectAsync(new PutObjectRequest
        {
            BucketName = s3Bucket,
            Key = s3Key,
            InputStream = stream
        });
    }

    try
    {
        // Step 2: Start async detection job
        var startResp = await _textractClient.StartDocumentTextDetectionAsync(
            new StartDocumentTextDetectionRequest
            {
                DocumentLocation = new DocumentLocation
                {
                    S3Object = new S3Object { Bucket = s3Bucket, Name = s3Key }
                }
            });

        // Step 3: Poll every 5 seconds — can block for 30–120 seconds on large files
        GetDocumentTextDetectionResponse pollResp;
        do
        {
            await Task.Delay(5000);
            pollResp = await _textractClient.GetDocumentTextDetectionAsync(
                new GetDocumentTextDetectionRequest { JobId = startResp.JobId });
        } while (pollResp.JobStatus == JobStatus.IN_PROGRESS);

        if (pollResp.JobStatus != JobStatus.SUCCEEDED)
            throw new Exception($"Job failed: {pollResp.StatusMessage}");

        // Step 4: Collect paginated results
        var text = new StringBuilder();
        string token = null;
        do
        {
            var page = await _textractClient.GetDocumentTextDetectionAsync(
                new GetDocumentTextDetectionRequest
                {
                    JobId = startResp.JobId,
                    NextToken = token
                });
            foreach (var block in page.Blocks.Where(b => b.BlockType == BlockType.LINE))
                text.AppendLine(block.Text);
            token = page.NextToken;
        } while (token != null);

        return text.ToString();
    }
    finally
    {
        // Step 5: Clean up S3 — orphaned objects accumulate storage costs
        await _s3Client.DeleteObjectAsync(s3Bucket, s3Key);
        File.Delete(pdfPath); // clean up intermediate PDF
    }
}
C#

IronOCR Ansatz:

//IronOCR reads multi-frame TIFF directly — no conversion, no S3, no polling

using IronOcr;

public string ProcessScannedTiff(string tiffPath)
{
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath); // reads all frames natively

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

    // Access per-page results if needed
    foreach (var page in result.Pages)
        Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words detected");

    return result.Text;
}
C#

Der TIFF-zu-PDF-Konvertierungsschritt, der S3-Upload, die asynchrone Abfrageschleife, die paginierte Ergebnisakkumulation und die S3-Bereinigung werden allesamt eliminiert. Die IronOCR-Implementierung liest Frames direkt und bietet seitenweisen Zugriff durch result.Pages ohne Zwischenformatkonvertierung. Der Leitfaden zur TIFF- und GIF-Eingabe behandelt die Auswahl von Einzelbildern für Fälle, in denen nur eine Teilmenge der Einzelbilder benötigt wird.

Ersetzen von S3-Staging durch durchsuchbare PDF-Ausgabe

Ein typischer Anwendungsfall für Textract ist die Umwandlung gescannter PDF-Archive in ein durchsuchbares Format. Der Textract-Ansatz erfordert das Hochladen jeder PDF-Datei auf S3, das Ausführen des asynchronen Jobs, das Sammeln des extrahierten Textes und anschließend die Verwendung einer separaten PDF-Bibliothek, um diesen Text als durchsuchbare Ebene einzubetten.IronOCR führt den Scan durch und erstellt in einem einzigen Aufruf eine durchsuchbare PDF-Datei.

AWS Textract-Ansatz:

// Textract extracts text but cannot produce searchable PDFs
// Requires: S3 upload + async job + separate PDF library to embed the text layer

using Amazon.S3;
using Amazon.S3.Model;
using Amazon.Textract;
using Amazon.Textract.Model;

public async Task<string> ExtractTextForSearchableLayerAsync(
    string scannedPdfPath,
    string s3Bucket)
{
    // Must upload to S3 — cannot pass PDF bytes directly for async jobs
    var key = $"ocr-input/{Guid.NewGuid()}.pdf";

    await using (var fs = File.OpenRead(scannedPdfPath))
    {
        await _s3Client.PutObjectAsync(new PutObjectRequest
        {
            BucketName = s3Bucket,
            Key = key,
            InputStream = fs,
            ContentType = "application/pdf"
        });
    }

    string jobId;
    try
    {
        var startResp = await _textractClient.StartDocumentTextDetectionAsync(
            new StartDocumentTextDetectionRequest
            {
                DocumentLocation = new DocumentLocation
                {
                    S3Object = new S3Object { Bucket = s3Bucket, Name = key }
                }
            });
        jobId = startResp.JobId;
    }
    catch
    {
        await _s3Client.DeleteObjectAsync(s3Bucket, key);
        throw;
    }

    // Poll — minimum 5s wait; typical 15–60s for a 10-page PDF
    GetDocumentTextDetectionResponse pollResp;
    int pollAttempts = 0;
    const int maxAttempts = 120; // 10 minute timeout

    do
    {
        await Task.Delay(5000);
        pollResp = await _textractClient.GetDocumentTextDetectionAsync(
            new GetDocumentTextDetectionRequest { JobId = jobId });

        if (++pollAttempts >= maxAttempts)
            throw new TimeoutException("Textract job timed out after 10 minutes");

    } while (pollResp.JobStatus == JobStatus.IN_PROGRESS);

    await _s3Client.DeleteObjectAsync(s3Bucket, key); // cleanup regardless of outcome

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

    // Return extracted text — caller must use a separate library to produce searchable PDF
    return string.Join("\n", pollResp.Blocks
        .Where(b => b.BlockType == BlockType.LINE)
        .Select(b => b.Text));

    // Caller still needs: iTextSharp, PdfSharp, or similar to embed text layer
}
C#

IronOCR Ansatz:

//IronOCR reads the PDF and produces a searchable PDF output directly
// No S3, no polling, no external PDF library needed

using IronOcr;

public void ConvertToSearchablePdf(string scannedPdfPath, string outputPath)
{
    var ocr = new IronTesseract();

    using var input = new OcrInput();
    input.LoadPdf(scannedPdfPath);

    var result = ocr.Read(input);

    // Embed extracted text as searchable layer in one call
    result.SaveAsSearchablePdf(outputPath);

    Console.WriteLine($"Pages processed: {result.Pages.Length}");
    Console.WriteLine($"Overall confidence: {result.Confidence:F1}%");
}
C#

Die Logik für das Polling-Timeout, das S3-Upload- und Bereinigungsmuster sowie die Abhängigkeit von der externen PDF-Bibliothek sind entfallen. SaveAsSearchablePdf bettet den erkannten Text direkt in die Ausgabedatei ein und macht jede gescannte Seite volltextdurchsuchbar ohne eine zweite Bibliothek. Der durchsuchbare PDF-Leitfaden behandelt Seitenauswahl, Komprimierungsoptionen und Metadateneinbettung. Für einen umfassenderen Kontext von PDF-OCR-Pipelines siehe den PDF-Eingabeleitfaden .

Ersetzen der AnalyzeDocument-Blockgraphendurchlaufung durch strukturierte Seitenergebnisse

Textracts AnalyzeDocument mit TABLES und FORMS liefert ein flaches List<Block>, bei dem jedes Element – Zeilen, Wörter, Zellen, Tabellenüberschriften, Formularschlüssel, Formularwerte – vom gleichen Block-Typ ist, der nur durch BlockType unterschieden und mit RelationshipType.CHILD-ID-Arrays verknüpft wird. Die Rekonstruktion der logischen Struktur eines Dokuments erfordert das Durchlaufen dieses Beziehungsgraphen.IronOCR gibt eine typisierte Hierarchie zurück: Seiten, Absätze, Zeilen, Wörter, jeweils mit Koordinatenzugriff.

AWS Textract-Ansatz:

// AnalyzeDocument with TABLES returns blocks that must be graph-traversed
// to determine which words belong to which paragraphs

using Amazon.Textract;
using Amazon.Textract.Model;

public async Task<List<DocumentSection>> ExtractDocumentStructureAsync(string imagePath)
{
    var bytes = File.ReadAllBytes(imagePath);

    var response = await _textractClient.AnalyzeDocumentAsync(
        new AnalyzeDocumentRequest
        {
            Document = new Document { Bytes = new MemoryStream(bytes) },
            FeatureTypes = new List<string> { "TABLES", "FORMS" }
            // Note: AnalyzeDocument (TABLES) costs $0.015/page — 10x DetectDocumentText
        });

    var sections = new List<DocumentSection>();

    // Filter LINE blocks for paragraph reconstruction
    // LINE blocks are not grouped into paragraphs — must infer from Y proximity
    var lineBlocks = response.Blocks
        .Where(b => b.BlockType == BlockType.LINE)
        .OrderBy(b => b.Geometry?.BoundingBox?.Top ?? 0)
        .ToList();

    // Group lines into pseudo-paragraphs by vertical gap heuristic
    var currentParagraph = new List<Block>();
    float? lastBottom = null;
    const float paragraphGapThreshold = 0.02f; // 2% of page height

    foreach (var line in lineBlocks)
    {
        var top = line.Geometry?.BoundingBox?.Top ?? 0;
        var height = line.Geometry?.BoundingBox?.Height ?? 0;

        if (lastBottom.HasValue && (top - lastBottom.Value) > paragraphGapThreshold)
        {
            if (currentParagraph.Any())
            {
                sections.Add(new DocumentSection
                {
                    Text = string.Join(" ", currentParagraph.Select(b => b.Text)),
                    LineCount = currentParagraph.Count,
                    // Confidence: average of all LINE block confidence values
                    Confidence = (float)currentParagraph.Average(b => b.Confidence ?? 0)
                });
                currentParagraph.Clear();
            }
        }

        currentParagraph.Add(line);
        lastBottom = top + height;
    }

    if (currentParagraph.Any())
        sections.Add(new DocumentSection
        {
            Text = string.Join(" ", currentParagraph.Select(b => b.Text)),
            LineCount = currentParagraph.Count,
            Confidence = (float)currentParagraph.Average(b => b.Confidence ?? 0)
        });

    return sections;
}

public class DocumentSection
{
    public string Text { get; set; }
    public int LineCount { get; set; }
    public float Confidence { get; set; }
}
C#

IronOCR Ansatz:

//IronOCR returns a typed hierarchy — paragraphs are first-class objects
// No block graph, no heuristic gap detection, no confidence averaging

using IronOcr;

public List<DocumentSection> ExtractDocumentStructure(string imagePath)
{
    var ocr = new IronTesseract();
    var result = ocr.Read(imagePath);

    var sections = new List<DocumentSection>();

    foreach (var page in result.Pages)
    {
        foreach (var paragraph in page.Paragraphs)
        {
            sections.Add(new DocumentSection
            {
                Text = paragraph.Text,
                LineCount = paragraph.Lines.Length,
                // Coordinate access: exact pixel position on the page
                LocationX = paragraph.X,
                LocationY = paragraph.Y,
                Width = paragraph.Width,
                Height = paragraph.Height,
                Confidence = paragraph.Confidence
            });
        }
    }

    return sections;
}

public class DocumentSection
{
    public string Text { get; set; }
    public int LineCount { get; set; }
    public int LocationX { get; set; }
    public int LocationY { get; set; }
    public int Width { get; set; }
    public int Height { get; set; }
    public double Confidence { get; set; }
}
C#

Absätze, Zeilen und Wörter sind direkt als typisierte Sammlungen zugänglich mit .X, .Y, .Width, .Height und .Confidence-Eigenschaften. Keine BoundingBox-Normalisierung, keine Heuristiken zur Lückenschwelle, keine Blocktypfilterung. Der Read-Results-Leitfaden dokumentiert die vollständige OcrResult-Hierarchie einschließlich des Zugriffs auf die Koordinatenebene. Für Rechnungs- und Beleg-Workflows, die auf dieser Struktur basieren, siehe das Tutorial zur Rechnungs-OCR .

Ersetzen der ratenbegrenzten Stapelverarbeitung durch uneingeschränkte parallele Ausführung

Das Batch-Bildverarbeitung ist der Bereich, in dem Textracts TPS-Limits die sichtbarsten Betriebskosten verursachen. Die DetectDocumentText-synchrone API ist ratengesteuert; Das Senden von mehr als 5 Anfragen pro Sekunde erzeugt ProvisionedThroughputExceededException. Korrekte Stapelverarbeitung erfordert SemaphoreSlim-Drosselung, Rückgabelogik mit Rückgang und vorsichtige Betrachtung der in Bearbeitung befindlichen Anfragen.IronOCR hat keine Ratenbegrenzung – der Durchsatz ist nur durch die verfügbaren CPU-Kerne begrenzt.

AWS Textract-Ansatz:

// Batch processing requires SemaphoreSlim throttle + retry on rate limit exceeded

using Amazon.Textract;
using Amazon.Textract.Model;
using System.Collections.Concurrent;

public async Task<Dictionary<string, string>> ProcessImageBatchAsync(
    IReadOnlyList<string> imagePaths,
    IProgress<(int Completed, int Total)> progress = null)
{
    var results = new ConcurrentDictionary<string, string>();
    var semaphore = new SemaphoreSlim(5); // 5 concurrent — Textract default TPS limit
    var tasks = new List<Task>();
    int completed = 0;

    foreach (var path in imagePaths)
    {
        await semaphore.WaitAsync();

        tasks.Add(Task.Run(async () =>
        {
            try
            {
                string text = null;
                int retryCount = 0;

                while (text == null && retryCount < 3)
                {
                    try
                    {
                        var bytes = await File.ReadAllBytesAsync(path);
                        var response = await _textractClient.DetectDocumentTextAsync(
                            new DetectDocumentTextRequest
                            {
                                Document = new Document { Bytes = new MemoryStream(bytes) }
                            });

                        text = string.Join("\n", response.Blocks
                            .Where(b => b.BlockType == BlockType.LINE)
                            .Select(b => b.Text));
                    }
                    catch (AmazonTextractException ex)
                        when (ex.ErrorCode == "ProvisionedThroughputExceededException")
                    {
                        // Exponential backoff on rate limit — blocks the entire thread
                        await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, retryCount)));
                        retryCount++;
                    }
                }

                results[path] = text ?? string.Empty;
                var done = Interlocked.Increment(ref completed);
                progress?.Report((done, imagePaths.Count));
            }
            finally
            {
                semaphore.Release();
            }
        }));
    }

    await Task.WhenAll(tasks);
    return results.ToDictionary(x => x.Key, x => x.Value);
}
C#

IronOCR Ansatz:

// No rate limits, no semaphore, no retry logic — Parallel.ForEach saturates all cores

using IronOcr;
using System.Collections.Concurrent;

public Dictionary<string, string> ProcessImageBatch(
    IReadOnlyList<string> imagePaths,
    IProgress<(int Completed, int Total)> progress = null)
{
    var ocr = new IronTesseract();
    var results = new ConcurrentDictionary<string, string>();
    int completed = 0;

    Parallel.ForEach(imagePaths, path =>
    {
        var result = ocr.Read(path);
        results[path] = result.Text;

        var done = Interlocked.Increment(ref completed);
        progress?.Report((done, imagePaths.Count));
    });

    return results.ToDictionary(x => x.Key, x => x.Value);
}
C#

Das SemaphoreSlim, die Wiederholungsschleife, das exponentielle Zurückgehen und die ProvisionedThroughputExceededException-Catch-Blöcke werden alle entfernt. IronTesseract ist threadsicher und eine einzelne Instanz, die über Threads geteilt wird, verarbeitet die volle parallele Last ohne Sperren. Auf einer Maschine mit 8 Kernen verarbeitet dies 8 Dokumente gleichzeitig ohne Konfiguration; auf 32 Kernen, 32 gleichzeitig. Das Beispiel zur Multithreading-Architektur zeigt das vollständige Muster, und der Leitfaden zur Geschwindigkeitsoptimierung behandelt die Konfigurationsoptimierung der Engine für durchsatzorientierte Bereitstellungen.

Ersetzen der AnalyzeDocument-Formularextraktion durch regionenbasierte CropRectangle-OCR

Textracts AnalyzeDocument mit FORMS liefert KEY_VALUE_SET-Blöcke, die durch RelationshipType.VALUE-Beziehungen verbunden sind. Die Rekonstruktion von Formularfeld-Schlüsselwertpaaren erfordert das Filtern nach EntityTypes.Contains("KEY"), das Folgen von VALUE-Beziehungs-IDs und dann die Abrufung von untergeordneten WORD-Blöcken zur Zusammensetzung des Textes. Für fest formatierte Formulare, bei denen die Feldpositionen bekannt sind, extrahiert IronOCRs CropRectangle jedes Feld direkt ohne Durchlauf durch das Beziehungsdiagramm - und kostet null pro Seite.

AWS Textract-Ansatz:

// FORMS mode costs $0.05/page — the most expensive Textract tier
// Relationship graph traversal required to reconstruct key-value pairs

using Amazon.Textract;
using Amazon.Textract.Model;

public async Task<Dictionary<string, string>> ExtractInvoiceFieldsAsync(string imagePath)
{
    var bytes = File.ReadAllBytes(imagePath);

    // $0.05/page for FORMS analysis
    var response = await _textractClient.AnalyzeDocumentAsync(
        new AnalyzeDocumentRequest
        {
            Document = new Document { Bytes = new MemoryStream(bytes) },
            FeatureTypes = new List<string> { "FORMS" }
        });

    var allBlocks = response.Blocks;
    var fields = new Dictionary<string, string>();

    // Find KEY blocks only
    var keyBlocks = allBlocks.Where(b =>
        b.BlockType == BlockType.KEY_VALUE_SET &&
        b.EntityTypes?.Contains("KEY") == true);

    foreach (var keyBlock in keyBlocks)
    {
        // Assemble key text from CHILD WORD blocks
        var keyText = GetTextFromBlock(allBlocks, keyBlock);

        // Find associated VALUE block via VALUE relationship
        var valueBlockId = keyBlock.Relationships?
            .FirstOrDefault(r => r.Type == RelationshipType.VALUE)?
            .Ids.FirstOrDefault();

        if (valueBlockId == null) continue;

        var valueBlock = allBlocks.FirstOrDefault(b => b.Id == valueBlockId);
        if (valueBlock == null) continue;

        var valueText = GetTextFromBlock(allBlocks, valueBlock);
        fields[keyText.TrimEnd(':')] = valueText;
    }

    return fields;
}

private string GetTextFromBlock(IList<Block> allBlocks, Block block)
{
    if (block.Relationships == null) return string.Empty;

    var childWordIds = block.Relationships
        .Where(r => r.Type == RelationshipType.CHILD)
        .SelectMany(r => r.Ids);

    return string.Join(" ", allBlocks
        .Where(b => b.BlockType == BlockType.WORD && childWordIds.Contains(b.Id))
        .Select(b => b.Text));
}
C#

IronOCR Ansatz:

// CropRectangle extracts each field zone directly — no relationship graph
// Works for any fixed-format form where field positions are known

using IronOcr;

// Define the field zones for your form template once
private static readonly Dictionary<string, CropRectangle> InvoiceFieldZones =
    new Dictionary<string, CropRectangle>
    {
        { "InvoiceNumber", new CropRectangle(450, 80,  300, 35) },
        { "InvoiceDate",   new CropRectangle(450, 120, 300, 35) },
        { "VendorName",    new CropRectangle(50,  160, 400, 35) },
        { "TotalAmount",   new CropRectangle(450, 680, 200, 35) },
        { "DueDate",       new CropRectangle(450, 720, 200, 35) }
    };

public Dictionary<string, string> ExtractInvoiceFields(string imagePath)
{
    var ocr = new IronTesseract();
    var fields = new Dictionary<string, string>();

    foreach (var zone in InvoiceFieldZones)
    {
        using var input = new OcrInput();
        input.LoadImage(imagePath, zone.Value); // load only the defined region

        var result = ocr.Read(input);
        fields[zone.Key] = result.Text.Trim();
    }

    return fields;
}
C#

Die KEY_VALUE_SET-Blockfilterung, die RelationshipType.VALUE-Durchquerung und der GetTextFromBlock-Helfer werden eliminiert. Jedes Feld liest exakt den Pixelbereich, der es enthält – nicht mehr und nicht weniger. Der Leitfaden zur regionsbasierten OCR behandelt CropRectangle-Koordinaten und wie man Zonen aus Vorlagenmessungen definiert. Für rechnungsspezifische Arbeitsabläufe demonstrieren der Blogbeitrag zur OCR-Texterkennung von Rechnungen und das Tutorial zum Scannen von Belegen vollständige Pipelines zur Feldextraktion.

AWS TextractAPI zu IronOCR Mapping-Referenz

AWS TextractIronOCR-Äquivalent
AmazonTextractClientIronTesseract
AmazonS3ClientNicht erforderlich
DetectDocumentTextRequestOcrInput mit input.LoadImage()
DetectDocumentTextResponseOcrResult
AnalyzeDocumentRequest (TABELLEN/FORMULARE)OcrInput mit optionalem CropRectangle
StartDocumentTextDetectionRequestOcrInput mit input.LoadPdf() — synchron, kein Jobstart
GetDocumentTextDetectionRequestNicht zutreffend – Ergebnisse liegen sofort vor.
Document.Bytesinput.LoadImage(byteArray) oder input.LoadImage(stream)
S3Object (Dokumentenstaging)Dateipfad oder Stream – kein Staging erforderlich
Block (BlockType.LINE)result.Lines (Typisierte Sammlung)
Block (BlockType.WORD)result.Words (Typisierte Sammlung)
Block (BlockType.TABLE)result.Words gruppiert nach Koordinatennähe
Block (BlockType.KEY_VALUE_SET)CropRectangle Regionsextraktion pro Feld
Block.Confidenceword.Confidence / result.Confidence
Block.Geometry.BoundingBoxword.X, word.Y, word.Width, word.Height
RelationshipType.CHILD-DurchquerungDirekter Zugriff auf Eigenschaften von typisierten Ergebnisobjekten
JobStatus.IN_PROGRESSNicht anwendbar – kein asynchroner Zustand
JobStatus.SUCCEEDEDNicht zutreffend – synchrone Rückgabe
response.NextToken (Paginierung)Nicht zutreffend – Ergebnisse nicht paginiert
ProvisionedThroughputExceededExceptionNicht anwendbar – keine Drosselklappenpotentiometer-Grenzwerte
AccessDeniedExceptionNicht zutreffend – keine Anmeldeinformationskette
input.LoadImageFrames()Direkte Unterstützung für TIFF-Mehrbildformate (kein Textract-Äquivalent)
result.SaveAsSearchablePdf()Durchsuchbare PDF-Ausgabe (kein Textract-Äquivalent)

Gängige Migrationsprobleme und Lösungen

Problem 1: Falsch konfigurierte Anmeldeinformationen in neuen Bereitstellungsumgebungen

AWS Textract: Der AmazonTextractClient-Konstruktor löst Anmeldeinformationen aus einer Kette: Umgebungsvariablen, ~/.aws/credentials, EC2-Instanzprofil, ECS-Aufgabenrolle. In einem neuen Docker-Container oder in einer CI-Umgebung, wenn keiner dieser konfiguriert ist, wird der Client erstellt, ohne Fehler zu verursachen, aber jeder API-Aufruf wirft AmazonClientException: No credentials specified. Der Fehler ist erst zur Laufzeit sichtbar.

Lösung: Die Anmeldeinformationskette vollständig entfernen. Legen Sie den IronOCR-Lizenzschlüssel über eine Umgebungsvariable fest, die einfacher zu konfigurieren ist und keine IAM-Berechtigungen zur Verwaltung erfordert:

// Single environment variable — no IAM, no rotation, no chain resolution
var key = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
if (string.IsNullOrEmpty(key))
    throw new InvalidOperationException("IRONOCR_LICENSE environment variable is not set");

IronOcr.License.LicenseKey = key;
C#

Problem 2: Asynchrone Aufrufstellen im gesamten Quellcode

AWS Textract: Da das gesamte SDK nur asynchron ist (DetectDocumentTextAsync, StartDocumentTextDetectionAsync, GetDocumentTextDetectionAsync), verbreiten alle Textract-Aufrufstellen async Task<t> durch den Aufrufstapel. Die Migration zur synchronen API von IronOCR erfordert eine Entscheidung an jedem Standort.

Lösung: Bei Hintergrundverarbeitungsdiensten und Controller-Aktionen sind die synchronen Aufrufe von IronOCR auf Hintergrundthreads sicher. Umschließen Sie in Task.Run nur, wenn die bestehende Aufrufkette asynchron bleiben muss:

// If the call site must remain async (e.g., an ASP.NET controller action):
public async Task<IActionResult> ProcessUpload(IFormFile file)
{
    using var ms = new MemoryStream();
    await file.CopyToAsync(ms);

    // Offload synchronous OCR to thread pool — keeps controller non-blocking
    var text = await Task.Run(() =>
    {
        var ocr = new IronTesseract();
        using var input = new OcrInput();
        input.LoadImage(ms.ToArray());
        return ocr.Read(input).Text;
    });

    return Ok(text);
}
C#

Für Batch-Prozessoren und Hintergrunddienste, die bereits auf Nicht-UI-Threads laufen, synchron auf ocr.Read() aufrufen — Task.Run fügt in diesen Kontexten Überkopf ohne Vorteil hinzu. Der Leitfaden zur asynchronen OCR beschreibt die empfohlenen Muster.

Problem 3: Logik zur Bereinigung des S3-Buckets im gesamten Code verstreut

AWS Textract: Jeder Code, der zur Verarbeitung durch Textract in S3 hochgeladen wird, muss nach Abschluss des Auftrags auch wieder aus S3 gelöscht werden. Diese Bereinigung lebt häufig in finally-Blöcken und wird manchmal auf Fehlerpfaden ausgelassen, was verwaiste Objekte verursacht, die Speicherkosten ansammeln. Bei der Migration wird der S3-Bereinigungscode leicht übersehen, da er konzeptionell nicht mit OCR zusammenhängt.

Lösung: Für das gesamte S3-Upload- und Bereinigungsmuster gibt es kein IronOCR Äquivalent. Löschen Sie alle PutObjectAsync, DeleteObjectAsync und S3-bezogenen try/finally-Blöcke vollständig.IronOCR liest direkt von lokalen Pfaden oder Datenströmen:

// Before: upload → job → poll → extract → cleanup (50+ lines)
// After: two lines, no cleanup required

using var input = new OcrInput();
input.LoadPdf(localPdfPath);
var text = new IronTesseract().Read(input).Text;
C#

Nach der Migration den S3-Staging-Bucket außer Betrieb nehmen. Der PDF-Eingabeleitfaden und der Stream-Eingabeleitfaden decken jedes Eingabemuster ab, das den gestaffelten Dokumentenzugriff über S3 ersetzt.

Problem 4: Blockgraph-Traversierungscode hat kein direktes Äquivalent

AWS Textract: Der Code, der Block.Relationships durchquert, um Tabellenzellen, Formularfelder oder Absatzgruppen aus RelationshipType.CHILD-ID-Arrays zu rekonstruieren, ist der zeitaufwendigste Code zur Migration. Es gibt keinen direkten Ersatz, da IronOCR typisierte Sammlungen anstelle eines Beziehungsgraphen zurückgibt.

Lösung: Ersetzen Sie jedes Traversierungsmuster durch die entsprechende typisierte Eigenschaft. Beziehungs-ID-Abfragen werden zu einem direkten Zugriff auf Eigenschaften:

// Before: filter by BlockType + traverse relationship IDs
var paragraphText = string.Join(" ", allBlocks
    .Where(b => b.BlockType == BlockType.WORD &&
                childIds.Contains(b.Id))
    .Select(b => b.Text));

// After: direct paragraph text (no filtering, no relationship lookup)
foreach (var page in result.Pages)
    foreach (var para in page.Paragraphs)
        Console.WriteLine(para.Text); // already assembled
C#

Für die Tabellrekonstruktion, die von BlockType.CELL und ColumnIndex-Eigenschaften abhing, verwenden Sie die Wortkoordinatengruppierung auf result.Words. Die Tabellenleseanleitung behandelt den koordinatenbasierten Ansatz.

Problem 5: Catch-Blöcke für ProvisionedThroughputExceededException

AWS Textract: Robuster Batch-Verarbeitungscode fängt AmazonTextractException mit ErrorCode == "ProvisionedThroughputExceededException" ein und implementiert eine Rückversuchsstrategie mit Rückgang. Dieser Fehlercode ist ein Textract-spezifisches Konzept, für das es kein Äquivalent in IronOCR gibt.

Lösung: Löschen Sie alle ProvisionedThroughputExceededException-Catch-Blöcke.IronOCR hat keine TPS-Beschränkungen. Ersetzen Sie das gesamte gedrosselte Batch-Muster durch Parallel.ForEach:

// Delete: SemaphoreSlim, retry loops, ProvisionedThroughputExceededException handlers
// Replace with:
Parallel.ForEach(imagePaths, path =>
{
    var result = new IronTesseract().Read(path);
    results[path] = result.Text;
});
C#

Problem 6: Regionskonfiguration in Client-Konstruktoren integriert

AWS Textract: new AmazonTextractClient(Amazon.RegionEndpoint.USEast1) codiert eine Region fest. Für Multi-Region-Bereitstellungen sind mehrere Clientinstanzen oder eine dynamische Regionsauswahl erforderlich. Wenn Textract die Unterstützung in neuen Regionen hinzufügt, muss der Code aktualisiert werden.

**Lösung:**IronOCR kennt kein Regionskonzept. Entfernen Sie alle Amazon.RegionEndpoint-Referenzen. Der IronTesseract Konstruktor benötigt keine Netzwerkkonfiguration - die Verarbeitung erfolgt lokal. Bei Multi-Region-Bereitstellungen auf AWS-Infrastruktur, bei denen jede Region ihre eigene Rechenkapazität betreibt, verarbeitet jede IronOCR Instanz Dokumente lokal innerhalb dieser Rechenkapazitätsgrenze ohne regionsübergreifende Aufrufe.

Checkliste für die AWS Textract-Migration

Vor der Migration

Überprüfen Sie die gesamte Verwendung von Textract und dem S3 SDK im Quellcode:

grep -rn "Amazon.Textract\|AmazonTextractClient\|DetectDocumentText" --include="*.cs" .
grep -rn "StartDocumentTextDetection\|GetDocumentTextDetection\|JobStatus" --include="*.cs" .
grep -rn "AmazonS3Client\|PutObjectRequest\|DeleteObjectAsync" --include="*.cs" .
grep -rn "BlockType\|RelationshipType\|KEY_VALUE_SET" --include="*.cs" .
grep -rn "ProvisionedThroughputExceededException\|AmazonTextractException" --include="*.cs" .
grep -rn "AWSSDK\|Amazon.RegionEndpoint" --include="*.csproj" .
SHELL

Prüfen Sie vor dem Schreiben des Ersatzcodes Folgendes:

  • Zählen Sie alle Dateien, die AmazonTextractClient enthalten – jede ist ein Ziel zum Ersetzen
  • Listen Sie alle AnalyzeDocument-Aufrufstellen auf – notieren Sie, ob TABLES, FORMS oder beides verwendet wird
  • Identifizieren Sie alle asynchronen Polling-Schleifen (do { await Task.Delay } while JobStatus == IN_PROGRESS)
  • Finden Sie alle finally S3-Bereinigungsblöcke – diese werden vollständig gelöscht, nicht ersetzt
  • Zählen Sie alle ProvisionedThroughputExceededException-Catch-Blöcke – gelöscht, nicht ersetzt
  • Notieren Sie alle BlockType.TABLE, BlockType.CELL, BlockType.KEY_VALUE_SET-Durchquerungslogik – jeder benötigt eine strukturierte Ausgabenersetzung

Code-Migration

  1. Entfernen Sie AWSSDK.Textract, AWSSDK.S3 und AWSSDK.Core aus allen .csproj-Dateien
  2. Führen Sie dotnet add package IronOcr in jedem Projekt aus, das OCR durchführt
  3. Fügen Sie IronOcr.License.LicenseKey = ... einmal beim Anwendungsstart hinzu (Program.cs oder Äquivalent)
  4. Entfernen Sie alle using Amazon.Textract;, using Amazon.Textract.Model;, using Amazon.S3;, using Amazon.Runtime;-Anweisungen
  5. Fügen Sie using IronOcr; zu jeder Datei hinzu, die zuvor Textract-Namensräume importierte
  6. Ersetzen Sie alle AmazonTextractClient-Konstruktoraufrufe mit new IronTesseract()
  7. Ersetzen Sie alle AmazonS3Client-Instanzierungen und alle PutObjectAsync / DeleteObjectAsync-Aufrufe durch direkte Dateipfad- oder Streamlesungen
  8. Ersetzen Sie alle DetectDocumentTextAsync-Aufrufe: var text = ocr.Read(path).Text
  9. Ersetzen Sie alle StartDocumentTextDetectionAsync + Polling-Schleifen mit input.LoadPdf(path) + ocr.Read(input)
  10. Ersetzen Sie alle mehrrahmigen TIFF-Pipelines (TIFF → PDF → S3 → async) mit input.LoadImageFrames(tiffPath)
  11. Ersetzen Sie BlockType.LINE / BlockType.WORD-Filterketten mit result.Lines / result.Words
  12. Ersetzen Sie die BlockType.KEY_VALUE_SET-Beziehungsdurchquerung mit CropRectangle-Zonenextraktion
  13. Löschen Sie alle ProvisionedThroughputExceededException-Catch-Blöcke und SemaphoreSlim-Drosselungen
  14. Ersetzen Sie gedrosselte Batch-Muster mit Parallel.ForEach unter Verwendung einer gemeinsam genutzten IronTesseract-Instanz
  15. Entfernen Sie sämtliche Konfigurationen von AWS-Anmeldeinformationen in den Umgebungsvariablen aus den Bereitstellungsmanifesten und CI-Pipelines.
  16. S3-Staging-Buckets außer Betrieb nehmen, nachdem der gesamte Verarbeitungscode migriert und verifiziert wurde.

Nach der Migration

  • Überprüfen Sie, ob die Anwendung sauber startet, wenn nur IRONOCR_LICENSE gesetzt ist und alle AWS-Umgebungsvariablen entfernt wurden
  • Führen Sie die OCR-Analyse auf denselben Beispielbildern durch, die zuvor von Textract verarbeitet wurden, und vergleichen Sie den extrahierten Text auf Genauigkeit.
  • Mehrseitige PDFs direkt verarbeiten und überprüfen, ob alle Seiten ohne S3 oder asynchrones Polling extrahiert wurden
  • Verarbeiten Sie eine TIFF-Datei mit mehreren Einzelbildern und überprüfen Sie, ob die Seitenzahl mit der Ausgabe von Textract für dasselbe Dokument übereinstimmt.
  • Testen Sie die Batch-Verarbeitung mit einem Satz von 50+ Bildern und bestätigen Sie, dass kein ProvisionedThroughputExceededException-Äquivalent auftritt
  • Führen Sie die Anwendung in einem Docker-Container ohne ausgehenden Internetzugang aus und überprüfen Sie, ob die OCR-Operation erfolgreich abgeschlossen wurde.
  • Überprüfen Sie, ob die durchsuchbare PDF-Ausgabe in Adobe Reader korrekt geöffnet wird und die Volltextsuche möglich ist.
  • Bestätigen Sie, dass das Entfernen von AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY aus der Bereitstellungsumgebung nichts beschädigt
  • Testen Sie beliebige Workflows zur Formular- oder Rechnungsextraktion anhand bekannter Ausgaben von Textract, um die Feldgenauigkeit zu validieren.
  • Messung der Verarbeitungslatenz für einen repräsentativen Dokumentensatz und Bestätigung der Beseitigung der minimalen Abfragewartezeit von 5 Sekunden.

Wichtigste Vorteile der Migration zu IronOCR

Infrastrukturkonsolidierung zu einem einzigen NuGet Paket. Drei AWS SDK-Pakete, ein S3-Bucket mit Lebenszyklusrichtlinien, IAM-Rollen in jeder Bereitstellungsumgebung und AWS-Anmeldeinformationsrotationsverfahren werden durch ein einziges NuGet Paket ersetzt. Die .csproj-Änderung ist dotnet remove package AWSSDK.Textract gefolgt von dotnet add package IronOcr. Alle Folgeerscheinungen der AWS-Anmeldeinformationsverwaltung – Sicherheitsaudits, Rotationspläne, Umgebungsvariablenhygiene, Docker-Secrets-Konfiguration – verschwinden damit.

Vorhersehbare Gesamtbetriebskosten. Das Abrechnungsmodell pro Seite erzeugt variable Kosten, die mit dem Dokumentenvolumen unbegrenzt skalieren. Nach der Migration zu IronOCR betragen die Kosten pro zusätzlich verarbeiteter Seite unabhängig vom Volumen null. Ein Team, das 200.000 Seiten pro Monat zum Textract AnalyzeDocument-Satz für Tabellen verarbeitet, gibt 36.000 $ pro Jahr allein für OCR aus. Mit der IronOCR Enterprise Lizenz für 2.999 US-Dollar amortisieren sich diese Kosten in weniger als 31 Tagen durch vermiedene Rechnungsstellung. Auf der IronOCR -Lizenzseite finden Sie alle Details zu den Lizenzstufen und den SaaS-Weitervertriebsbedingungen.

Synchrone Verarbeitung eliminiert die fünfphasige asynchrone Komplexität. Der S3-Upload, der Jobstart, die Abfrageschleife, die paginierte Ergebniserfassung und der abschließende Bereinigungsblock stellen fünf unabhängige Fehlermodi in der Textract-PDF-Pipeline dar. Nach der Migration wird eine PDF-Datei in zwei Zeilen eingelesen. Die Fehlerbehandlung reduziert sich auf ein einzelnes try/catch um den ocr.Read()-Aufruf. Die Polling-Timeout-Logik, die do/while JobStatus == IN_PROGRESS Schleife, der nextToken Paginierungsakkumulator – keines dieser Konzepte existiert im IronOCR-Codebas. Der Wartungsaufwand sinkt proportional zum entfernten Code.

Vollständige Flexibilität bei der Bereitstellung. Textract benötigt bei jedem OCR-Aufruf einen Internetzugang.IronOCR benötigt nur zum Herunterladen des NuGet Pakets während der Installation einen Internetzugang. Danach funktioniert es in abgeschotteten Netzwerken, Docker-Containern ohne ausgehende Regeln, auf lokalen Servern und AWS EC2-Instanzen ohne Textract-Zugriff. Dieselbe Binärdatei, die im Produktivbetrieb auf Windows Server läuft, läuft auch in einem Linux-Container. Der Docker-Bereitstellungsleitfaden und der Linux-Bereitstellungsleitfaden beschreiben die spezifische Konfiguration für containerisierte Umgebungen, die bisher von der Nutzung von Textract ausgeschlossen waren.

**Datensouveränität wird durch die Architektur, nicht durch die Konfiguration erreicht.**IronOCR verfügt über keinen deaktivierbaren Netzwerkübertragungsmodus – die lokale Verarbeitung ist der einzige Modus. Mit IronOCR verarbeitete Dokumente verlassen niemals den Host-Rechner. Für Anwendungen im Gesundheitswesen, die PHI (geschützte Gesundheitsdaten) verarbeiten, für Anwendungen im Verteidigungsbereich, die CUI (kontrollierte unleserliche Informationen) verarbeiten, und für Finanzanwendungen, die Zahlungskartenbilder verarbeiten, bietet dies eine Compliance-Lösung, die keine BAA-Verhandlung (Business Associate Agreement), keine Konfiguration des regionalen Datenspeicherorts und keine Prüfung der Datenschutzrichtlinien von Amazon erfordert. Der Geltungsbereich der Compliance entspricht den Grenzen Ihrer eigenen Infrastruktur, die Sie bereits kontrollieren. Auf der IronOCR -Produktseite finden Teams, die eine Compliance-Prüfung durchführen, eine vollständige Funktionsübersicht und die Bereitstellungsdokumentation.

Konfigurierbare Vorverarbeitung für die Dokumentenqualitätskontrolle. Die interne Vorverarbeitung von Textract ist weder zugänglich noch konfigurierbar. Wenn ein gescanntes Dokument ein schlechtes Ergebnis liefert, bleibt nur die Möglichkeit, das Ergebnis zu akzeptieren oder erneut zu scannen.IronOCR deckt die gesamte Vorverarbeitungspipeline ab: Deskew(), DeNoise(), Contrast(), Binarize(), Sharpen(), Scale(), Dilate(), Erode() und DeepCleanBackgroundNoise(). Teams, die Dokumente aufgrund von unzuverlässigen Ergebnissen bei schwierigen Scans aus Textract verschoben haben, können die Ursache direkt mit Filtern beheben, die auf den jeweiligen Defekt abgestimmt sind – Rotation, Rauschen, geringer Kontrast oder unzureichende Auflösung. Die Seite zu den Vorverarbeitungsfunktionen und der Leitfaden zur Bildqualitätskorrektur dokumentieren die verfügbaren Filter und ihre jeweiligen Anwendungsfälle.

Hinweis:: AWS Textract, PDFSharp, Tesseract und iText sind eingetragene Marken ihrer jeweiligen Eigentümer. Diese Website ist nicht mit Amazon Web Services, Google, empira Software GmbH oder iText Group verbunden, anerkannt oder unterstützt. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Inhaber. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.

Verwandte Artikel

Key in blue circle

Holen Sie sich sofort Ihren kostenlosen 30-Tage-Testschlüssel.

Your trial license will be sent to your email address

Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.

bullet_checkedIhr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Erhalten Sie Ihre unverbindliche Beratung
Füllen Sie das Formular unten aus oder senden Sie eine E-Mail an sales@ironsoftware.com
Ihre Daten werden immer vertraulich behandelt.
Von Millionen von Ingenieur*innen weltweit vertraut
Kundenlogos von Iron Software
Erhalten Sie sofort Ihren kostenlosen 30-Tage-Testschlüssel.
Ihr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.