Zum Fußzeileninhalt springen
VIDEOS

Umstellung von Aspose.OCR auf IronOCR

Dieser Leitfaden führt .NET -Entwickler durch eine vollständige Migration von Aspose.OCR zu IronOCR . Es umfasst den Pakettausch, Namensraumänderungen, die Lizenzinitialisierung und vier konkrete Code-Migrationsbeispiele, die realen Aspose.OCR-Nutzungsmustern entnommen sind – Konfiguration der Erkennungseinstellungen, Bereicheerkennungsmodi, Stapelerkennung mit konfidenzbasierter Filterung und strukturierte Ausgabeverarbeitung. In jedem Beispiel wird der Ansatz von Aspose.OCR zusammen mit dem entsprechenden Ansatz von IronOCR gezeigt, sodass Sie Ihren bestehenden Code ohne Rätselraten übersetzen können.

Warum von Aspose.OCR migrieren?

Die Gründe, warum Teams Aspose.OCR verlassen, lassen sich auf zwei Hauptprobleme zurückführen: das Abonnement-Abrechnungsmodell und den Konfigurationsaufwand, der durch die manuelle Erkennungspipeline entsteht.

Die Abonnementkosten steigen ohne Obergrenze. Aspose.OCR bietet keine unbefristete Lizenz an. Die Lizenz für kleine Entwicklerunternehmen kostet 999 US-Dollar pro Entwickler und Jahr. Ein fünfköpfiges Team, das seinen Vertrag um drei Jahre verlängert, zahlt 14.985 Dollar, bevor es auch nur eine einzige Zeile Geschäftslogik geschrieben hat. Die Professional Version von IronOCR kostet einmalig 2.999 US-Dollar – der gleiche Leistungsumfang gilt für immer und es besteht keine Verpflichtung zur Verlängerung. Die Mathematik wird unausweichlich, wenn die Finanzabteilung fragt, warum eine OCR-Abhängigkeit jährlich wie ein SaaS-Abonnement erneuert wird.

Jeder Erkennungsaufruf erfordert eine Zeremonie von Einstellungsobjekten. Aspose.OCR teilt seine Konfigurationsoberfläche auf RecognitionSettings, DocumentRecognitionSettings, DetectAreasMode und die PreprocessingFilter-Sammlung auf. Bevor Sie RecognizeImage aufrufen können, erstellen Sie ein Einstellungsobjekt, füllen es und übergeben es explizit.IronOCR reduziert dies auf .Read(). Der Unterschied pro Anruf ist gering; Es sammelt sich im gesamten Quellcode an.

Die Auswahl des Bereichserkennungsmodus ist manuell und folgenschwer. Aspose.OCR stellt DetectAreasMode-Werte (COMBINE, DOCUMENT, TABLE, NONE) bereit, die der Entwickler für jeden Dokumenttyp wählen muss. Falscher Modus in einem strukturierten Formular verringert die Erkennungsgenauigkeit.IronOCR analysiert das Dokumentlayout automatisch und gibt das strukturierte Ergebnis – Absätze, Zeilen, Wörter – aus, ohne dass eine vorherige Modusdeklaration erforderlich ist.

Batch-Verarbeitung erfordert das manuelle Verwalten von Ergebnislisten. Das Speichern eines Stapels erkannter Seiten als durchsuchbares PDF oder als strukturierte Datendatei in Aspose.OCR bedeutet, RecognitionResult-Objekte in eine List<RecognitionResult> zu akkumulieren und dann diese Liste an SaveMultipageDocument zu übergeben. Das Sortieren der Listen liegt in Ihrer Verantwortung.IronOCR akzeptiert mehrere Eingaben über ein einziges OcrInput-Objekt und erzeugt ein OcrResult, das alle Seiten abdeckt.

Das Umschalten des Ausgabeformats betrifft mehrere API-Oberflächen. Der Export nach JSON, XML oder Klartext in Aspose.OCR erfordert jeweils einen separaten SaveFormat-Enum-Wert, der an SaveMultipageDocument übergeben wird. Das Filtern dieser Ergebnisse nach Vertrauen vor dem Speichern erfordert das Iterieren der Liste und das Inspizieren jedes RecognitionAreasConfidence-Arrays.IronOCR stellt result.Text, result.Confidence und result.Pages auf einem einzigen Ergebnisobjekt bereit — das Vertrauen filtern ist ein einzeiliger LINQ-Ausdruck.

Das IronOCR -Lizenzmodell eliminiert das Verlängerungsrisiko vollständig. Eine erworbene Lizenz gehört Ihnen dauerhaft. Aktualisierungen sind für ein Jahr inklusive; Anschließend funktioniert die zuletzt empfangene Version weiterhin im Produktivbetrieb ohne Compliance-Risiken. Es gibt kein Szenario, in dem eine versäumte Zahlung Ihre Bereitstellung unterbricht.

Das grundsätzliche Problem

Aspose.OCR verknüpft die Erkennungskonfiguration mit einem Einstellungsobjekt, das erstellt, befüllt und bei jedem Aufruf übergeben werden muss. Modus, Sprache, Filter und Bereichsstrategie sind allesamt Eigenschaften dieses Objekts:

// Aspose.OCR: build a settings object for every recognition call
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
    Language = Language.Eng,
    DetectAreasMode = DetectAreasMode.DOCUMENT, // must choose the right mode
    RecognizeSingleLine = false,
    AutoSkew = true
};
var result = api.RecognizeImage("form.jpg", settings);
string text = result.RecognitionText;
// Aspose.OCR: build a settings object for every recognition call
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
    Language = Language.Eng,
    DetectAreasMode = DetectAreasMode.DOCUMENT, // must choose the right mode
    RecognizeSingleLine = false,
    AutoSkew = true
};
var result = api.RecognizeImage("form.jpg", settings);
string text = result.RecognitionText;
Imports Aspose.OCR

' Aspose.OCR: build a settings object for every recognition call
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
    .Language = Language.Eng,
    .DetectAreasMode = DetectAreasMode.DOCUMENT, ' must choose the right mode
    .RecognizeSingleLine = False,
    .AutoSkew = True
}
Dim result = api.RecognizeImage("form.jpg", settings)
Dim text As String = result.RecognitionText
$vbLabelText   $csharpLabel

IronOCR verwendet einen einzigen .Read()-Aufruf. Konfigurationen liegen auf der IronTesseract-Instanz, wenn sie benötigt werden, nicht auf einem einzelnen Aufrufobjekt:

// IronOCR: one call, no settings object required
var text = new IronTesseract().Read("form.jpg").Text;
// IronOCR: one call, no settings object required
var text = new IronTesseract().Read("form.jpg").Text;
Imports IronOcr

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

IronOCR vs. Aspose.OCR: Funktionsvergleich

Die folgende Tabelle vergleicht die beiden Bibliotheken anhand der Dimensionen, die bei einer Migrationsentscheidung am wichtigsten sind.

Feature Aspose.OCR IronOCR
Lizenzmodell Jahresabonnement (keine unbefristete Option) Dauerhafter einmaliger Kauf
1. Entwicklerkosten 999 $/Jahr $999 einmal
10-Entwicklerkosten 4.995 $/Jahr (Standortlizenz) 2.999 $ einmalig (Professional)
Folgen des Lizenzablaufs Neue Builds können nicht bereitgestellt werden, keine Sicherheitspatches verfügbar Keine – die gekaufte Version funktioniert unbegrenzt.
Primäre OCR-Klasse AsposeOcr IronTesseract
Einstellungenobjekt erforderlich Ja (RecognitionSettings oder DocumentRecognitionSettings) Nein — optional OcrInput für erweiterte Szenarien
Bereichserkennung Manuelle DetectAreasMode-Enum-Auswahl Automatische Layoutanalyse
Vorverarbeitung Manuelle PreprocessingFilter-Sammlung Automatischer Modus mit optionaler expliziter Überschreibung
PDF-Eingabe Standard-PDFs via RecognizePdf() Nativ via .Read() oder OcrInput.LoadPdf()
Passwortgeschütztes PDF Erfordert Aspose.PDF (separate Lizenz) Eingebauter Password:-Parameter
Durchsuchbare PDF-Ausgabe SaveMultipageDocument(path, SaveFormat.Pdf, list) result.SaveAsSearchablePdf(path)
Konfidenzwert result.RecognitionAreasConfidence.Average() (Array) result.Confidence (einfaches Double, 0–100)
Strukturierte Daten auf Wortebene Bereichsgeometrie über RecognitionAreasRectangles result.Words mit X, Y, Breite, Höhe, Vertrauen
strukturierte Daten auf Seitenebene Nicht ausgesetzt result.Pages mit Absätzen, Zeilen, Wörtern, Zeichen
Mehrsprachige Simultanübertragung Eine Sprache pro Anruf OcrLanguage.French + OcrLanguage.German
Eingeschlossene Sprachen 130+ im Hauptpaket Über 125 Sprachpakete via NuGet
Barcode-Lesung Nicht verfügbar Eingebaut (ocr.Configuration.ReadBarCodes = true)
Thread-Sicherheit Eine neue Instanz pro Thread wird empfohlen. Vollständig threadsicher, einzelne gemeinsam genutzte Instanz
TIFF-Mehrbild Nicht nativ input.LoadImageFrames("file.tiff")
hOCR-Export Beschränkt result.SaveAsHocrFile(path)
Plattformübergreifendes NuGet Ja Ja (Windows, Linux, macOS, Docker, Azure, AWS)
Anzahl der NuGet Pakete 1 Haupt- + optionale Sprachpakete 1 Haupt- + optionale Sprachpakete

Schnellstart: Migration von Aspose.OCR zu IronOCR

Schritt 1: Ersetzen des NuGet-Pakets

Aspose.OCR entfernen:

dotnet remove package Aspose.OCR
dotnet remove package Aspose.OCR
SHELL

Installieren Sie IronOCR über NuGet :

dotnet add package IronOcr

Schritt 2: Namespaces aktualisieren

Ersetzen Sie alle Aspose.OCR-Namespace-Importe:

// Before (Aspose.OCR)
using Aspose.OCR;
using Aspose.OCR.Models;
using Aspose.OCR.Models.PreprocessingFilters;

// After (IronOCR)
using IronOcr;
// Before (Aspose.OCR)
using Aspose.OCR;
using Aspose.OCR.Models;
using Aspose.OCR.Models.PreprocessingFilters;

// After (IronOCR)
using IronOcr;
Imports IronOcr
$vbLabelText   $csharpLabel

Schritt 3: Lizenz initialisieren

Entfernen Sie den dateibasierten Lizenzaufruf von Aspose und ersetzen Sie ihn durch den IronOCR Zeichenfolgenschlüssel. Platzieren Sie dies beim Anwendungsstart – einmal pro Prozess, nicht einmal pro Anfrage:

// Remove Aspose license setup
// var license = new Aspose.OCR.License();
// license.SetLicense("Aspose.OCR.lic");

// Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
// Remove Aspose license setup
// var license = new Aspose.OCR.License();
// license.SetLicense("Aspose.OCR.lic");

// Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

// Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");
' Remove Aspose license setup
' Dim license As New Aspose.OCR.License()
' license.SetLicense("Aspose.OCR.lic")

' Add IronOCR license at startup
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"

' Production pattern: read from environment variable
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
$vbLabelText   $csharpLabel

Beispiele für die Code-Migration

Konfiguration der Erkennungseinstellungen

Aspose.OCR zentralisiert das gesamte Erkennungsverhalten in einem RecognitionSettings-Objekt. Sprache, Bereichserkennungsmodus, Einzelzeilen-Flag und Schwellenwert sind dort alle als Eigenschaften hinterlegt. Sie erstellen es für jeden Dokumenttyp oder jedes Aufrufmuster neu.

Aspose.OCR-Ansatz:

// Configuring recognition settings for a structured form
var api = new AsposeOcr();

var settings = new RecognitionSettings
{
    Language = Language.Eng,
    DetectAreasMode = DetectAreasMode.DOCUMENT,
    RecognizeSingleLine = false,
    AutoSkew = true,
    RecognitionAreas = new List<Rectangle>
    {
        new Rectangle(0, 0, 800, 100)  // header zone
    }
};

var result = api.RecognizeImage("structured-form.jpg", settings);
Console.WriteLine(result.RecognitionText);
// Configuring recognition settings for a structured form
var api = new AsposeOcr();

var settings = new RecognitionSettings
{
    Language = Language.Eng,
    DetectAreasMode = DetectAreasMode.DOCUMENT,
    RecognizeSingleLine = false,
    AutoSkew = true,
    RecognitionAreas = new List<Rectangle>
    {
        new Rectangle(0, 0, 800, 100)  // header zone
    }
};

var result = api.RecognizeImage("structured-form.jpg", settings);
Console.WriteLine(result.RecognitionText);
Imports System
Imports System.Collections.Generic
Imports AsposeOcr

' Configuring recognition settings for a structured form
Dim api As New AsposeOcr()

Dim settings As New RecognitionSettings With {
    .Language = Language.Eng,
    .DetectAreasMode = DetectAreasMode.DOCUMENT,
    .RecognizeSingleLine = False,
    .AutoSkew = True,
    .RecognitionAreas = New List(Of Rectangle) From {
        New Rectangle(0, 0, 800, 100)  ' header zone
    }
}

Dim result = api.RecognizeImage("structured-form.jpg", settings)
Console.WriteLine(result.RecognitionText)
$vbLabelText   $csharpLabel

IronOCR Ansatz:

// Recognition behavior configured once on the IronTesseract instance
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;

// Region targeting replaces RecognitionAreas in RecognitionSettings
var headerRegion = new CropRectangle(0, 0, 800, 100);
using var input = new OcrInput();
input.LoadImage("structured-form.jpg", headerRegion);

var result = ocr.Read(input);
Console.WriteLine(result.Text);
// Recognition behavior configured once on the IronTesseract instance
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;

// Region targeting replaces RecognitionAreas in RecognitionSettings
var headerRegion = new CropRectangle(0, 0, 800, 100);
using var input = new OcrInput();
input.LoadImage("structured-form.jpg", headerRegion);

var result = ocr.Read(input);
Console.WriteLine(result.Text);
Imports IronOcr

' Recognition behavior configured once on the IronTesseract instance
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.English

' Region targeting replaces RecognitionAreas in RecognitionSettings
Dim headerRegion As New CropRectangle(0, 0, 800, 100)
Using input As New OcrInput()
    input.LoadImage("structured-form.jpg", headerRegion)

    Dim result = ocr.Read(input)
    Console.WriteLine(result.Text)
End Using
$vbLabelText   $csharpLabel

Es gibt kein Einstellungsobjekt, das pro Aufruf erstellt werden muss. Sprache geht auf die IronTesseract-Instanz; Die Zielregion geht auf OcrInput zur Ladezeit. Die DetectAreasMode- und RecognizeSingleLine-Entscheidungen werden vom Motor automatisch gehandhabt. Eine detaillierte Anleitung zur regionsbasierten OCR finden Sie im Leitfaden zur regionsbasierten OCR .

Bereichserkennungsmodus-Migration

Aspose.OCR erfordert, dass Sie vor jedem Erkennungsaufruf einen DetectAreasMode-Wert auswählen. COMBINE führt Text aus verschiedenen Layoutregionen zusammen, DOCUMENT behandelt das Bild als Standarddokument, TABLE optimiert für Rasterlayouts. Die Wahl des falschen Modus für den Dokumenttyp führt zu falsch ausgerichteten oder fehlenden Ausgaben.

Aspose.OCR-Ansatz:

// Three separate calls with different modes for different document types
var api = new AsposeOcr();

// For a document with mixed prose and table content
var docSettings = new RecognitionSettings
{
    DetectAreasMode = DetectAreasMode.COMBINE,
    Language = Language.Eng
};

// For a pure tabular document
var tableSettings = new RecognitionSettings
{
    DetectAreasMode = DetectAreasMode.TABLE,
    Language = Language.Eng
};

// For a single-column text document
var linearSettings = new RecognitionSettings
{
    DetectAreasMode = DetectAreasMode.DOCUMENT,
    Language = Language.Eng
};

string mixedResult = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText;
string tableResult = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText;
string linearResult = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText;
// Three separate calls with different modes for different document types
var api = new AsposeOcr();

// For a document with mixed prose and table content
var docSettings = new RecognitionSettings
{
    DetectAreasMode = DetectAreasMode.COMBINE,
    Language = Language.Eng
};

// For a pure tabular document
var tableSettings = new RecognitionSettings
{
    DetectAreasMode = DetectAreasMode.TABLE,
    Language = Language.Eng
};

// For a single-column text document
var linearSettings = new RecognitionSettings
{
    DetectAreasMode = DetectAreasMode.DOCUMENT,
    Language = Language.Eng
};

string mixedResult = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText;
string tableResult = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText;
string linearResult = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText;
Imports AsposeOcr

' Three separate calls with different modes for different document types
Dim api As New AsposeOcr()

' For a document with mixed prose and table content
Dim docSettings As New RecognitionSettings With {
    .DetectAreasMode = DetectAreasMode.COMBINE,
    .Language = Language.Eng
}

' For a pure tabular document
Dim tableSettings As New RecognitionSettings With {
    .DetectAreasMode = DetectAreasMode.TABLE,
    .Language = Language.Eng
}

' For a single-column text document
Dim linearSettings As New RecognitionSettings With {
    .DetectAreasMode = DetectAreasMode.DOCUMENT,
    .Language = Language.Eng
}

Dim mixedResult As String = api.RecognizeImage("mixed-layout.jpg", docSettings).RecognitionText
Dim tableResult As String = api.RecognizeImage("data-table.jpg", tableSettings).RecognitionText
Dim linearResult As String = api.RecognizeImage("text-document.jpg", linearSettings).RecognitionText
$vbLabelText   $csharpLabel

IronOCR Ansatz:

// Single API surface handles all layout types automatically
var ocr = new IronTesseract();

// Same code path for every document type
var mixedResult = ocr.Read("mixed-layout.jpg").Text;
var tableResult = ocr.Read("data-table.jpg").Text;
var linearResult = ocr.Read("text-document.jpg").Text;

// For table documents, structured data is immediately available
var result = ocr.Read("data-table.jpg");
foreach (var page in result.Pages)
{
    foreach (var paragraph in page.Paragraphs)
    {
        Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
    }
}
// Single API surface handles all layout types automatically
var ocr = new IronTesseract();

// Same code path for every document type
var mixedResult = ocr.Read("mixed-layout.jpg").Text;
var tableResult = ocr.Read("data-table.jpg").Text;
var linearResult = ocr.Read("text-document.jpg").Text;

// For table documents, structured data is immediately available
var result = ocr.Read("data-table.jpg");
foreach (var page in result.Pages)
{
    foreach (var paragraph in page.Paragraphs)
    {
        Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
    }
}
Imports System

' Single API surface handles all layout types automatically
Dim ocr As New IronTesseract()

' Same code path for every document type
Dim mixedResult As String = ocr.Read("mixed-layout.jpg").Text
Dim tableResult As String = ocr.Read("data-table.jpg").Text
Dim linearResult As String = ocr.Read("text-document.jpg").Text

' For table documents, structured data is immediately available
Dim result = ocr.Read("data-table.jpg")
For Each page In result.Pages
    For Each paragraph In page.Paragraphs
        Console.WriteLine($"Block at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}")
    Next
Next
$vbLabelText   $csharpLabel

IronOCR macht die Entscheidung über die Modusauswahl komplett überflüssig. Der Motor analysiert Layouts und stellt das Ergebnis durch die Pages, Paragraphs, Lines und Words-Hierarchie bereit. Der Leitfaden zu den Leseergebnissen beschreibt, wie man im vollständigen strukturierten Ergebnismodell für die Dokumentenlayoutanalyse navigiert. Für tabellenspezifische Extraktionsmuster siehe die Anleitung zum Lesen von Tabellen .

Stapelerkennung mit konfessionsbasierter Filterung

Aspose.OCR-Batch-Workflows akkumulieren RecognitionResult-Objekte in einer Liste. Vertrauensfilterung erfordert das Durchlaufen dieser Liste und das Berechnen des Durchschnitts pro Region, bevor ein Ergebnis angenommen wird. Die Liste muss explizit verwaltet und an SaveMultipageDocument übergeben werden, wenn Sie mehrere Seiten als eine einzelne Datei ausgeben möchten.

Aspose.OCR-Ansatz:

// Batch recognition with confidence filtering before output
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
    Language = Language.Eng,
    DetectAreasMode = DetectAreasMode.DOCUMENT
};

string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<RecognitionResult>();
var rejectedPaths = new List<string>();

foreach (var path in documentPaths)
{
    var result = api.RecognizeImage(path, settings);

    // Confidence is an array of per-region values — must average manually
    float avgConfidence = result.RecognitionAreasConfidence != null
        ? result.RecognitionAreasConfidence.Average()
        : 0f;

    if (avgConfidence >= 0.70f)
    {
        acceptedResults.Add(result);
    }
    else
    {
        rejectedPaths.Add(path);
        Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)");
    }
}

// Save accepted pages as a single searchable PDF
if (acceptedResults.Any())
{
    api.SaveMultipageDocument("high-confidence-invoices.pdf",
        SaveFormat.Pdf, acceptedResults);
}

Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
// Batch recognition with confidence filtering before output
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
    Language = Language.Eng,
    DetectAreasMode = DetectAreasMode.DOCUMENT
};

string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");
var acceptedResults = new List<RecognitionResult>();
var rejectedPaths = new List<string>();

foreach (var path in documentPaths)
{
    var result = api.RecognizeImage(path, settings);

    // Confidence is an array of per-region values — must average manually
    float avgConfidence = result.RecognitionAreasConfidence != null
        ? result.RecognitionAreasConfidence.Average()
        : 0f;

    if (avgConfidence >= 0.70f)
    {
        acceptedResults.Add(result);
    }
    else
    {
        rejectedPaths.Add(path);
        Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)");
    }
}

// Save accepted pages as a single searchable PDF
if (acceptedResults.Any())
{
    api.SaveMultipageDocument("high-confidence-invoices.pdf",
        SaveFormat.Pdf, acceptedResults);
}

Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
Imports System
Imports System.IO
Imports System.Linq
Imports Aspose.OCR

' Batch recognition with confidence filtering before output
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
    .Language = Language.Eng,
    .DetectAreasMode = DetectAreasMode.DOCUMENT
}

Dim documentPaths As String() = Directory.GetFiles("invoice-archive", "*.jpg")
Dim acceptedResults As New List(Of RecognitionResult)()
Dim rejectedPaths As New List(Of String)()

For Each path In documentPaths
    Dim result = api.RecognizeImage(path, settings)

    ' Confidence is an array of per-region values — must average manually
    Dim avgConfidence As Single = If(result.RecognitionAreasConfidence IsNot Nothing,
                                     result.RecognitionAreasConfidence.Average(),
                                     0.0F)

    If avgConfidence >= 0.70F Then
        acceptedResults.Add(result)
    Else
        rejectedPaths.Add(path)
        Console.WriteLine($"Rejected: {path} ({avgConfidence:P0} confidence)")
    End If
Next

' Save accepted pages as a single searchable PDF
If acceptedResults.Any() Then
    api.SaveMultipageDocument("high-confidence-invoices.pdf",
                              SaveFormat.Pdf, acceptedResults)
End If

Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}")
$vbLabelText   $csharpLabel

IronOCR Ansatz:

// Batch recognition with confidence filtering using unified result model
var ocr = new IronTesseract();
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");

var acceptedResults = new List<OcrResult>();
var rejectedPaths = new List<string>();

foreach (var path in documentPaths)
{
    var result = ocr.Read(path);

    // Single confidence value — no averaging required
    if (result.Confidence >= 70.0)
    {
        acceptedResults.Add(result);
    }
    else
    {
        rejectedPaths.Add(path);
        Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)");
    }
}

// Save accepted pages — each result becomes a page in the output PDF
if (acceptedResults.Any())
{
    using var outputInput = new OcrInput();
    foreach (var path in documentPaths
        .Where(p => !rejectedPaths.Contains(p)))
    {
        outputInput.LoadImage(path);
    }
    var combined = ocr.Read(outputInput);
    combined.SaveAsSearchablePdf("high-confidence-invoices.pdf");
}

Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
// Batch recognition with confidence filtering using unified result model
var ocr = new IronTesseract();
string[] documentPaths = Directory.GetFiles("invoice-archive", "*.jpg");

var acceptedResults = new List<OcrResult>();
var rejectedPaths = new List<string>();

foreach (var path in documentPaths)
{
    var result = ocr.Read(path);

    // Single confidence value — no averaging required
    if (result.Confidence >= 70.0)
    {
        acceptedResults.Add(result);
    }
    else
    {
        rejectedPaths.Add(path);
        Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)");
    }
}

// Save accepted pages — each result becomes a page in the output PDF
if (acceptedResults.Any())
{
    using var outputInput = new OcrInput();
    foreach (var path in documentPaths
        .Where(p => !rejectedPaths.Contains(p)))
    {
        outputInput.LoadImage(path);
    }
    var combined = ocr.Read(outputInput);
    combined.SaveAsSearchablePdf("high-confidence-invoices.pdf");
}

Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}");
Imports IronTesseract
Imports System.IO
Imports System.Linq

' Batch recognition with confidence filtering using unified result model
Dim ocr As New IronTesseract()
Dim documentPaths As String() = Directory.GetFiles("invoice-archive", "*.jpg")

Dim acceptedResults As New List(Of OcrResult)()
Dim rejectedPaths As New List(Of String)()

For Each path In documentPaths
    Dim result = ocr.Read(path)

    ' Single confidence value — no averaging required
    If result.Confidence >= 70.0 Then
        acceptedResults.Add(result)
    Else
        rejectedPaths.Add(path)
        Console.WriteLine($"Rejected: {path} ({result.Confidence:F1}% confidence)")
    End If
Next

' Save accepted pages — each result becomes a page in the output PDF
If acceptedResults.Any() Then
    Using outputInput As New OcrInput()
        For Each path In documentPaths.Where(Function(p) Not rejectedPaths.Contains(p))
            outputInput.LoadImage(path)
        Next
        Dim combined = ocr.Read(outputInput)
        combined.SaveAsSearchablePdf("high-confidence-invoices.pdf")
    End Using
End If

Console.WriteLine($"Accepted: {acceptedResults.Count}, Rejected: {rejectedPaths.Count}")
$vbLabelText   $csharpLabel

result.Confidence ist ein einfaches double im Bereich von 0 bis 100. Das Aspose RecognitionAreasConfidence-Array-Durchschnitt gibt einen float in einem Bereich zurück, der von der Version abhängt — der Vergleichsschwellenwert muss während der Migration angepasst werden. Die Konfidenzwerte dienen als Leitfaden für die Konfidenzwerte pro Wort, pro Zeile und pro Seite in Dokumentenvalidierungs-Workflows. Für Batchverarbeitungsmuster mit hohem Datenvolumen siehe das Beispiel zur Multithreading-Verarbeitung .

Strukturierte Ausgabeverarbeitung

Aspose.OCR gibt strukturierte Daten über SaveMultipageDocument mit formatspezifischen SaveFormat-Enum-Werten aus. JSON-Ausgabe schreibt eine maschinenlesbare Datei; XML-Ausgabe schreibt eine annotierte Dokumentdatei. Der Zugriff auf die rohen strukturierten Daten — Wortpositionen, Zeilengrenzen — erfordert das Durchlaufen von RecognitionAreasRectangles, das Geometrie auf Bereichsebene und nicht auf Wortebene zurückgibt.

Aspose.OCR-Ansatz:

// Structured output: JSON and XML via SaveMultipageDocument
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
    Language = Language.Eng,
    DetectAreasMode = DetectAreasMode.COMBINE
};

var results = new List<RecognitionResult>();
foreach (var path in new[] { "page1.jpg", "page2.jpg", "page3.jpg" })
{
    results.Add(api.RecognizeImage(path, settings));
}

// Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results);

// Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results);

// Accessing area-level geometry (not word-level)
foreach (var result in results)
{
    var areas = result.RecognitionAreasRectangles;
    if (areas != null)
    {
        foreach (var area in areas)
        {
            Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}");
        }
    }
    // No direct word-level collection with individual confidence values
}
// Structured output: JSON and XML via SaveMultipageDocument
var api = new AsposeOcr();
var settings = new RecognitionSettings
{
    Language = Language.Eng,
    DetectAreasMode = DetectAreasMode.COMBINE
};

var results = new List<RecognitionResult>();
foreach (var path in new[] { "page1.jpg", "page2.jpg", "page3.jpg" })
{
    results.Add(api.RecognizeImage(path, settings));
}

// Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results);

// Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results);

// Accessing area-level geometry (not word-level)
foreach (var result in results)
{
    var areas = result.RecognitionAreasRectangles;
    if (areas != null)
    {
        foreach (var area in areas)
        {
            Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}");
        }
    }
    // No direct word-level collection with individual confidence values
}
Imports System
Imports System.Collections.Generic
Imports AsposeOcr

' Structured output: JSON and XML via SaveMultipageDocument
Dim api As New AsposeOcr()
Dim settings As New RecognitionSettings With {
    .Language = Language.Eng,
    .DetectAreasMode = DetectAreasMode.COMBINE
}

Dim results As New List(Of RecognitionResult)()
For Each path In New String() {"page1.jpg", "page2.jpg", "page3.jpg"}
    results.Add(api.RecognizeImage(path, settings))
Next

' Export as JSON
api.SaveMultipageDocument("output.json", SaveFormat.Json, results)

' Export as XML
api.SaveMultipageDocument("output.xml", SaveFormat.Xml, results)

' Accessing area-level geometry (not word-level)
For Each result In results
    Dim areas = result.RecognitionAreasRectangles
    If areas IsNot Nothing Then
        For Each area In areas
            Console.WriteLine($"Area at ({area.X},{area.Y}): {area.Width}x{area.Height}")
        Next
    End If
    ' No direct word-level collection with individual confidence values
Next
$vbLabelText   $csharpLabel

IronOCR Ansatz:

// Structured output: navigate a rich result object model
var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("page1.jpg");
input.LoadImage("page2.jpg");
input.LoadImage("page3.jpg");

var result = ocr.Read(input);

// Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf");

// Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr");

// Word-level structured access — direct collection, no indirection
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " +
                      $"{page.Confidence:F1}% confidence");

    foreach (var word in page.Words)
    {
        Console.WriteLine($"  '{word.Text}' at ({word.X},{word.Y}) " +
                          $"size {word.Width}x{word.Height} — {word.Confidence:F1}%");
    }
}

// Paragraph-level layout for document structure analysis
foreach (var paragraph in result.Pages[0].Paragraphs)
{
    Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
// Structured output: navigate a rich result object model
var ocr = new IronTesseract();

using var input = new OcrInput();
input.LoadImage("page1.jpg");
input.LoadImage("page2.jpg");
input.LoadImage("page3.jpg");

var result = ocr.Read(input);

// Export as searchable PDF (preserves layout)
result.SaveAsSearchablePdf("output.pdf");

// Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
result.SaveAsHocrFile("output.hocr");

// Word-level structured access — direct collection, no indirection
foreach (var page in result.Pages)
{
    Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " +
                      $"{page.Confidence:F1}% confidence");

    foreach (var word in page.Words)
    {
        Console.WriteLine($"  '{word.Text}' at ({word.X},{word.Y}) " +
                          $"size {word.Width}x{word.Height} — {word.Confidence:F1}%");
    }
}

// Paragraph-level layout for document structure analysis
foreach (var paragraph in result.Pages[0].Paragraphs)
{
    Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
Imports IronTesseract

' Structured output: navigate a rich result object model
Dim ocr As New IronTesseract()

Using input As New OcrInput()
    input.LoadImage("page1.jpg")
    input.LoadImage("page2.jpg")
    input.LoadImage("page3.jpg")

    Dim result = ocr.Read(input)

    ' Export as searchable PDF (preserves layout)
    result.SaveAsSearchablePdf("output.pdf")

    ' Export as hOCR (XHTML with bounding box coordinates — feeds downstream tools)
    result.SaveAsHocrFile("output.hocr")

    ' Word-level structured access — direct collection, no indirection
    For Each page In result.Pages
        Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words, " &
                          $"{page.Confidence:F1}% confidence")

        For Each word In page.Words
            Console.WriteLine($"  '{word.Text}' at ({word.X},{word.Y}) " &
                              $"size {word.Width}x{word.Height} — {word.Confidence:F1}%")
        Next
    Next

    ' Paragraph-level layout for document structure analysis
    For Each paragraph In result.Pages(0).Paragraphs
        Console.WriteLine($"Paragraph at ({paragraph.X},{paragraph.Y}): {paragraph.Text}")
    Next
End Using
$vbLabelText   $csharpLabel

IronOCR stellt wortbezogene Daten als direkte Words-Sammlung auf jeder Seite bereit, mit individuellen Confidence-Werten pro Wort. Aspose.OCR's RecognitionAreasRectangles bietet Bereichsgeometrie ohne detaillierte Vertrauensauflösung auf Wortebene. Der hOCR-Export erzeugt XHTML, das mit Tools kompatibel ist, die Ausgaben mit Begrenzungsrahmen-Annotationen verarbeiten – Einzelheiten zum Format finden Sie im hOCR-Exportleitfaden . Für das vollständige strukturierte Ergebnismodell dokumentiert die OcrResult-API-Referenz jede Eigenschaft auf OcrResult.Page, OcrResult.Paragraph, OcrResult.Line und OcrResult.Word.

Aspose.OCR API zu IronOCR Mapping-Referenz

Aspose.OCR IronOCR-Äquivalent
AsposeOcr IronTesseract
RecognitionSettings Eigenschaften auf IronTesseract + OcrInput
DocumentRecognitionSettings OcrInput mit LoadPdf() / LoadPdfPages()
api.RecognizeImage(path, settings) ocr.Read(path) oder ocr.Read(input)
api.RecognizePdf(path, settings) ocr.Read(path) oder ocr.Read(input)
result.RecognitionText result.Text
result.RecognitionAreasConfidence.Average() result.Confidence (einfaches Double, 0–100)
result.RecognitionAreasRectangles result.Words (mit X, Y, Breite, Höhe, Vertrauen)
RecognitionResult OcrResult
Language.Eng OcrLanguage.English
DetectAreasMode.COMBINE Automatisch – keine Aufzählung erforderlich
DetectAreasMode.TABLE Automatisch — use result.Pages[n].Paragraphs für Layout
DetectAreasMode.DOCUMENT Automatisch – die Engine übernimmt die Layoutanalyse
settings.RecognizeSingleLine = true ocr.Configuration.WhiteListCharacters oder Einzelbereich-Zuschnitt
settings.RecognitionAreas = new List<Rectangle> { r } input.LoadImage(path, cropRectangle)
settings.AutoSkew = true Automatisch oder explizit input.Deskew()
PreprocessingFilter.AutoSkew() input.Deskew()
PreprocessingFilter.AutoDenoising() input.DeNoise()
PreprocessingFilter.ContrastCorrectionFilter() input.Contrast()
PreprocessingFilter.Binarize() input.Binarize()
PreprocessingFilter.Threshold(value) input.Binarize() (aut. Schwelle)
PreprocessingFilter.Median() input.DeNoise()
PreprocessingFilter.Scale(factor) input.Scale(percent)
PreprocessingFilter.Invert() input.Invert()
PreprocessingFilter.Rotate(angle) input.Rotate(angle)
api.SaveMultipageDocument(path, SaveFormat.Pdf, list) result.SaveAsSearchablePdf(path)
api.SaveMultipageDocument(path, SaveFormat.Docx, list) Via hOCR-Export: result.SaveAsHocrFile(path)
api.SaveMultipageDocument(path, SaveFormat.Json, list) Navigieren Sie result.Pages und serialisieren Sie direkt
api.PreprocessImage(path, filters) input.GetPages()[0].SaveAsImage(path)
api.CalculateSkew(imagePath) input.Deskew() (wenden Sie den erkannten Winkel automatisch an)
new Aspose.OCR.License().SetLicense("file.lic") IronOcr.License.LicenseKey = "key"
settings.ThreadsCount = n Standardmäßig threadsicher; verwenden Sie Parallel.ForEach

Gängige Migrationsprobleme und Lösungen

Problem 1: DetectAreasMode hat kein direktes Äquivalent.

Aspose.OCR: Der Code setzt settings.DetectAreasMode = DetectAreasMode.TABLE oder DetectAreasMode.COMBINE und erwartet spezifisches Layoutverhalten. Das Entfernen des Enums wirft die Frage auf, wie IronOCR mit demselben Layout umgeht.

Lösung: Entfernen Sie die Aufzählung vollständig.IronOCR führt automatisch eine Layoutanalyse durch. Wenn Sie die erkannte Layoutstruktur inspizieren müssen, navigieren Sie result.Pages[n].Paragraphs — jeder Absatz enthält ein begrenzendes X, Y, Breite, Höhe Kästchen und den darin enthaltenen Text. Für die explizite Tabellenextraktion siehe die Anleitung zum Einlesen von Tabellen :

// No mode to set — read directly and inspect the structure
var result = new IronTesseract().Read("data-table.jpg");
foreach (var paragraph in result.Pages[0].Paragraphs)
{
    Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
// No mode to set — read directly and inspect the structure
var result = new IronTesseract().Read("data-table.jpg");
foreach (var paragraph in result.Pages[0].Paragraphs)
{
    Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}");
}
Imports IronTesseract

Dim result = New IronTesseract().Read("data-table.jpg")
For Each paragraph In result.Pages(0).Paragraphs
    Console.WriteLine($"Block ({paragraph.X},{paragraph.Y}): {paragraph.Text}")
Next
$vbLabelText   $csharpLabel

Problem 2: Diskrepanz zwischen Konfidenzschwellenwert für Erkennungsbereiche

Aspose.OCR: Bestehender Code vergleicht result.RecognitionAreasConfidence.Average() gegen einen Schwellenwert wie 0.75f. IronOCR's result.Confidence befindet sich auf einer anderen Skala.

Lösung: result.Confidence ist ein Prozentsatz von 0–100. Multiplizieren Sie Ihren Aspose-Schwellenwert mit 100, um zu konvertieren: 0.75f wird zu 75.0. Aktualisieren Sie anschließend die gesamte Vergleichslogik:

// Aspose.OCR threshold pattern
// if (result.RecognitionAreasConfidence.Average() >= 0.75f)

//IronOCR equivalent — multiply old threshold by 100
var result = new IronTesseract().Read("document.jpg");
if (result.Confidence >= 75.0)
{
    Console.WriteLine($"High confidence result: {result.Text}");
}
// Aspose.OCR threshold pattern
// if (result.RecognitionAreasConfidence.Average() >= 0.75f)

//IronOCR equivalent — multiply old threshold by 100
var result = new IronTesseract().Read("document.jpg");
if (result.Confidence >= 75.0)
{
    Console.WriteLine($"High confidence result: {result.Text}");
}
Imports IronOcr

Dim result = New IronTesseract().Read("document.jpg")
If result.Confidence >= 75.0 Then
    Console.WriteLine($"High confidence result: {result.Text}")
End If
$vbLabelText   $csharpLabel

Problem 3: SaveMultipageDocument JSON/XML-Ausgabe hat keine direkte Methode

Aspose.OCR: api.SaveMultipageDocument("out.json", SaveFormat.Json, results) schreibt eine JSON-Datei mit Erkennungsmetadaten. Teams, die diese Ausgabe weiterverarbeiten, müssen das Äquivalent finden.

Lösung:IronOCR verfügt nicht über eine SaveFormat.Json-äquivalente Methode. Der Ersatz ist, result.Pages zu navigieren und mit System.Text.Json zu serialisieren. Dies gibt Ihnen die volle Kontrolle über das Schema:

using var input = new OcrInput();
input.LoadImage("document.jpg");
var result = new IronTesseract().Read(input);

// Build your own structured JSON from the result model
var pageData = result.Pages.Select(p => new
{
    PageNumber = p.PageNumber,
    Confidence = p.Confidence,
    Text = p.Text,
    Words = p.Words.Select(w => new
    {
        Text = w.Text,
        X = w.X,
        Y = w.Y,
        Width = w.Width,
        Height = w.Height,
        Confidence = w.Confidence
    }).ToArray()
}).ToArray();

File.WriteAllText("output.json",
    System.Text.Json.JsonSerializer.Serialize(pageData,
        new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
using var input = new OcrInput();
input.LoadImage("document.jpg");
var result = new IronTesseract().Read(input);

// Build your own structured JSON from the result model
var pageData = result.Pages.Select(p => new
{
    PageNumber = p.PageNumber,
    Confidence = p.Confidence,
    Text = p.Text,
    Words = p.Words.Select(w => new
    {
        Text = w.Text,
        X = w.X,
        Y = w.Y,
        Width = w.Width,
        Height = w.Height,
        Confidence = w.Confidence
    }).ToArray()
}).ToArray();

File.WriteAllText("output.json",
    System.Text.Json.JsonSerializer.Serialize(pageData,
        new System.Text.Json.JsonSerializerOptions { WriteIndented = true }));
Imports IronOcr
Imports System.IO
Imports System.Text.Json

Using input As New OcrInput()
    input.LoadImage("document.jpg")
    Dim result = New IronTesseract().Read(input)

    ' Build your own structured JSON from the result model
    Dim pageData = result.Pages.Select(Function(p) New With {
        .PageNumber = p.PageNumber,
        .Confidence = p.Confidence,
        .Text = p.Text,
        .Words = p.Words.Select(Function(w) New With {
            .Text = w.Text,
            .X = w.X,
            .Y = w.Y,
            .Width = w.Width,
            .Height = w.Height,
            .Confidence = w.Confidence
        }).ToArray()
    }).ToArray()

    File.WriteAllText("output.json",
        JsonSerializer.Serialize(pageData,
            New JsonSerializerOptions With {.WriteIndented = True}))
End Using
$vbLabelText   $csharpLabel

Für XHTML-Ausgabe mit eingebetteten Koordinaten, die nachgelagerte Tools analysieren können, ist result.SaveAsHocrFile("output.hocr") das näherliegende semantische Äquivalent.

Problem 4: DocumentRecognitionSettings.StartPage verwendet einen 0-basierten Index

Aspose.OCR: DocumentRecognitionSettings.StartPage = 2 bedeutet die dritte Seite (0-basiert). Dies ist der häufigste Off-by-One-Fehler bei Aspose-zu-IronOCR-Migrationen.

Lösung:IronOCR verwendet durchgehend eine 1-basierte Seitenindizierung. Addieren Sie 1 zu jedem StartPage-Wert und berechnen Sie die Endseite entsprechend neu. Schreiben Sie einen gezielten Test anhand einer bekannten mehrseitigen PDF-Datei, um dies vor der Produktion zu erkennen:

// Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
// var settings = new DocumentRecognitionSettings { StartPage = 2, PagesNumber = 3 };

// IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
using var input = new OcrInput();
input.LoadPdfPages("document.pdf", 3, 5);
var result = new IronTesseract().Read(input);
// Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
// var settings = new DocumentRecognitionSettings { StartPage = 2, PagesNumber = 3 };

// IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
using var input = new OcrInput();
input.LoadPdfPages("document.pdf", 3, 5);
var result = new IronTesseract().Read(input);
Imports IronOcr

' Aspose.OCR: StartPage = 2 means the 3rd page (0-based)
' Dim settings As New DocumentRecognitionSettings With {.StartPage = 2, .PagesNumber = 3}

' IronOCR: page 3 is index 3 (1-based), range of 3 ends at page 5
Using input As New OcrInput()
    input.LoadPdfPages("document.pdf", 3, 5)
    Dim result = New IronTesseract().Read(input)
End Using
$vbLabelText   $csharpLabel

Problem 5: RecognizeSingleLine hat kein direktes Flag

Aspose.OCR: settings.RecognizeSingleLine = true weist den Motor an, das gesamte Bild als einzelne Textzeile zu behandeln. Dies wird für die Erkennung von Etiketten, den Feldauszug und andere Festformat-Eingaben verwendet.

Lösung: Verwenden Sie eine CropRectangle, um die Textzeile präzise zu isolieren, was verhindert, dass der Motor vollständige Layout-Erkennung auf einem Einzelzeilenbild durchführt. Für maschinenlesbare Zonen oder Etikettenformate beschreibt der Leitfaden zum Lesen spezifischer Dokumente das jeweils geeignete Vorgehen:

// Aspose.OCR: single-line flag
// var settings = new RecognitionSettings { RecognizeSingleLine = true };

// IronOCR: crop to the line region — layout detection skips automatically
var lineRegion = new CropRectangle(10, 45, 600, 30); // x, y, width, height
using var input = new OcrInput();
input.LoadImage("label.jpg", lineRegion);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text.Trim());
// Aspose.OCR: single-line flag
// var settings = new RecognitionSettings { RecognizeSingleLine = true };

// IronOCR: crop to the line region — layout detection skips automatically
var lineRegion = new CropRectangle(10, 45, 600, 30); // x, y, width, height
using var input = new OcrInput();
input.LoadImage("label.jpg", lineRegion);
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text.Trim());
Imports IronOcr

Dim lineRegion As New CropRectangle(10, 45, 600, 30) ' x, y, width, height
Using input As New OcrInput()
    input.LoadImage("label.jpg", lineRegion)
    Dim result = New IronTesseract().Read(input)
    Console.WriteLine(result.Text.Trim())
End Using
$vbLabelText   $csharpLabel

Problem 6: Pro-Thread Aspose.OCR Instanzen Nicht Erforderlich

Aspose.OCR: Die Dokumentation empfiehlt, für jeden Thread eine neue AsposeOcr() Instanz zu erstellen, um Thread-Sicherheitsprobleme bei der parallelen Verarbeitung zu vermeiden. Bestehender Code erstellt Instanzen innerhalb von Parallel.ForEach-Lambdas.

Lösung: IronTesseract ist threadsicher. Eine einzelne Instanz verarbeitet parallele Arbeitslasten. Entfernen Sie die Instanziierung pro Thread und teilen Sie eine Instanz:

// Aspose.OCR: per-thread instance due to thread-safety concerns
// Parallel.ForEach(paths, path => { var api = new AsposeOcr(); ... });

// IronOCR: single shared instance, fully thread-safe
var ocr = new IronTesseract();

Parallel.ForEach(documentPaths, path =>
{
    var result = ocr.Read(path);
    Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%");
});
// Aspose.OCR: per-thread instance due to thread-safety concerns
// Parallel.ForEach(paths, path => { var api = new AsposeOcr(); ... });

// IronOCR: single shared instance, fully thread-safe
var ocr = new IronTesseract();

Parallel.ForEach(documentPaths, path =>
{
    var result = ocr.Read(path);
    Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%");
});
Imports System.IO
Imports IronOcr
Imports System.Threading.Tasks

Dim ocr As New IronTesseract()

Parallel.ForEach(documentPaths, Sub(path)
    Dim result = ocr.Read(path)
    Console.WriteLine($"{Path.GetFileName(path)}: {result.Confidence:F1}%")
End Sub)
$vbLabelText   $csharpLabel

Aspose.OCR-Migrationscheckliste

Vor der Migration anfallende Aufgaben

Prüfen Sie alle Aspose.OCR-Verweise im Quellcode:

grep -rn "using Aspose.OCR" --include="*.cs" .
grep -rn "AsposeOcr\|RecognitionSettings\|DocumentRecognitionSettings" --include="*.cs" .
grep -rn "DetectAreasMode\|SaveFormat\|RecognitionResult" --include="*.cs" .
grep -rn "RecognitionAreasConfidence\|RecognitionText\|RecognizePdf" --include="*.cs" .
grep -rn "PreprocessingFilter\|SaveMultipageDocument" --include="*.cs" .
grep -rn "Aspose.OCR.License\|SetLicense" --include="*.cs" .
grep -rn "using Aspose.OCR" --include="*.cs" .
grep -rn "AsposeOcr\|RecognitionSettings\|DocumentRecognitionSettings" --include="*.cs" .
grep -rn "DetectAreasMode\|SaveFormat\|RecognitionResult" --include="*.cs" .
grep -rn "RecognitionAreasConfidence\|RecognitionText\|RecognizePdf" --include="*.cs" .
grep -rn "PreprocessingFilter\|SaveMultipageDocument" --include="*.cs" .
grep -rn "Aspose.OCR.License\|SetLicense" --include="*.cs" .
SHELL

Dokumentieren Sie jedes Vorkommen nach Kategorie: Erkennungsaufrufe, Einstellungsobjekte, Vorverarbeitungspipelines, Ausgabeaufrufe und Lizenzinitialisierung. Notieren Sie alle DetectAreasMode-Werte im Einsatz — diese bestimmen den Layout-Migrationspfad. Erfassen Sie alle SaveFormat-Enum-Werte — jedes Nicht-PDF-Format benötigt den benutzerdefinierten Serialisierungsansatz aus Problem 3 oben.

Code-Migration

  1. Entfernen Sie das Aspose.OCR-NuGet-Paket aus allen Projekten in der Lösung
  2. Installieren Sie IronOcr-NuGet-Paket in allen Projekten
  3. Ersetze using Aspose.OCR; und using Aspose.OCR.Models; durch using IronOcr;
  4. Ersetze new Aspose.OCR.License().SetLicense("file.lic") mit IronOcr.License.LicenseKey = "key" beim App-Start
  5. Ersetze new AsposeOcr() mit new IronTesseract()
  6. Entfernen Sie alle RecognitionSettings und DocumentRecognitionSettings-Konstruktionsblöcke
  7. Entfernen Sie alle DetectAreasMode-Enum-Verweise — keine Entsprechung erforderlich
  8. Ersetze api.RecognizeImage(path, settings) mit ocr.Read(path)
  9. Ersetze api.RecognizePdf(path, settings) mit ocr.Read(path) oder ocr.Read(input) unter Verwendung von input.LoadPdf()
  10. Ersetze result.RecognitionText mit result.Text
  11. Ersetze result.RecognitionAreasConfidence.Average() mit result.Confidence und multipliziere die alte Schwelle mit 100
  12. Ersetze api.SaveMultipageDocument(path, SaveFormat.Pdf, list) mit result.SaveAsSearchablePdf(path)
  13. Ersetze api.SaveMultipageDocument(path, SaveFormat.Json, list) mit direkter Serialisierung von result.Pages
  14. Konvertieren Sie alle PreprocessingFilter-Ketten zu OcrInput-Methodenaufrufen (siehe API-Zuordnungstabelle)
  15. Aktualisieren Sie DocumentRecognitionSettings.StartPage von 0-basierend auf 1-basierend (fügen Sie jedem Wert 1 hinzu)
  16. Entfernen Sie die pro-Thread AsposeOcr-Instanziierung — teilen Sie eine einzige IronTesseract-Instanz

Post-Migrationstests

  • Führen Sie eine OCR-Analyse an einer repräsentativen Stichprobe jedes Dokumenttyps aus dem Produktiveinsatz durch und vergleichen Sie die Zeichenanzahl mit der Aspose.OCR-Basisausgabe.
  • Konfidenzwerte überprüfen:IronOCR gibt Werte zwischen 0 und 100 zurück; bestätigen Sie, dass alle Schwellenwertvergleiche die neue Skala verwenden
  • Testen Sie die Auswahl des Seitenbereichs in einer PDF-Datei mit mehr als 1 Seiten unter Verwendung einer 1-basierten Seitenzählung und überprüfen Sie, ob die richtigen Seiten zurückgegeben werden.
  • Testen des Imports passwortgeschützter PDFs ohne installiertes Aspose.PDF – Bestätigung, dass keine Abhängigkeitsausnahme auftritt
  • Bestätigen Sie, dass result.Text der erwarteten Ausgabe für jedes im Einsatz befindliche DetectAreasMode entspricht (KOMBINIERT, TABELLE, DOKUMENT)
  • Testen Sie den JSON-Ausgabepfad: serialisieren Sie result.Pages und validieren Sie das Schema gegen alle nachgelagerten Verbraucher
  • Führen Sie den parallelen Batch-Processor aus und vergewissern Sie sich, dass keine Threading-Ausnahmen vorliegen (gemeinsame IronTesseract-Instanz)
  • Sicherstellen, dass die durchsuchbare PDF-Datei in einem PDF-Viewer geöffnet wird und der Text an den richtigen Stellen auswählbar ist.
  • Sicherstellen, dass der Lizenzschlüssel in jeder Bereitstellungsumgebung (ASP.NET -Start, Azure-Funktion, Docker-Container) fehlerfrei initialisiert wird.
  • Überprüfen Sie, dass vorverarbeitete TIFF-Eingaben immer noch durch input.LoadImageFrames() die erwartete Ausgabe erzeugen

Wichtigste Vorteile der Migration zu IronOCR

Planbare Gesamtbetriebskosten vom ersten Tag an. Die Professional Lizenz für 2.999 US-Dollar deckt 10 Entwickler für 10 Projekte ab und muss nicht jährlich verlängert werden. Die Finanzabteilung schließt den OCR-Positionsposten einmal ab. Die Auswirkungen auf das Budget durch die Einstellung neuer Ingenieure, die Einführung neuer Projekte oder die Verlängerung des Produktlebenszyklus sind gleich null – es müssen keine Lizenzstufen berechnet, kein Verlängerungsdatum verfolgt und kein Compliance-Risiko durch eine versäumte Zahlung befürchtet werden. Auf der IronOCR Lizenzseite ist detailliert beschrieben, was die einzelnen Stufen abdecken.

Erkennungsaufrufe, die Absicht ausdrücken, nicht Infrastruktur. Nach der Migration ist jeder Erkennungsaufruf ocr.Read("document"). Die RecognitionSettings-Konstruktion, DetectAreasMode-Auswahl und PreprocessingFilter-Befüllung, die jedem Aspose.OCR-Aufruf vorausgegangen sind, verschwinden vollständig. Neue Ingenieure, die die OCR-Schicht der Codebasis lesen, sehen die geschäftliche Absicht – "lesen Sie dieses Dokument" – anstatt eines Konfigurationsobjekts, das vor Beginn der eigentlichen Arbeit zusammengestellt wird. Die IronTesseract-API-Referenz umfasst alle verfügbaren Konfigurationseigenschaften.

Unterstützung für verschlüsselte PDFs ohne zusätzliches Produkt. Dokumentenverarbeitungsprozesse in Enterprise verarbeiten routinemäßig passwortgeschützte PDFs. Nach der Migration werden sie von input.LoadPdf("doc.pdf", Password: "secret") nativ bearbeitet. Es muss kein Aspose.PDF-Abonnement verwaltet werden, keine Entschlüsselungs-zu-Bild-Pipeline muss gewartet werden und es muss kein zweites Verlängerungsdatum verfolgt werden. Jedes PDF-Format im Entwicklungsprozess durchläuft ein Paket, eine Lizenz und einen Codepfad. Die Anleitung zur PDF-Eingabe behandelt Seitenbereiche, nicht zusammenhängende Auswahl und Stream-Eingabe.

Strukturierte Ergebnisdaten auf Wort- und Zeichenebene. result.Pages[n].Words gibt eine Sammlung zurück, in der jedes Wort seinen Begrenzungsrahmen, seinen Text und seine individuelle Vertrauensbewertung trägt. Die Geometrie von Aspose.OCR auf Bereichsebene deckt Regionen ab, nicht einzelne Token. Nach der Migration können Dokumentenlayout-Parser, Formularfeld-Extraktoren und Rechnungsverarbeitungspipelines ohne zusätzliche Verarbeitungsschritte auf die Positionierung pro Wort zugreifen. Die vollständige Ergebnishierarchie finden Sie auf der Seite mit den OCR-Ergebnissen .

Bereitstellung mit einem einzigen Paket auf allen Plattformen.IronOCR wird als ein einziges NuGet Paket bereitgestellt, das unter Windows, Linux, macOS, Docker, Azure App Service und AWS Lambda ohne plattformspezifische Konfiguration läuft. Aspose.OCR funktioniert plattformübergreifend, erfordert aber in Containerumgebungen möglicherweise Anpassungen der nativen Bibliothek. Nach der Migration ist das Dockerfile für einen OCR-Dienst ein standardmäßiges .NET Basisimage, für das außer der Paketinstallation keine OCR-spezifischen Einrichtungsschritte erforderlich sind. Die Bereitstellungsleitfäden umfassen Docker , Azure , AWS und Linux .

Barcode-Lesen im selben Durchgang wie OCR. Das Setzen von ocr.Configuration.ReadBarCodes = true extrahiert Barcodes, QR-Codes und Code-128-Symbole aus demselben Bild in einem Motordurchgang. Aspose.OCR verfügt über keine Barcode-Funktionalität – eine separate Barcode-Bibliothek wäre erforderlich. Nach der Migration werden Dokumente, die gedruckten Text mit Barcodes mischen (Versandetiketten, Inventarformulare, Veranstaltungstickets), durch einen einzelnen Aufruf gehandhabt, wobei Ergebnisse auf result.Barcodes vorliegen. Eine Anleitung zur Barcode-OCR mit Informationen zu den unterstützten Symbologien finden Sie hier.

Hinweis:Aspose und Tesseract sind eingetragene Marken ihrer jeweiligen Eigentümer. Diese Seite ist weder mit Aspose Pty Ltd noch mit Google verbunden, anerkannt oder gesponsert. 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

Warum sollte ich von Aspose.OCR for .NET zu IronOCR migrieren?

Zu den häufigsten Gründen gehören die Beseitigung der Komplexität der COM-Interoperabilität, die Ablösung der dateibasierten Lizenzverwaltung, die Vermeidung der seitenweisen Abrechnung, die Ermöglichung der Docker-/Container-Bereitstellung und die Einführung eines NuGet-nativen Workflows, der sich in die Standard-.NET-Werkzeuge integriert.

Was sind die wichtigsten Codeänderungen bei der Migration von Aspose.OCR for .NET zu IronOCR?

Ersetzen Sie Aspose.OCR-Initialisierungssequenzen durch IronTesseract-Instanziierung, entfernen Sie das COM-Lebenszyklusmanagement (explizite Create/Load/Close-Muster) und aktualisieren Sie die Namen der Ergebniseigenschaften. Das Ergebnis sind deutlich weniger Boilerplate-Zeilen.

Wie installiere ich IronOCR, um die Migration zu beginnen?

Führen Sie 'Install-Package IronOcr' in der Paketmanager-Konsole oder 'dotnet add package IronOcr' in der CLI aus. Sprachpakete sind separate Pakete: 'dotnet add package IronOcr.Languages.French' für Französisch, zum Beispiel.

Kann IronOCR die OCR-Genauigkeit von Aspose.OCR for .NET für Standardgeschäftsdokumente erreichen?

IronOCR erzielt eine hohe Genauigkeit bei Standardgeschäftsinhalten wie Rechnungen, Verträgen, Quittungen und getippten Formularen. Bildvorverarbeitungsfilter (Schräglagenkorrektur, Rauschunterdrückung, Kontrastverbesserung) verbessern die Erkennungsgenauigkeit bei verschlechterten Eingaben weiter.

Wie geht IronOCR mit den Sprachdaten um, die Aspose.OCR for .NET separat installiert?

Die Sprachdaten in IronOCR werden als NuGet-Pakete verteilt. mit 'dotnet add package IronOcr.Languages.German' wird die deutsche Unterstützung installiert. Es sind keine manuellen Dateiplatzierungen oder Verzeichnispfade erforderlich.

Erfordert die Migration von Aspose.OCR for .NET zu IronOCR Änderungen an der Bereitstellungsinfrastruktur?

IronOCR erfordert weniger Änderungen an der Infrastruktur als Aspose.OCR for .NET. Es gibt keine SDK-Binärpfade, keine Platzierung von Lizenzdateien oder Lizenzserverkonfigurationen. Das NuGet-Paket enthält die komplette OCR-Engine, und der Lizenzschlüssel ist eine im Anwendungscode festgelegte Zeichenfolge.

Wie konfiguriere ich die IronOCR-Lizenzierung nach der Migration?

Weisen Sie IronOcr.License.LicenseKey = "YOUR-KEY" im Startup-Code der Anwendung zu. In Docker oder Kubernetes speichern Sie den Schlüssel als Umgebungsvariable und lesen ihn beim Starten aus. Verwenden Sie License.IsValidLicense zur Validierung, bevor Sie den Datenverkehr akzeptieren.

Kann IronOCR PDFs auf die gleiche Weise verarbeiten wie Aspose.OCR?

Ja, IronOCR liest sowohl native als auch gescannte PDFs. Instanziieren Sie IronTesseract, rufen Sie ocr.Read(input) auf, wobei input ein PDF-Pfad oder OcrPdfInput ist, und iterieren Sie die OcrResult-Seiten. Es ist keine separate PDF-Rendering-Pipeline erforderlich.

Wie handhabt IronOCR das Threading bei der Verarbeitung großer Datenmengen?

IronTesseract kann sicher pro Thread instanziiert werden. Sie können eine Instanz pro Thread in einem Parallel.ForEach- oder Task-Pool aufsetzen, OCR gleichzeitig ausführen und jede Instanz nach Abschluss entsorgen. Es ist kein globaler Zustand oder Sperren erforderlich.

Welche Ausgabeformate unterstützt IronOCR nach der Textextraktion?

IronOCR liefert strukturierte Ergebnisse mit Text, Wortkoordinaten, Konfidenzwerten und Seitenstruktur. Zu den Exportoptionen gehören reiner Text, durchsuchbare PDF-Dateien und strukturierte Ergebnisobjekte für die nachgeschaltete Verarbeitung.

Ist die Preisgestaltung von IronOCR für die Skalierung von Arbeitslasten berechenbarer als die von Aspose.OCR for .NET?

IronOCR verwendet eine pauschale, unbefristete Lizenzierung ohne Seiten- oder Volumengebühren. Egal, ob Sie 10.000 oder 10 Millionen Seiten verarbeiten, die Lizenzkosten bleiben konstant. Optionen für Volumen- und Teamlizenzen finden Sie auf der IronOCR-Preisseite.

Was passiert mit meinen bestehenden Tests, nachdem ich von Aspose.OCR for .NET zu IronOCR migriert habe?

Tests, die extrahierte Textinhalte überprüfen, sollten auch nach der Migration bestehen. Tests, die API-Aufrufmuster oder den Lebenszyklus von COM-Objekten validieren, müssen aktualisiert werden, um das einfachere Initialisierungs- und Ergebnismodell von IronOCR widerzuspiegeln.

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