Przejdź do treści stopki
FILMY

Migracja z Aspose.OCR do IronOCR

Ten przewodnik przeprowadza programistów .NET przez proces pełnej migracji z Aspose.OCR do IronOCR. Obejmuje to zamianę pakietów, zmiany przestrzeni nazw, inicjalizację licencji oraz cztery konkretne przykłady migracji kodu zaczerpnięte z rzeczywistych wzorców użytkowania Aspose.OCR — konfigurację ustawień rozpoznawania, tryby wykrywania obszarów, rozpoznawanie wsadowe z filtrowaniem opartym na pewności oraz obsługę wyników strukturalnych. Każdy przykład pokazuje podejście Aspose.OCR wraz z odpowiednikiem IronOCR, dzięki czemu można przetłumaczyć istniejący kod bez zgadywania.

Dlaczego warto przejść z Aspose.OCR

Powody, dla których zespoły rezygnują z Aspose.OCR, skupiają się wokół dwóch głównych kwestii: modelu rozliczeniowego opartego na subskrypcji oraz obciążenia związanego z konfiguracją, wynikającego z ręcznego procesu rozpoznawania.

Koszty subskrypcji kumulują się bez ograniczeń. Aspose.OCR nie oferuje licencji wieczystej. Licencja Developer Small Business kosztuje 999 USD rocznie na programistę. Pięcioosobowy zespół, przedłużający umowę na trzy lata, płaci 14 985 dolarów, zanim napisze choćby jedną linię kodu logiki biznesowej. Poziom Professional w IronOCR kosztuje jednorazowo 2999 USD — ten sam zakres na zawsze, bez obowiązku odnawiania. Kwestia matematyczna staje się nieunikniona, gdy dział finansowy pyta, dlaczego zależność OCR odnawia się co roku, podobnie jak subskrypcja SaaS.

Kazde wywolanie rozpoznawania wymaga ceremonii obslugi obiektow ustawien. Aspose.OCR rozdziela swoja przestrzen konfiguracyjna na RecognitionSettings, DocumentRecognitionSettings, DetectAreasMode oraz kolekcje PreprocessingFilter. Zanim mozna wywolac RecognizeImage, nalezy skonstruowac obiekt ustawien, wypelnic go i przekazac jawnie.IronOCR sprowadza to do .Read(). Różnica jest niewielka na jedno wywołanie; gromadzi się w całym kodzie źródłowym.

Wybor trybu wykrywania obszaru jest reczny i konsekwentny. Aspose.OCR wystawia wartosci DetectAreasMode (COMBINE, DOCUMENT, TABLE, NONE), ktore programista musi wybrac dla kazdego typu dokumentu. Niewłaściwy tryb w formularzu strukturalnym obniża dokładność rozpoznawania.IronOCR automatycznie analizuje układ dokumentu i udostępnia uporządkowany wynik — akapity, wiersze, słowa — bez konieczności wcześniejszego deklarowania trybu.

Przetwarzanie wsadowe wymaga recznego zarzadzania listami wynikowymi. Zapisanie partii rozpoznanych stron jako przeszukiwalnego pliku PDF lub strukturalnego pliku danych w Aspose.OCR oznacza gromadzenie obiektow RecognitionResult do List<RecognitionResult>, a nastepnie przekazanie tej listy do SaveMultipageDocument. Za uporządkowanie listy odpowiadasz Ty.IronOCR akceptuje wiele wejsc poprzez pojedynczy obiekt OcrInput i generuje jeden OcrResult obejmujacy wszystkie strony.

Przelaczanie formatu wyjsciowego dotyka wielu powierzchni API. Eksportowanie do JSON, XML lub czystego tekstu w Aspose.OCR kazde wymaga osobnej wartosci wyliczenia SaveFormat przekazanej do SaveMultipageDocument. Filtrowanie tych wynikow wedlug pewnosci przed zapisaniem wymaga iterowania listy i sprawdzania kazdej tablicy RecognitionAreasConfidence.IronOCR wystawia result.Text, result.Confidence i result.Pages na pojedynczym obiekcie wynikowym — filtrowanie pewnosci jest jednolinijkowym wyrazeniem LINQ.

Model licencjonowania IronOCR całkowicie eliminuje ryzyko związane z odnowieniem. Zakupiona licencja należy do Ciebie na stałe. Aktualizacje są dostępne przez rok; Następnie ostatnia otrzymana wersja nadal działa w środowisku produkcyjnym bez narażania zgodności. Nie ma sytuacji, w której brak płatności uniemożliwiłby wdrożenie.

Podstawowy problem

Aspose.OCR wiąże konfigurację rozpoznawania z obiektem ustawień, który musi być utworzony, wypełniony i przekazany przy każdym wywołaniu. Tryb, język, filtry i strategia obszarowa są właściwościami tego obiektu:

// 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 uzywa pojedynczego wywolania .Read(). Konfiguracja odbywa sie na instancji IronTesseract, gdy jest potrzebna, a nie na obiekcie pojedynczego wywolania:

// 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 a Aspose.OCR: porównanie funkcji

Poniższa tabela przedstawia porównanie obu bibliotek pod kątem czynników, które mają największe znaczenie przy podejmowaniu decyzji o migracji.

Funkcja Aspose.OCR IronOCR
Model licencji Roczna subskrypcja (brak opcji wieczystej) Wieczyste, jednorazowe zakupy
Koszt 1 programisty 999 USD/rok $999 raz
Koszt 10 programistów 4995 USD/rok (licencja na witrynę) 2999 USD jednorazowo (wersja Professional)
Konsekwencje wygaśnięcia licencji Nie można wdrażać nowych kompilacji, brak poprawek bezpieczeństwa Brak — wersja zakupiona działa bezterminowo
Główna klasa OCR AsposeOcr IronTesseract
Wymagany obiekt Settings Tak (RecognitionSettings lub DocumentRecognitionSettings) Nie — opcjonalne OcrInput dla zaawansowanych scenariuszy
Wykrywanie obszarów Ręczny wybor wyliczenia DetectAreasMode Automatyczna analiza układu
Przetwarzanie wstępne Ręczna kolekcja PreprocessingFilter Automatyczne z opcjonalnym jawnym nadpisaniem
Plik wejściowy PDF Standardowe PDF-y za posrednictwem RecognizePdf() Natywne za pomoca .Read() lub OcrInput.LoadPdf()
Plik PDF chroniony hasłem Wymaga Aspose.PDF (oddzielna licencja) Wbudowany parametr Password:
Wynik w formacie PDF z możliwością wyszukiwania SaveMultipageDocument(path, SaveFormat.Pdf, list) result.SaveAsSearchablePdf(path)
Wartość pewności result.RecognitionAreasConfidence.Average() (tablica) result.Confidence (pojedyncza wartosc zmiennoprzecinkowa, 0–100)
Dane strukturalne na poziomie słów Geometria poziomu obszaru za pomoca RecognitionAreasRectangles result.Words z X, Y, Szerokosc, Wysokosc, Pewnosc
Dane strukturalne na poziomie strony Nieujawnione result.Pages z akapitami, liniami, slowami, znakami
Wielojęzyczne tłumaczenie symultaniczne Jeden język na wywołanie OcrLanguage.French + OcrLanguage.German
Obsługiwane języki Ponad 130 w pakiecie głównym Ponad 125 pakietów językowych dostępnych za pośrednictwem NuGet
Odczytywanie BarCode Niedostępne Wbudowane (ocr.Configuration.ReadBarCodes = true)
Bezpieczeństwo wątków Zalecane jest utworzenie nowej instancji dla każdego wątku W pełni bezpieczna dla wątków, pojedyncza wspólna instancja
TIFF wieloklatkowy Nie jest to język ojczysty input.LoadImageFrames("file.tiff")
eksport hOCR Ograniczone result.SaveAsHocrFile(path)
Wielopłatformowy NuGet Tak Tak (Windows, Linux, macOS, Docker, Azure, AWS)
Liczba pakietów NuGet 1 główny + opcjonalne pakiety językowe 1 główny + opcjonalne pakiety językowe

Szybki start: Migracja z Aspose.OCR do IronOCR

Krok 1: Zastąp pakiet NuGet

Usuń Aspose.OCR:

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

Zainstaluj IronOCR z NuGet:

dotnet add package IronOcr

Krok 2: Aktualizacja przestrzeni nazw

Zamień wszystkie importy przestrzeni nazw Aspose.OCR:

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

Krok 3: Inicjalizacja licencji

Usuń odniesienie do licencji opartej na pliku Aspose i zastąp je kluczem IronOCR. Umieść to przy uruchomieniu aplikacji — raz na proces, a nie raz na żądanie:

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

Przykłady migracji kodu

Konfiguracja ustawień rozpoznawania

Aspose.OCR centralizuje cale zachowanie w rozpoznawaniu w obiekcie RecognitionSettings. Język, tryb wykrywania obszaru, flaga pojedynczej linii i próg są tam dostępne jako właściwości. Tworzysz go od nowa dla każdego typu dokumentu lub wzorca wywołania.

Podejście Aspose.OCR:

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

Podejście IronOCR:

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

Nie ma obiektu ustawień do utworzenia dla każdego wywołania. Jezyk jest ustawiany na instancji IronTesseract; celowanie regionu odbywa sie na OcrInput w chwili ladowania. Decyzje DetectAreasMode i RecognizeSingleLine sa podejmowane automatycznie przez silnik. Szczegółowe wskazówki dotyczące OCR opartego na regionach można znaleźć w przewodniku dotyczącym OCR opartego na regionach.

Migracja trybu wykrywania obszaru

Aspose.OCR wymaga wybrania wartosci DetectAreasMode przed kazdym wywolaniem rozpoznawania. COMBINE laczy tekst z roznych regionow ukladu, DOCUMENT traktuje obraz jako standardowy dokument, TABLE optymalizuje dla ukladow siatkowych. Wybranie niewłaściwego trybu dla danego typu dokumentu powoduje nieprawidłowe wyrównanie lub brak wyników.

Podejście Aspose.OCR:

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

Podejście IronOCR:

// 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 całkowicie eliminuje konieczność wyboru trybu. Silnik analizuje uklad i wystawia wynik poprzez hierarchie Pages, Paragraphs, Lines i Words. Przewodnik po wynikach odczytu opisuje, jak poruszać się po pełnym modelu wyników strukturalnych w celu analizy układu dokumentu. W przypadku wzorców ekstrakcji dotyczących tabel zapoznaj się z instrukcją odczytu tabel.

Rozpoznawanie partii z filtrowaniem opartym na pewności

Przeplywy pracy wsadowej Aspose.OCR akumuluja obiekty RecognitionResult w liscie. Filtrowanie pewnosci wymaga iterowania tej listy i obliczenia sredniej dla kazdego regionu przed zaakceptowaniem wyniku. Lista musi byc zarzadzana jawnie i przekazana do SaveMultipageDocument, jesli chcesz wyprowadzic wiele stron jako pojedynczy plik.

Podejście Aspose.OCR:

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

Podejście IronOCR:

// 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 jest pojedynczym double w zakresie od 0 do 100. Srednia dla tablicy RecognitionAreasConfidence w Aspose zwraca float w zakresie zmieniajacym sie w zaleznosci od wersji — prog porownawczy wymaga dostosowania podczas migracji. Wskaźniki pewności określają wartości pewności dla poszczególnych słów, wierszy i stron w procesach walidacji dokumentów. W przypadku wzorców przetwarzania dużych partii danych zobacz przykład wielowątkowości.

Obsługa wyników w formacie strukturalnym

Aspose.OCR wyprowadza strukturalne dane przez SaveMultipageDocument z wartosciami wyliczenia SaveFormat specyficznymi dla formatu. Wyjscie JSON zapisuje plik czytelny maszynowo; wyjscie XML zapisuje plik dokumentu z adnotacjami. Dostep do surowych danych strukturalnych — polozenia slow, granic linii — wymaga iterowania RecognitionAreasRectangles, co zwraca geometrie na poziomie regionu, a nie slowa.

Podejście Aspose.OCR:

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

Podejście IronOCR:

// 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 wystawia dane na poziomie slowa jako bezposrednia kolekcje Words na kazdej stronie, z indywidualnymi wartosciami Confidence na slowo. Aspose.OCR's RecognitionAreasRectangles zapewnia geometrie regionu bez podzialu pewnosci na poziomie slowa. Eksport hOCR generuje kod XHTML zgodny z narzędziami wykorzystującymi dane wyjściowe opatrzone adnotacjami o ramkach ograniczających — szczegóły dotyczące formatu można znaleźć w przewodniku po eksporcie hOCR. Dla pelnego strukturalnego modelu wynikow Odnosnik do API OcrResult dokumentuje kazda wlasciwosc na OcrResult.Page, OcrResult.Paragraph, OcrResult.Line i OcrResult.Word.

Odnośnik do dokumentacji API Aspose.OCR do IronOCR

Aspose.OCR Odpowiednik IronOCR
AsposeOcr IronTesseract
RecognitionSettings Wlasciwosci na IronTesseract + OcrInput
DocumentRecognitionSettings OcrInput z LoadPdf() / LoadPdfPages()
api.RecognizeImage(path, settings) ocr.Read(path) lub ocr.Read(input)
api.RecognizePdf(path, settings) ocr.Read(path) lub ocr.Read(input)
result.RecognitionText result.Text
result.RecognitionAreasConfidence.Average() result.Confidence (pojedyncza wartosc zmiennoprzecinkowa, 0–100)
result.RecognitionAreasRectangles result.Words (z X, Y, Szerokosc, Wysokosc, Pewnosc)
RecognitionResult OcrResult
Language.Eng OcrLanguage.English
DetectAreasMode.COMBINE Automatyczne — nie jest wymagana enum
DetectAreasMode.TABLE Automatyczne — uzyj result.Pages[n].Paragraphs dla ukladu
DetectAreasMode.DOCUMENT Automatyczne — silnik obsługuje analizę układu
settings.RecognizeSingleLine = true ocr.Configuration.WhiteListCharacters lub przyciecie pojedynczego regionu
settings.RecognitionAreas = new List<Rectangle> { r } input.LoadImage(path, cropRectangle)
settings.AutoSkew = true Automatyczne, lub jawne input.Deskew()
PreprocessingFilter.AutoSkew() input.Deskew()
PreprocessingFilter.AutoDenoising() input.DeNoise()
PreprocessingFilter.ContrastCorrectionFilter() input.Contrast()
PreprocessingFilter.Binarize() input.Binarize()
PreprocessingFilter.Threshold(value) input.Binarize() (prog automatyczny)
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) Poprzez eksport hOCR: result.SaveAsHocrFile(path)
api.SaveMultipageDocument(path, SaveFormat.Json, list) Nawigacja result.Pages i bezposrednia serializacja
api.PreprocessImage(path, filters) input.GetPages()[0].SaveAsImage(path)
api.CalculateSkew(imagePath) input.Deskew() (automatycznie stosuje wykryty kat)
new Aspose.OCR.License().SetLicense("file.lic") IronOcr.License.LicenseKey = "key"
settings.ThreadsCount = n Domyślnie bezpieczne dla wątków; uzyj Parallel.ForEach

Typowe problemy związane z migracją i ich rozwiązania

Problem 1: DetectAreasMode nie ma bezpośredniego odpowiednika

Aspose.OCR: Kod ustawia settings.DetectAreasMode = DetectAreasMode.TABLE lub DetectAreasMode.COMBINE oczekujac specyficznego zachowania ukladu. Usunięcie enum pozostawia pytanie, w jaki sposób IronOCR radzi sobie z tym samym układem.

Rozwiązanie: Całkowicie usunąć wyliczenie.IronOCR automatycznie przeprowadza analizę układu. Jesli musisz zbadac wykryta strukture ukladu, nawiguj przez result.Pages[n].Paragraphs — kazdy akapit zawiera X, Y, Szerokosc, Wysokosc ramki granicznej i tekst, ktory zawiera. Aby uzyskać informacje na temat ekstrakcji tabel, zapoznaj się z instrukcją odczytu tabel:

// 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: Niezgodność progu pewności obszarów rozpoznawania

Aspose.OCR: Istniejacy kod porownuje result.RecognitionAreasConfidence.Average() z progiem takim jak 0.75f. Skala result.Confidence w IronOCR jest inna.

Rozwiazanie: result.Confidence to procent od 0 do 100. Pomnoz prog Aspose przez 100, aby przeksztalcic: 0.75f staje sie 75.0. Następnie zaktualizuj całą logikę porównawczą:

// 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: Wyjście JSON/XML funkcji SaveMultipageDocument nie ma bezpośredniej metody

Aspose.OCR: api.SaveMultipageDocument("out.json", SaveFormat.Json, results) tworzy plik JSON z metadanymi rozpoznawania. Zespoły korzystające z tych wyników na dalszych etapach muszą znaleźć odpowiedniki.

Rozwiazanie:IronOCR nie ma odpowiednika metody SaveFormat.Json. Zastepstwo to nawigacja do result.Pages i serializacja za pomoca System.Text.Json. Daje to pełną kontrolę nad schematem:

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

Dla wyjscia XHTML z wbudowanymi wspolrzednymi, ktore narzedzia downstream moga analizowac, result.SaveAsHocrFile("output.hocr") jest blizszym odpowiednikiem semantycznym.

Problem 4: DocumentRecognitionSettings.StartPage używa indeksu zaczynającego się od 0

Aspose.OCR: DocumentRecognitionSettings.StartPage = 2 oznacza trzecia strone (indeksowana od zera). Jest to najczęstszy błąd typu "off-by-one" występujący podczas migracji z Aspose do IronOCR.

Rozwiązanie:IronOCR stosuje indeksowanie stron oparte na numeracji 1. Dodaj 1 do kazdej wartosci StartPage i odpowiednio przelicz koncowa strone. Napisz test ukierunkowany na znany wielostronicowy plik PDF, aby wykryć ten błąd przed wprowadzeniem do produkcji:

// 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: Funkcja RecognizeSingleLine nie ma bezpośredniego znacznika

Aspose.OCR: settings.RecognizeSingleLine = true kaze silnikowi traktowac caly obraz jako pojedyncza linie tekstu. Jest to uzywane do rozpoznawania etykiet, ekstrakcji pol i innych stalych-formatow wejsciowych.

Rozwiazanie: Uzyj CropRectangle, aby precyzyjnie odseparowac linie tekstu, co zapobiega uruchamianiu przez silnik pelnego wykrywania ukladu na obrazie z pojedyncza linia. W przypadku stref czytelnych dla maszyn lub formatów etykiet odpowiednie podejście opisano w przewodniku dotyczącym odczytu określonych dokumentów:

// 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: Niekonieczne Instancje Aspose.OCR na Wątek

Aspose.OCR: Dokumentacja zaleca tworzenie nowej instancji AsposeOcr() na watek, aby uniknac problemow z bezpieczenstwem watkow w przetwarzaniu rownoleglym. Istniejacy kod tworzy instancje wewnatrz lambd Parallel.ForEach.

Rozwiazanie: IronTesseract jest bezpieczny dla watkow. Pojedyncza instancja obsługuje równoległe obciążenia. Usuń instancjonowanie na wątek i współdziel jedną instancję:

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

Lista kontrolna migracji Aspose.OCR

Zadania przed migracją

Sprawdź wszystkie odniesienia do Aspose.OCR w kodzie źródłowym:

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

Opisz każde wystąpienie według kategorii: wywołania rozpoznawania, obiekty ustawień, potoki przetwarzania wstępnego, wywołania wyjściowe oraz inicjalizacja licencji. Zanotuj wszystkie wartosci DetectAreasMode w uzyciu — to okresla, ktora sciezka migracji ukladu ma zastosowanie. Zarejestruj wszystkie wartosci wyliczenia SaveFormat — kazdy format inny niz PDF wymaga niestandardowego podejscia do serializacji z kwestii 3 powyzej.

Migracja kodu

  1. Usun pakiet NuGet Aspose.OCR ze wszystkich projektow w rozwiazaniu
  2. Zainstaluj pakiet NuGet IronOcr we wszystkich projektach
  3. Zastap using Aspose.OCR; i using Aspose.OCR.Models; using IronOcr;
  4. Zastap new Aspose.OCR.License().SetLicense("file.lic") IronOcr.License.LicenseKey = "key" przy starcie aplikacji
  5. Zastap new AsposeOcr() new IronTesseract()
  6. Usun wszystkie bloki konstrukcyjne RecognitionSettings i DocumentRecognitionSettings
  7. Usun wszystkie odniesienia do wyliczen DetectAreasMode — zadne odpowiedniki nie sa potrzebne
  8. Zastap api.RecognizeImage(path, settings) ocr.Read(path)
  9. Zastap api.RecognizePdf(path, settings) ocr.Read(path) lub ocr.Read(input) uzywajac input.LoadPdf()
  10. Zastap result.RecognitionText result.Text
  11. Zastap result.RecognitionAreasConfidence.Average() result.Confidence i pomnoz stary prog przez 100
  12. Zastap api.SaveMultipageDocument(path, SaveFormat.Pdf, list) result.SaveAsSearchablePdf(path)
  13. Zastap api.SaveMultipageDocument(path, SaveFormat.Json, list) bezposrednia serializacja result.Pages
  14. Przeksztalc wszystkie lancuchy PreprocessingFilter w wywolania metod OcrInput (zobacz tabele mapowania API)
  15. Zaktualizuj DocumentRecognitionSettings.StartPage z indeksowanego od zera na indeksowany od jeden (dodaj 1 do kazdej wartosci)
  16. Usun instancje per-watek AsposeOcr — dziel sie jedna instancja IronTesseract

Testy po migracji

  • Uruchom OCR na reprezentatywnej próbce każdego typu dokumentu używanego w środowisku produkcyjnym i porównaj liczbę znaków z wynikami bazowymi Aspose.OCR
  • Sprawdź wartości pewności:IronOCR zwraca wartości w zakresie 0–100; potwierdź, że wszystkie porównania progów używają nowej skali
  • Przetestuj wybór zakresu stron w pliku PDF liczącym ponad 10 stron, używając numeracji stron zaczynającej się od 1, i sprawdź, czy zwracane są właściwe strony
  • Przetestuj pobieranie plików PDF chronionych hasłem bez zainstalowanego Aspose.PDF — upewnij się, że nie występuje wyjątek zależności
  • Potwierdz, ze result.Text odpowiada oczekiwanym wynikom dla kazdego uzywanego DetectAreasMode (COMBINE, TABLE, DOCUMENT)
  • Przetestuj sciezke wyjscia JSON: zserializuj result.Pages i zweryfikuj schemat w stosunku do wszystkich odbiorcow downstream
  • Uruchom rownolegly proces wsadowy i sprawdz, czy nie wystepuja zadne wyjatki zwiazane z watkami (dzielona instancja IronTesseract)
  • Sprawdź, czy plik PDF z możliwością wyszukiwania otwiera się w przeglądarce PDF, a tekst można zaznaczyć w odpowiednich miejscach
  • Sprawdź, czy klucz licencyjny inicjuje się bez błędów w każdym środowisku wdrożeniowym (uruchomienie ASP.NET, Azure Function, kontener Docker)
  • Sprawdz, czy przetwarzane wstepnie wejscia TIFF nadal produkuja oczekiwane wyniki przez input.LoadImageFrames()

Kluczowe korzyści z migracji do IronOCR

Przewidywalny całkowity koszt posiadania od pierwszego dnia. Professional License w cenie 2999 USD obejmuje 10 programistów w 10 projektach bez konieczności corocznego odnawiania. Dział finansowy zamyka pozycję OCR jednorazowo. Dodanie inżynierów, uruchomienie nowych projektów lub przedłużenie cyklu życia produktu nie ma żadnego wpływu na budżet — nie ma żadnych obliczeń dotyczących poziomów licencji, nie trzeba śledzić dat odnowienia ani martwić się o ryzyko związane z brakiem zgodności wynikające z opóźnienia w płatności. Strona licencyjna IronOCR zawiera informacje o tym, co obejmuje każdy poziom.

Wywolania rozpoznawania wyrazajace intencje, a nie infrastrukture. Po migracji kazde wywolanie rozpoznawania to ocr.Read("document"). Konstrukcja RecognitionSettings, wybor DetectAreasMode i uzupelnianie PreprocessingFilter, ktore poprzedzaly kazde wywolanie Aspose.OCR, znikaja calkowicie. Nowi inżynierowie, zapoznając się z warstwą OCR kodu źródłowego, dostrzegają intencję biznesową — "przeczytaj ten dokument" — a nie obiekt konfiguracyjny tworzony przed rozpoczęciem właściwej pracy. Dokumentacja API IronTesseract obejmuje wszystkie dostępne właściwości konfiguracyjne.

Obsługa zaszyfrowanych plików PDF bez konieczności stosowania dodatkowego produktu. Enterprise systemy przepływu dokumentów rutynowo obsługują pliki PDF chronione hasłem. Po migracji input.LoadPdf("doc.pdf", Password: "secret") obsuguje je natywnie. Nie ma potrzeby zarządzania subskrypcją Aspose.PDF, utrzymywania procesu deszyfrowania do obrazu ani śledzenia drugiej daty odnowienia. Każdy format PDF w procesie przechodzi przez jeden pakiet, jedną licencję i jedną ścieżkę kodu. Poradnik dotyczący wprowadzania danych z plików PDF obejmuje zakresy stron, zaznaczenia nieciągłe oraz wprowadzanie strumieniowe.

Strukturalne dane wynikowe na poziomie slowa i znaku. result.Pages[n].Words zwraca kolekcje, w ktorej kazde slowo nosi swoje pole graniczne, swoj tekst i swoj indywidualny ocena pewnosci. Geometria na poziomie obszaru w Aspose.OCR obejmuje regiony, a nie pojedyncze tokeny. Po migracji parsery układu dokumentów, narzędzia do wyodrębniania pól formularzy oraz potoki przetwarzania faktur mogą uzyskać dostęp do pozycjonowania poszczególnych słów bez konieczności wykonywania dodatkowych czynności przetwarzania. Pełną hierarchię wyników można znaleźć na stronie funkcji wyników OCR.

Wdrożenie w jednym pakiecie na wszystkich platformach.IronOCR jest dostarczany jako jeden pakiet NuGet, który działa na systemach Windows, Linux, macOS, Docker, Azure App Service i AWS Lambda bez konieczności konfiguracji specyficznej dla danej platformy. Aspose.OCR działa na różnych platformach, ale w środowiskach kontenerowych może wymagać dostosowania bibliotek natywnych. Po migracji plik Dockerfile dla usługi OCR jest standardowym obrazem bazowym .NET Standard bez żadnych kroków konfiguracyjnych specyficznych dla OCR poza instalacją pakietu. Przewodniki wdrożeniowe obejmują platformy Docker, Azure, AWS i Linux.

Odczyt kodow kreskowych w tym samym przebiegu co OCR. Ustawienie ocr.Configuration.ReadBarCodes = true wyodrebnia kody kreskowe, kody QR oraz symbole Code 128 z tego samego obrazu w jednym przebiegu silnika. Aspose.OCR nie obsługuje kodów kreskowych — wymagana byłaby oddzielna biblioteka do obsługi kodów kreskowych. Po migracji dokumenty, ktore lacza tekst drukowany z kodami kreskowymi (etykiety wysylkowe, formularze inwentaryzacyjne, bilety na wydarzenia) sa obslugiwane przez jedno wywolanie z wynikami na result.Barcodes. Zobacz instrukcję obsługi OCR kodów kreskowych, aby zapoznać się z obsługiwanymi symbolami.

Zwróć uwagęAspose i Tesseract są zarejestrowanymi znakami towarowymi ich odpowiednich właścicieli. Ta strona nie jest powiązana z, wspierana ani sponsorowana przez Aspose Pty Ltd ani Google. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.

Często Zadawane Pytania

Dlaczego warto przejść z Aspose.OCR dla .NET na IronOCR for .NET?

Typowe czynniki motywujące to eliminacja złożoności interoperacyjności COM, zastąpienie zarządzania licencjami opartego na plikach, uniknięcie rozliczeń za stronę, umożliwienie wdrażania w Dockerze/kontenerach oraz przyjęcie natywnego dla NuGet przepływu pracy, który integruje się ze standardowymi narzędziami .NET.

Jakie są główne zmiany w kodzie podczas migracji z Aspose.OCR for .NET do IronOCR for .NET?

Zastąp sekwencje inicjalizacji Aspose.OCR instancjonowaniem IronTesseract, usuń zarządzanie cyklem życia COM (jawne wzorce Create/Load/Close) i zaktualizuj nazwy właściwości wyników. W rezultacie znacznie zmniejsza się liczba powtarzających się linii kodu.

Jak zainstalować IronOCR, aby rozpocząć migrację?

Uruchom polecenie „Install-Package IronOcr” w konsoli menedżera pakietów lub „dotnet add package IronOcr” w interfejsie CLI. Pakiety językowe są oddzielnymi pakietami: na przykład „dotnet add package IronOcr.Languages.French” dla języka francuskiego.

Czy IronOCR for .NET dorównuje dokładnością OCR Aspose.OCR w przypadku standardowych dokumentów biznesowych?

IronOCR zapewnia wysoką dokładność w przypadku standardowych treści biznesowych, w tym faktur, umów, paragonów i formularzy wypełnionych na komputerze. Filtry przetwarzania wstępnego obrazu (prostowanie, usuwanie szumów, wzmacnianie kontrastu) dodatkowo poprawiają rozpoznawanie w przypadku pogorszonej jakości danych wejściowych.

W jaki sposób IronOCR obsługuje dane językowe, które Aspose.OCR for .NET instaluje oddzielnie?

Dane językowe w IronOCR są dystrybuowane jako pakiety NuGet. Polecenie „dotnet add package IronOcr.Languages.German” instaluje obsługę języka niemiećkiego. Nie wymaga to ręcznego umieszczania plików ani podawania ścieżek katalogów.

Czy migracja z Aspose.OCR for .NET do IronOCR for .NET wymaga zmian w infrastrukturze wdrożeniowej?

IronOCR wymaga mniej zmian w infrastrukturze niż Aspose.OCR for .NET. Nie ma ścieżek binarnych SDK, lokalizacji plików licencyjnych ani konfiguracji serwerów licencyjnych. Pakiet NuGet zawiera kompletny silnik OCR, a klucz licencyjny jest ciągiem znaków ustawionym w kodzie aplikacji.

Jak skonfigurować licencjonowanie IronOCR po migracji?

W kodzie uruchamiającym aplikację przypisz IronOcr.License.LicenseKey = „YOUR-KEY”. W Dockerze lub Kubernetesie zapisz klucz jako zmienną środowiskową i odczytaj go podczas uruchamiania. Użyj License.IsValidLicense do sprawdzenia ważności przed przyjęciem ruchu.

Czy IronOCR może przetwarzać pliki PDF w taki sam sposób jak Aspose.OCR?

Tak. IronOCR odczytuje zarówno natywne, jak i zeskanowane pliki PDF. Należy utworzyć instancję IronTesseract, wywołać ocr.Read(input), gdzie input jest ścieżką do pliku PDF lub obiektem OcrPdfInput, a następnie iterować strony OcrResult. Nie jest wymagany oddzielny proces renderowania plików PDF.

W jaki sposób IronOCR radzi sobie z wątkami podczas przetwarzania dużych ilości danych?

IronTesseract można bezpiecznie instancjonować dla każdego wątku. Uruchom jedną instancję na wątek w Parallel.ForEach lub puli zadań, uruchom OCR równolegle i usuń każdą instancję po zakończeniu. Nie jest wymagany żaden stan globalny ani blokowanie.

Jakie formaty wyjściowe obsługuje IronOCR po wyodrębnieniu tekstu?

IronOCR zwraca ustrukturyzowane wyniki, w tym tekst, współrzędne słów, wyniki pewności i strukturę strony. Opcje eksportu obejmują zwykły tekst, PDF z możliwością wyszukiwania oraz obiekty wyników ustrukturyzowanych do dalszego przetwarzania.

Czy ceny IronOCR for .NET są bardziej przewidywalne niż Aspose.OCR dla .NET w przypadku skalowania obciążeń?

IronOCR stosuje licencję wieczystą z opłatą ryczałtową, bez opłat za stronę lub wolumen. Niezależnie od tego, czy przetwarzasz 10 000, czy 10 milionów stron, koszt licencji pozostaje stały. Opcje licencji wolumenowych i zespołowych znajdują się na stronie z cennikiem IronOCR.

Co stanie się z moimi istniejącymi testami po migracji z Aspose.OCR for .NET do IronOCR?

Testy sprawdzające wyodrębnioną treść tekstową powinny nadal przechodzić pomyślnie po migracji. Testy weryfikujące wzorce wywołań API lub cykl życia obiektów COM będą wymagały aktualizacji, aby odzwierciedlały prostszy model inicjalizacji i wyników IronOCR.

Kannaopat Udonpant
Inżynier oprogramowania
Zanim stał się inżynierem oprogramowania, Kannapat ukończył doktorat z zasobów środowiskowych na Uniwersytecie Hokkaido w Japonii. W czasie studiowania, Kannapat również został członkiem Laboratorium Robotyki Pojazdów, które jest częścią Wydziału Inżynierii Bioprodukcji. W 2022 roku wykorzystał swoje umiejętności w ...
Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie