푸터 콘텐츠로 바로가기
동영상

Aspose.OCR에서 IronOCR로 마이그레이션하기

이 가이드는 .NET 개발자가 Aspose.OCR에서 IronOCR 로 완전히 마이그레이션하는 과정을 안내합니다. 이 문서에서는 패키지 교체, 네임스페이스 변경, 라이선스 초기화, 그리고 실제 Aspose.OCR 사용 패턴에서 가져온 네 가지 구체적인 코드 마이그레이션 예제(인식 설정 구성, 영역 감지 모드, 신뢰도 기반 필터링을 사용한 일괄 인식, 구조화된 출력 처리)를 다룹니다. 각 예시는 Aspose.OCR 방식과IronOCR방식의 차이점을 보여주므로 추측 없이 기존 코드를 변환할 수 있습니다.

Aspose.OCR에서 마이그레이션해야 하는 이유는 무엇일까요?

Aspose.OCR을 사용하는 팀이 떠나는 주된 이유는 크게 두 가지입니다. 바로 구독형 요금 모델과 수동 인식 파이프라인으로 인한 구성 부담입니다.

구독료는 상한선 없이 계속해서 증가합니다. Aspose.OCR은 영구 라이선스 등급을 제공하지 않습니다. 개발자 소기업 라이선스 비용은 개발자 한 명당 연간 999달러입니다. 5인으로 구성된 팀이 3년 계약을 갱신할 경우, 단 한 줄의 비즈니스 로직도 작성하기 전에 14,985달러를 지불해야 합니다. IronOCR의 Professional 등급은 2,999달러로, 단 한 번만 지불하면 동일한 보장을 평생 누릴 수 있으며 갱신 의무가 없습니다. 재무 부서에서 OCR 서비스가 SaaS 구독처럼 매년 갱신되는 이유를 묻는 순간, 계산은 피할 수 없는 문제가 됩니다.

모든 인식 호출은 설정 객체의 의례를 필요로 합니다. Aspose.OCR은 RecognitionSettings, DocumentRecognitionSettings, DetectAreasMode, 그리고 PreprocessingFilter 컬렉션에 걸쳐 구성 표면을 분리합니다. RecognizeImage을 호출하기 전에 설정 객체를 구성하고 채운 다음 명시적으로 전달합니다. IronOCR은 그것을 .Read()로 압축합니다. 통화당 차이는 미미합니다. 이는 코드베이스 전체에 누적됩니다.

영역 감지 모드 선택은 수동이며 결정적입니다. Aspose.OCR은 개발자가 각 문서 유형에 대해 선택해야 하는 DetectAreasMode 값(COMBINE, DOCUMENT, TABLE, NONE)을 노출합니다. 구조화된 양식에서 잘못된 모드를 선택하면 인식 정확도가 떨어집니다.IronOCR문서 레이아웃을 자동으로 분석하여 사전 모드 선언 없이 단락, 줄, 단어와 같은 구조화된 결과를 표시합니다.

배치 처리는 결과 목록을 수작업으로 관리해야 합니다. Aspose.OCR에서 검색된 페이지의 배치를 검색 가능한 PDF 또는 구조화된 데이터 파일로 저장하려면 RecognitionResult 객체를 List<RecognitionResult>에 축적한 다음 해당 목록을 SaveMultipageDocument에 전달해야 합니다. 리스트 스레딩은 당신의 책임입니다. IronOCR은 단일 OcrInput 객체를 통해 다중 입력을 수용하고 모든 페이지를 포함하는 하나의 OcrResult을 생성합니다.

출력 형식 전환은 여러 API 표면에 영향을 미칩니다. Aspose.OCR에서 JSON, XML 또는 일반 텍스트로 내보내는 것은 각각 SaveMultipageDocument에 전달된 개별 SaveFormat 열거형 값이 필요합니다. 저장하기 전에 신뢰도에 따라 결과 필터링은 목록을 반복하고 각 RecognitionAreasConfidence 배열을 검사해야 합니다. IronOCR은 단일 결과 객체에서 result.Text, result.Confidence, 및 result.Pages을 노출합니다 - 신뢰도 필터링은 한 줄의 LINQ 표현식입니다.

IronOCR 의 라이선스 모델은 갱신 위험을 완전히 없애줍니다. 구매한 라이선스는 영구적으로 귀하의 소유입니다. 1년간 업데이트가 포함됩니다. 그 후, 마지막으로 수신된 버전은 규정 위반 없이 프로덕션 환경에서 계속 작동합니다. 지불금 미납으로 인해 배포가 중단되는 시나리오는 없습니다.

근본적인 문제

Aspose.OCR은 인식 구성을 설정 객체에 연결하는데, 이 객체는 매 호출마다 생성, 입력 및 전달되어야 합니다. 모드, 언어, 필터 및 영역 전략은 모두 해당 객체의 속성입니다.

// 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은 단일 .Read() 호출을 사용합니다. 구성은 필요할 때 IronTesseract 인스턴스에 존재하며, 호출마다 객체에 존재하지 않습니다:

// 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과 Aspose.OCR의 기능 비교

아래 표는 마이그레이션 결정 시 가장 중요한 요소들을 기준으로 두 라이브러리를 비교 분석한 것입니다.

기능 Aspose.OCR IronOCR
라이선스 모델 연간 구독 (영구 구독 옵션 없음) 영구 일회성 구매
1-개발자 비용 연간 999달러 $999 한 번
10명의 개발자 비용 연간 4,995달러(사이트 라이선스) $2,999 (Professional 용)
면허 만료로 인한 결과 새 빌드를 배포할 수 없으며 보안 패치도 적용할 수 없습니다. 없음 — 구매한 버전은 무기한으로 사용할 수 있습니다.
기본 OCR 클래스 AsposeOcr IronTesseract
설정 객체가 필요합니다 예 (RecognitionSettings 또는 DocumentRecognitionSettings) 아니요 — 고급 시나리오에 대한 선택적 OcrInput
영역 감지 수동 DetectAreasMode 열거형 선택 자동 레이아웃 분석
전처리 수동 PreprocessingFilter 컬렉션 명시적 재정의 옵션이 있는 자동 설정
PDF 입력 RecognizePdf()를 통한 표준 PDF .Read() 또는 OcrInput.LoadPdf()를 통한 네이티브
비밀번호로 보호된 PDF Aspose.PDF가 필요합니다(별도 라이선스). 내장 Password: 매개변수
검색 가능한 PDF 출력 SaveMultipageDocument(path, SaveFormat.Pdf, list) result.SaveAsSearchablePdf(path)
신뢰도 값 result.RecognitionAreasConfidence.Average() (배열) result.Confidence (단일 백분율, 0–100)
단어 수준 구조화된 데이터 RecognitionAreasRectangles를 통한 영역 수준 기하학 X, Y, 너비, 높이, 신뢰도와 함께 result.Words
페이지 수준 구조화된 데이터 노출되지 않음 단락, 줄, 단어, 문자와 함께 result.Pages
다국어 동시 통화당 한 가지 언어만 사용 가능 OcrLanguage.French + OcrLanguage.German
포함된 언어 메인 패키지에 130개 이상 포함 NuGet 언어 팩을 통해 125개 이상 추가 가능
바코드 판독 사용 불가 내장 (ocr.Configuration.ReadBarCodes = true)
스레드 안전성 스레드당 새 인스턴스를 생성하는 것이 좋습니다. 완전히 스레드 안전한 단일 공유 인스턴스
TIFF 멀티프레임 본래의 것이 아닙니다 input.LoadImageFrames("file.tiff")
hOCR 내보내기 제한적 result.SaveAsHocrFile(path)
크로스 플랫폼 NuGet 예 (Windows, Linux, macOS, Docker, Azure, AWS)
NuGet 패키지 개수 기본 언어 팩 1개 + 선택적 언어 팩 기본 언어 팩 1개 + 선택적 언어 팩

빠른 시작: Aspose.OCR에서IronOCR로 마이그레이션

1단계: NuGet 패키지 교체

Aspose.OCR을 제거하세요:

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

NuGet 에서IronOCR설치하세요.

dotnet add package IronOcr

단계 2: 네임스페이스 업데이트

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

단계 3: 라이선스 초기화

Aspose 파일 기반 라이선스 호출을 제거하고IronOCR문자열 키로 대체하십시오. 이 코드는 애플리케이션 시작 시에 배치해야 하며, 요청당 한 번이 아니라 프로세스당 한 번만 배치해야 합니다.

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

// AddIronOCR 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");

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

코드 마이그레이션 예제

인식 설정 구성

Aspose.OCR은 모든 인식 동작을 RecognitionSettings 객체에 중앙 집중화합니다. 언어, 영역 감지 모드, 단일 행 플래그 및 임계값은 모두 속성으로 존재합니다. 문서 유형이나 호출 패턴마다 새로 구성해야 합니다.

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

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

호출별로 생성해야 하는 설정 객체가 없습니다. 언어는 IronTesseract 인스턴스에 설정됩니다; 지역 대상은 로드 시 OcrInput에 설정됩니다. DetectAreasModeRecognizeSingleLine 결정은 엔진에 의해 자동으로 처리됩니다. 영역 기반 OCR에 대한 자세한 지침은 영역 기반 OCR 사용 설명서를 참조하십시오.

영역 감지 모드 마이그레이션

Aspose.OCR은 매 인식 호출 전에 DetectAreasMode 값을 선택해야 합니다. COMBINE는 다른 레이아웃 영역에서 텍스트를 병합하고, DOCUMENT는 이미지를 표준 문서로 처리하고, TABLE는 그리드 레이아웃에 최적화합니다. 문서 유형에 맞지 않는 모드를 선택하면 출력물이 정렬되지 않거나 누락될 수 있습니다.

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

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 모드 선택 결정을 완전히 제거합니다. 엔진은 레이아웃을 분석하고 Pages, Paragraphs, Lines, Words 계층 구조를 통해 결과를 노출합니다. 읽기 결과 가이드에서는 문서 레이아웃 구문 분석을 위한 전체 구조화된 결과 모델을 탐색하는 방법을 설명합니다. 테이블별 추출 패턴에 대해서는 테이블 읽기 방법 안내를 참조하세요.

신뢰도 기반 필터링을 이용한 배치 인식

Aspose.OCR 배치 워크플로는 목록에 RecognitionResult 객체를 누적합니다. 신뢰도 필터링은 해당 목록을 반복하고 결과를 받아들이기 전에 지역별 평균을 계산해야 합니다. 목록은 명시적으로 관리되어야 하고 여러 페이지를 단일 파일로 출력하려면 SaveMultipageDocument에 전달되어야 합니다.

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

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은 0에서 100까지 변하는 단일 double입니다. Aspose RecognitionAreasConfidence 배열 평균은 버전에 따라 변동하는 범위의 float을 반환합니다 — 마이그레이션 중 비교 임계값이 조정되어야 합니다. 신뢰도 점수는 문서 유효성 검사 워크플로에서 단어별, 줄별, 페이지별 신뢰도 값을 산출하는 데 도움이 됩니다 . 대용량 배치 패턴의 경우 멀티스레딩 예제를 참조하십시오.

구조화된 출력 처리

Aspose.OCR은 형식별 SaveFormat 열거형 값을 사용하여 SaveMultipageDocument를 통해 구조화된 데이터를 출력합니다. JSON 출력은 기계가 읽을 수 있는 파일을 작성하고; XML 출력은 주석이 달린 문서 파일을 작성합니다. 원시 구조화된 데이터 — 단어 위치, 줄 경계 —에 액세스하려면 RecognitionAreasRectangles를 반복해야 하며, 이는 단어 수준이 아닌 지역 수준에서 기하학을 반환합니다.

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

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은 각 페이지에 단어 수준 데이터가 직접 Words 컬렉션으로 노출되고, 각 단어에 개별 Confidence 값이 포함됩니다. Aspose.OCR의 RecognitionAreasRectangles은 단어 수준의 신뢰도 구분 없이 지역 기하학을 제공합니다. hOCR 내보내기는 경계 상자 주석이 포함된 출력을 사용하는 도구와 호환되는 XHTML을 생성합니다. 형식에 대한 자세한 내용은 hOCR 내보내기 가이드를 참조하십시오. 전체 구조화된 결과 모델에 대한 자세한 내용은 OcrResult API 참조에서 모든 속성을 문서화하여 OcrResult.Page, OcrResult.Paragraph, OcrResult.Line, 및 OcrResult.Word에 설명합니다.

Aspose.OCR API와IronOCR매핑 참조

Aspose.OCR IronOCR에 상응하는
AsposeOcr IronTesseract
RecognitionSettings IronTesseract + OcrInput에 대한 속성
DocumentRecognitionSettings OcrInputLoadPdf() / LoadPdfPages()
api.RecognizeImage(path, settings) ocr.Read(path) 또는 ocr.Read(input)
api.RecognizePdf(path, settings) ocr.Read(path) 또는 ocr.Read(input)
result.RecognitionText result.Text
result.RecognitionAreasConfidence.Average() result.Confidence (단일 백분율, 0–100)
result.RecognitionAreasRectangles result.Words (X, Y, 너비, 높이, 신뢰도 포함)
RecognitionResult OcrResult
Language.Eng OcrLanguage.English
DetectAreasMode.COMBINE 자동 — 열거형 필요 없음
DetectAreasMode.TABLE 자동 — 레이아웃에 result.Pages[n].Paragraphs 사용
DetectAreasMode.DOCUMENT 자동 - 엔진이 레이아웃 분석을 처리합니다
settings.RecognizeSingleLine = true ocr.Configuration.WhiteListCharacters 또는 단일 지역 자르기
settings.RecognitionAreas = new List<Rectangle> { r } input.LoadImage(path, cropRectangle)
settings.AutoSkew = true 자동 또는 명시적 input.Deskew()
PreprocessingFilter.AutoSkew() input.Deskew()
PreprocessingFilter.AutoDenoising() input.DeNoise()
PreprocessingFilter.ContrastCorrectionFilter() input.Contrast()
PreprocessingFilter.Binarize() input.Binarize()
PreprocessingFilter.Threshold(value) input.Binarize() (자동 임계값)
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) hOCR 내보내기를 통해: result.SaveAsHocrFile(path)
api.SaveMultipageDocument(path, SaveFormat.Json, list) result.Pages를 탐색하고 직접 직렬화
api.PreprocessImage(path, filters) input.GetPages()[0].SaveAsImage(path)
api.CalculateSkew(imagePath) input.Deskew() (감지된 각도를 자동으로 적용)
new Aspose.OCR.License().SetLicense("file.lic") IronOcr.License.LicenseKey = "key"
settings.ThreadsCount = n 기본적으로 스레드 안전합니다. Parallel.ForEach 사용

일반적인 마이그레이션 문제와 해결책

문제 1: DetectAreasMode에는 직접적인 대응 함수가 없습니다.

Aspose.OCR: 코드가 특정 레이아웃 동작을 기대하며 settings.DetectAreasMode = DetectAreasMode.TABLE 또는 DetectAreasMode.COMBINE를 설정합니다. 열거형을 제거하면IronOCR동일한 레이아웃을 어떻게 처리하는지에 대한 의문이 남습니다.

해결책: 열거형을 완전히 제거합니다.IronOCR레이아웃 분석을 자동으로 수행합니다. 감지된 레이아웃 구조를 검사해야 하는 경우, result.Pages[n].Paragraphs를 탐색하세요 — 각 단락은 X, Y, 너비, 높이 경계상자와 포함된 텍스트를 갖습니다. 명시적인 테이블 추출에 대해서는 테이블 읽기 방법을 참조하십시오.

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

문제 2: 인식 영역 신뢰도 임계값 불일치

Aspose.OCR: 기존 코드가 result.RecognitionAreasConfidence.Average()0.75f과 같은 임계값과 비교합니다. IronOCR의 result.Confidence는 다른 척도에 있습니다.

해결책: result.Confidence는 0–100의 백분율입니다. Aspose 임계값을 100배하여 변환: 0.75f75.0로 변환됩니다. 그런 다음 모든 비교 로직을 업데이트합니다.

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

문제 3: SaveMultipageDocument의 JSON/XML 출력에는 직접적인 메서드가 없습니다.

Aspose.OCR: api.SaveMultipageDocument("out.json", SaveFormat.Json, results)는 인식 메타데이터와 함께 JSON 파일을 작성합니다. 이 출력물을 하위 시스템에서 사용하는 팀은 그에 상응하는 출력물을 찾아야 합니다.

해결책: IronOCR에는 SaveFormat.Json에 상응하는 메서드가 없습니다. 대체 방법은 result.Pages를 탐색하고 System.Text.Json로 직렬화하는 것입니다. 이렇게 하면 스키마를 완벽하게 제어할 수 있습니다.

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

다운스트림 도구가 구문 분석할 수 있는 내장 좌표를 사용하는 XHTML 출력에 대하여, result.SaveAsHocrFile("output.hocr")가 더 가까운 의미적 대응입니다.

문제 4: DocumentRecognitionSettings.StartPage에서 0부터 시작하는 인덱스를 사용함

Aspose.OCR: DocumentRecognitionSettings.StartPage = 2는 세 번째 페이지(0 기반)를 의미합니다. 이는 Aspose에서 IronOCR로 마이그레이션할 때 가장 흔히 발생하는 1의 오차입니다.

해결책:IronOCR전체적으로 1부터 시작하는 페이지 색인 방식을 사용합니다. 모든 StartPage 값에 1을 더하고 마지막 페이지를 다시 계산합니다. 프로덕션 환경 출시 전에 이 문제를 발견하기 위해 알려진 다중 페이지 PDF를 대상으로 하는 특정 테스트를 작성하세요.

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

문제 5: RecognizeSingleLine에 직접 플래그가 없습니다.

Aspose.OCR: settings.RecognizeSingleLine = true는 엔진에 전체 이미지를 단일 텍스트 선으로 처리하도록 지시합니다. 이것은 레이블 인식, 필드 추출 및 기타 고정 형식 입력에 사용됩니다.

해결책: 텍스트 선을 정확히 분리하기 위해 CropRectangle를 사용하여 엔진이 단일 선 이미지에서 전체 레이아웃 감지를 실행하지 않도록 합니다. 기계 판독 가능 영역 또는 라벨 형식의 경우, 특정 문서 읽기 가이드에서 적절한 접근 방식을 다룹니다.

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

문제 6: Aspose.OCR 인스턴스의 스레드별 필요 없음

Aspose.OCR: 문서는 병렬 처리에서 스레드 안전 문제를 피하기 위해 스레드당 새로운 AsposeOcr() 인스턴스를 생성하는 것을 권장합니다. 기존 코드는 Parallel.ForEach 람다 내부에 인스턴스를 생성합니다.

해결책: IronTesseract는 스레드 안전합니다. 단일 인스턴스가 병렬 워크로드를 처리합니다. 스레드별 인스턴스 생성을 제거하고 하나의 인스턴스를 공유합니다.

// 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 마이그레이션 체크리스트

이동 전 작업

코드베이스 내의 모든 Aspose.OCR 참조를 검토하십시오.

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

각 발생 사례를 인식 호출, 설정 객체, 전처리 파이프라인, 출력 호출 및 라이선스 초기화와 같은 범주별로 문서화하십시오. 사용 중인 모든 DetectAreasMode 값을 주의하세요 — 이는 어떤 레이아웃 마이그레이션 경로가 적용되는지를 결정합니다. 모든 SaveFormat 열거형 값을 기록하세요 — 각 비-PDF 형식은 위의 이슈 3의 맞춤 직렬화 방법이 필요합니다.

코드 마이그레이션

  1. 솔루션의 모든 프로젝트에서 Aspose.OCR NuGet 패키지를 제거합니다
  2. 모든 프로젝트에 IronOcr NuGet 패키지를 설치합니다
  3. using Aspose.OCR;using Aspose.OCR.Models;using IronOcr;로 교체합니다
  4. 앱 시작 시 new Aspose.OCR.License().SetLicense("file.lic")IronOcr.License.LicenseKey = "key"로 교체합니다
  5. new AsposeOcr()new IronTesseract()로 교체합니다
  6. 모든 RecognitionSettingsDocumentRecognitionSettings 생성 블록을 제거합니다
  7. 모든 DetectAreasMode 열거형 참조를 제거합니다 — 동등한 것이 필요하지 않습니다
  8. api.RecognizeImage(path, settings)ocr.Read(path)로 교체합니다
  9. api.RecognizePdf(path, settings)ocr.Read(path) 또는 ocr.Read(input)로 교체하고 input.LoadPdf()를 사용합니다
  10. result.RecognitionTextresult.Text로 교체합니다
  11. result.RecognitionAreasConfidence.Average()result.Confidence로 교체하고 이전 임계값을 100배
  12. api.SaveMultipageDocument(path, SaveFormat.Pdf, list)result.SaveAsSearchablePdf(path)로 교체합니다
  13. api.SaveMultipageDocument(path, SaveFormat.Json, list)result.Pages의 직접 직렬화로 교체합니다
  14. 모든 PreprocessingFilter 체인을 OcrInput 메서드 호출로 변환합니다(참조 API 매핑표)
  15. DocumentRecognitionSettings.StartPage을 0 기반에서 1 기반으로 업데이트합니다(모든 값에 1을 더합니다)
  16. 스레드당 AsposeOcr 인스턴스화를 제거합니다 — 하나의 IronTesseract 인스턴스를 공유합니다

마이그레이션 후 테스트

  • 실제 사용 중인 각 문서 유형의 대표 샘플에 대해 OCR을 실행하고 문자 수를 기준 Aspose.OCR 출력과 비교합니다.
  • 신뢰도 값 검증:IronOCR 0~100 사이의 값을 반환합니다. 모든 임계값 비교는 새로운 척도를 사용해야 합니다
  • 1부터 시작하는 페이지 번호를 사용하여 10페이지 이상의 PDF 파일에서 페이지 범위 선택 테스트를 수행하고, 올바른 페이지가 반환되는지 확인합니다.
  • Aspose.PDF가 설치되지 않은 상태에서 암호로 보호된 PDF 파일 가져오기를 테스트하고 종속성 예외가 발생하지 않는지 확인합니다.
  • 사용 중인 각 DetectAreasMode(COMBINE, TABLE, DOCUMENT)에 대해 예상 출력과 맞는지 확인합니다
  • JSON 출력 경로를 테스트합니다: result.Pages을 직렬화하고 다운스트림 소비자와 스키마를 검증합니다
  • 병렬 배치 프로세서를 실행하고 스레딩 예외가 없는지 확인합니다(공유 IronTesseract 인스턴스)
  • 검색 가능한 PDF 출력물이 PDF 뷰어에서 열리고 텍스트를 올바른 위치에서 선택할 수 있는지 확인합니다.
  • 각 배포 환경(ASP.NET 시작, Azure Function, Docker 컨테이너)에서 라이선스 키가 오류 없이 초기화되는지 확인합니다.
  • 사전 처리된 TIFF 입력이 여전히 input.LoadImageFrames()를 통해 예상 출력을 생성하는지 확인합니다

IronOCR로 마이그레이션할 때의 주요 이점

첫날부터 예측 가능한 총 소유 비용. 2,999달러의 Professional 용 라이선스는 10명의 개발자가 10개의 프로젝트에서 사용할 수 있으며 연간 갱신이 필요 없습니다. 재무 부서는 OCR 항목을 한 번 마감합니다. 엔지니어 추가, 신규 프로젝트 착수 또는 제품 수명 주기 연장으로 인한 예산 영향은 전혀 없습니다. 라이선스 등급 계산도 필요 없고, 갱신일을 추적할 필요도 없으며, 미납으로 인한 규정 준수 위험도 없습니다. IronOCR 라이선스 페이지에는 각 등급별 보장 내용이 자세히 설명되어 있습니다.

인프라가 아닌 의도를 표현하는 인식 호출. 마이그레이션 후 모든 인식 호출은 ocr.Read("document")입니다. 모든 Aspose.OCR 호출을 앞섰던 RecognitionSettings 구조, DetectAreasMode 선택, 및 PreprocessingFilter 채우기가 완전히 사라집니다. 코드베이스의 OCR 레이어를 읽는 신입 엔지니어는 실제 작업이 시작되기 전에 구성 객체가 조립되는 것이 아니라 "이 문서를 읽으세요"와 같은 비즈니스 의도를 보게 됩니다. IronTesseract API 참조 문서 에는 사용 가능한 모든 구성 속성이 설명되어 있습니다.

별도의 제품 없이 암호화된 PDF를 지원합니다. Enterprise 문서 파이프라인은 일반적으로 암호로 보호된 PDF를 처리합니다. 마이그레이션 후 input.LoadPdf("doc.pdf", Password: "secret")이 그것들을 네이티브로 처리합니다. Aspose.PDF 구독을 관리할 필요도 없고, 암호 해독 후 이미지 생성 파이프라인을 유지 관리할 필요도 없으며, 두 번째 갱신일을 추적할 필요도 없습니다. 처리 과정의 모든 PDF 형식은 하나의 패키지, 하나의 라이선스, 하나의 코드 경로를 거칩니다. PDF 입력 방법 안내에는 페이지 범위, 비연속 선택 및 스트림 입력이 포함됩니다.

단어 및 문자 수준에서의 구조화된 결과 데이터. result.Pages[n].Words은 각 단어가 자신의 경계상자, 텍스트 및 개별 신뢰도 점수를 가지고 있는 컬렉션을 반환합니다. Aspose.OCR의 영역 수준 지오메트리는 개별 토큰이 아닌 영역을 다룹니다. 마이그레이션 후 문서 레이아웃 파서, 양식 필드 추출기 및 송장 처리 파이프라인은 추가 처리 단계 없이 단어별 위치 지정 정보에 액세스할 수 있습니다. 전체 결과 계층 구조는 OCR 결과 기능 페이지를 참조하세요.

모든 플랫폼에 단일 패키지로 배포 가능합니다.IronOCR Windows, Linux, macOS, Docker, Azure App Service 및 AWS Lambda에서 플랫폼별 구성 없이 실행되는 단일 NuGet 패키지로 제공됩니다. Aspose.OCR은 다양한 플랫폼에서 작동하지만 컨테이너 환경에서는 네이티브 라이브러리 조정이 필요할 수 있습니다. 마이그레이션 후 OCR 서비스용 Dockerfile은 Install-Package 외에 OCR 관련 설정 단계가 없는 표준 .NET 기본 이미지입니다. 배포 가이드는 Docker , Azure , AWSLinux를 다룹니다.

OCR과 같은 패스에서 바코드 읽기. ocr.Configuration.ReadBarCodes = true 설정은 바코드, QR 코드, 및 Code 128 심볼을 동일한 이미지에서 하나의 엔진 패스로 추출합니다. Aspose.OCR에는 바코드 처리 기능이 없으므로 별도의 바코드 라이브러리가 필요합니다. 마이그레이션 후, 인쇄된 텍스트와 바코드가 혼합된 문서(배송 라벨, 재고 양식, 행사 티켓)는 result.Barcodes에서 결과와 함께 단일 호출로 처리됩니다. 지원되는 심볼 종류는 바코드 OCR 사용법을 참조하세요.

참고해 주세요Aspose 및 Tesseract는 해당 소유자의 등록 상표입니다. 이 사이트는 Aspose Pty Ltd 또는 Google과 제휴, 승인, 후원되지 않았습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

자주 묻는 질문

.NET용 Aspose.OCR에서 IronOCR로 마이그레이션해야 하는 이유는 무엇인가요?

일반적인 동인으로는 COM 상호 운용의 복잡성 제거, 파일 기반 라이선스 관리 대체, 페이지당 과금 방지, Docker/컨테이너 배포 활성화, 표준 .NET 툴링과 통합되는 NuGet 네이티브 워크플로 채택 등이 있습니다.

.NET용 Aspose.OCR에서 IronOCR로 마이그레이션할 때 주요 코드 변경 사항은 무엇인가요?

Aspose.OCR 초기화 시퀀스를 IronTesseract 인스턴스화로 대체하고, COM 수명 주기 관리(명시적 생성/로드/폐쇄 패턴)를 제거하며, 결과 속성 이름을 업데이트합니다. 그 결과 상용구 줄이 현저히 줄어듭니다.

마이그레이션을 시작하려면 IronOCR을 어떻게 설치하나요?

패키지 관리자 콘솔에서 '설치-패키지 IronOcr'을 실행하거나 CLI에서 '닷넷 추가 패키지 IronOcr'을 실행하세요. 언어 팩은 별도의 패키지입니다: 예를 들어 프랑스어의 경우 '닷넷 추가 패키지 IronOcr.Languages.French'를 실행합니다.

IronOCR은 표준 비즈니스 문서 for .NET용 Aspose.OCR의 OCR 정확도와 일치하나요?

IronOCR은 송장, 계약서, 영수증, 타이핑된 양식 등 표준 비즈니스 콘텐츠에 대해 높은 정확도를 달성합니다. 이미지 전처리 필터(데스큐, 노이즈 제거, 대비 향상)는 품질이 저하된 입력에 대한 인식률을 더욱 향상시킵니다.

IronOCR은 .NET용 Aspose.OCR이 별도로 설치하는 언어 데이터를 어떻게 처리하나요?

IronOCR의 언어 데이터는 NuGet 패키지로 배포됩니다. '닷넷 추가 패키지 IronOcr.Languages.German'은 독일어 지원을 설치합니다. 수동 파일 배치나 디렉터리 경로는 필요하지 않습니다.

.NET용 Aspose.OCR에서 IronOCR로 마이그레이션하려면 배포 인프라를 변경해야 하나요?

IronOCR은 .NET용 Aspose.OCR보다 인프라 변경이 더 적게 필요합니다. SDK 바이너리 경로, 라이선스 파일 배치 또는 라이선스 서버 구성이 필요하지 않습니다. NuGet 패키지에는 완전한 OCR 엔진이 포함되어 있으며 라이선스 키는 애플리케이션 코드에 설정된 문자열입니다.

마이그레이션 후 IronOCR 라이선싱은 어떻게 구성하나요?

애플리케이션 시작 코드에 IronOcr.License.LicenseKey = "YOUR-KEY"를 할당하세요. Docker 또는 Kubernetes에서 키를 환경 변수로 저장하고 시작 시 키를 읽습니다. 트래픽을 수락하기 전에 License.IsValidLicense를 사용하여 유효성을 검사하세요.

IronOCR은 Aspose.OCR과 동일한 방식으로 PDF를 처리할 수 있나요?

예. IronOCR은 원본 및 스캔한 PDF를 모두 읽습니다. IronTesseract를 인스턴스화하고, 입력이 PDF 경로 또는 OcrPdfInput인 경우 ocr.Read(input)를 호출하고, OcrResult 페이지를 반복하면 됩니다. 별도의 PDF 렌더링 파이프라인이 필요하지 않습니다.

IronOCR은 대량 처리에서 스레딩을 어떻게 처리하나요?

IronTesseract는 스레드별로 인스턴스화해도 안전합니다. Parallel.ForEach 또는 Task 풀에서 스레드당 하나의 인스턴스를 스핀업하고, OCR을 동시에 실행하고, 완료되면 각 인스턴스를 폐기하면 됩니다. 전역 상태나 잠금이 필요하지 않습니다.

IronOCR은 텍스트 추출 후 어떤 출력 형식을 지원하나요?

IronOCR은 텍스트, 단어 좌표, 신뢰도 점수, 페이지 구조를 포함한 구조화된 결과를 반환합니다. 내보내기 옵션에는 일반 텍스트, 검색 가능한 PDF, 다운스트림 처리를 위한 구조화된 결과 개체가 포함됩니다.

작업 부하를 확장할 때 IronOCR 가격이 Aspose.OCR for .NET보다 더 예측 가능한가요?

IronOCR은 페이지당 또는 볼륨당 요금이 없는 정액제 영구 라이선스를 사용합니다. 10,000페이지를 처리하든 1,000만 페이지를 처리하든 라이선스 비용은 일정하게 유지됩니다. 볼륨 및 팀 라이선스 옵션은 IronOCR 가격 페이지에서 확인할 수 있습니다.

.NET용 Aspose.OCR에서 IronOCR로 마이그레이션한 후 기존 테스트는 어떻게 되나요?

추출된 텍스트 콘텐츠에 대해 어설트하는 테스트는 마이그레이션 후에도 계속 통과해야 합니다. API 호출 패턴 또는 COM 개체 수명 주기의 유효성을 검사하는 테스트는 IronOCR의 더 간단한 초기화 및 결과 모델을 반영하도록 업데이트해야 합니다.

칸나오팟 우돈판트
소프트웨어 엔지니어
카나팟은 소프트웨어 엔지니어가 되기 전 일본 홋카이도 대학교에서 환경 자원학 박사 학위를 취득했습니다. 학위 과정 중에는 생물생산공학과 소속 차량 로봇 연구실에서 활동하기도 했습니다. 2022년에는 C# 기술을 활용하여 Iron Software의 엔지니어링 팀에 합류했고, 현재 IronPDF 개발에 집중하고 있습니다. 카나팟은 IronPDF에 사용되는 대부분의 코드를 직접 작성하는 개발자로부터 배울 수 있다는 점에 만족하며, 동료들과의 소통을 통해 배우는 것 외에도 Iron Software에서 일하는 즐거움을 누리고 있습니다. 코딩이나 문서 작업을 하지 않을 때는 주로 PS5로 게임을 하거나 The Last of Us를 다시 시청하는 것을 즐깁니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해