IRONSOFTWAREHOME
동영상

RapidOCR.NET에서 IronOCR로 마이그레이션하기

칸나오팟 우돈판트
Kannapat Udonpant
Updated: 2026년 8월 1일

이 가이드는 RapidOCR.NET (RapidOcrNet)에서 IronOCR로의 모든 마이그레이션 경로를 다룹니다. 이는 .NET 개발자들이 OCR 파이프라인에서 ONNX 모델 파일 관리를 제거해야 할 때 사용됩니다. 이 가이드는 패키지 교체, 코드 변환, 외부 모델 종속성이 완전히 제거되었을 때 뒤따르는 운영상의 변화를 설명합니다.

RapidOCR.NET에서 마이그레이션해야 하는 이유

RapidOCR.NET은 모델 배포 문제가 이미 해결된 통제된 환경에서, 제한된 사용 사례에 한해 작동합니다. 이러한 조건 중 하나라도 변경되면, 라이브러리의 아키텍처적 제약 조건은 엔지니어링 비용으로 전환됩니다.

ONNX 모델 파일은 배포 산출물이지 패키지가 아닙니다. RapidOCR.NET은 단일 문자를 인식하기 전에 네 개의 외부 파일 det.onnx, cls.onnx, rec.onnx, 그리고 문자 사전이 필요합니다. 이 파일들은 NuGet 패키지에 포함되어 있지 않습니다. 이 도구들은 GitHub 릴리스 페이지에 호스팅되며, 수동 다운로드가 필요하고, 코드 내에서 경로를 명시적으로 설정해야 하며, 빌드 시 복사를 위해 사용자 정의 MSBuild 규칙이 필요합니다. 모든 신입 개발자, 모든 CI 파이프라인, 모든 배포 환경이 그 절차를 반복합니다.

언어 전환은 구성이 아닌 파일 교체입니다. RapidOCR.NET에서 영어 OCR을 중국어 OCR로 변경하려면 다른 인식 모델과 다른 문자 사전을 다운로드한 후 엔진 인스턴스를 재구축해야 합니다. 스페인어, 프랑스어, 독일어, 러시아어, 아랍어 및 기타 100개 이상의 언어는 RapidOCR 모델 카탈로그에 사용할 수 있는 모델이 전혀 없습니다. 다양한 언어로 된 문서를 처리해야 하는 애플리케이션의 경우, RapidOCR.NET 내에서는 지원되지 않는 언어에 대해 실행 가능한 방법이 없습니다.

모델 버전 업데이트에는 수동 개입이 필요합니다. 상위 프로젝트인 RapidOCR에서 개선된 모델 가중치를 릴리스하면, 팀은 새 파일을 다운로드하고 모든 환경에서 기존 파일을 교체한 후 경로를 검증하고 다시 배포해야 합니다. 이를 자동으로 처리하는 패키지 복원 단계는 없습니다. 개발, 스테이징, 프로덕션 환경이 혼합된 환경에서는 이러한 변경 사항의 반영이 매번 수동으로 이루어집니다.

ONNX 런타임 종속성은 플랫폼 복잡성을 추가합니다. RapidOCR.NET은 플랫폼 별로 특화된 바이너리가 포함된 Microsoft.ML.OnnxRuntime 패키지에 의존합니다. CPU 및 GPU 버전은 서로 다른 패키지가 필요합니다. linux/amd64 용으로 빌드된 컨테이너 이미지는 linux/arm64 용으로 빌드된 것과는 다른 바이너리가 필요합니다. 각 배포 대상에 대해 올바른 런타임 변형이 존재하며 설치된 모델 파일과 호환되는지 확인해야 합니다.

콜드 스타트 지연 시간과 메모리 사용량은 고정 비용입니다. 시작 시 세 개의 ONNX 모델을 로드하는 데 25초가 소요되며, 프로세스가 진행되는 동안 메모리에 300500MB를 차지합니다. 이 비용은 OCR 처리량과 무관하게 부과되므로, 이 라이브러리는 시작 비용이 처리량에 비해 지나치게 높은 서버리스 함수, 경량 컨테이너 또는 트래픽이 적은 서비스에는 적합하지 않습니다.

상업적 지원 경로는 없습니다. RapidOCR.NET은 Apache 2.0 라이선스 하에 단일 커뮤니티 개발자가 유지 관리하고 있습니다. 운영 환경의 문제(ONNX 런타임 버전 충돌, 비정상적인 이미지 형식에 대한 추론 실패, 지속적인 부하 시 메모리 증가 등)는 GitHub 이슈 큐로 접수되며, 응답 시한이나 SLA는 보장되지 않습니다.

근본적인 문제

세 개의 ONNX 모델 파일과 문자 사전(모두 별도로 다운로드)이 있으며, 모두 경로로 구성됩니다: Plus:

// RapidOcrNet: 4 external files required before any OCR can execute
var engine = new RapidOcrEngine(new RapidOcrOptions
{
    DetModelPath = "./models/det.onnx",     // ~3 MB — downloaded from GitHub
    ClsModelPath = "./models/cls.onnx",     // ~1 MB — downloaded from GitHub
    RecModelPath = "./models/rec_en.onnx",  // ~2-10 MB — language-specific download
    KeysPath     = "./models/en_keys.txt"   // character dictionary — language-specific
});
C#

IronOCR은 모델 파일, 경로 구성, 다운로드 단계가 필요하지 않습니다:

// IronOCR: install the NuGet package, write one line
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
C#

##IronOCR대 RapidOCR.NET: 기능 비교

IronOCR과 RapidOCR.NET은 기본적인 이미지 OCR 기능에서 중복되는 부분이 있습니다. 주변의 모든 우려 사항에 대해 격차가 벌어집니다.

기능RapidOCR.NETIronOCR
NuGet 설치네 (RapidOcrNet)네 (IronOcr)
필요한 외부 모델 파일예 (파일 4개, 수동 다운로드)아니요
경로 구성 필요아니요
MSBuild 복사 규칙이 필요합니다.아니요
NuGet 설치 후 바로 작동합니다.아니요
ONNX 런타임 종속성예 (~30–50 MB)아니요
지원되는 언어~5 (CJK + 영어만 해당)NuGet 언어 팩을 통해 125개 이상 추가 가능
언어 전환파일 교체 + 엔진 재구축속성 할당
유럽 언어 지원아니요예 (30세 이상)
아랍어 / 히브리어 지원아니요
키릴 문자(러시아어, 우크라이나어) 지원아니요
네이티브 PDF 입력아니요
비밀번호로 보호된 PDF 입력아니요
검색 가능한 PDF 출력아니요
여러 페이지로 구성된 TIFF 입력아니요
스트림 및 바이트 배열 입력제한적
내장 이미지 전처리 기능아니요예 (자동 필터 + 수동 필터)
기울기 보정 / 노이즈 제거 / 대비 필터아니요
구조화된 출력(단락, 줄, 단어)부분적 (블록만 해당)네, 좌표와 함께
단어별 신뢰도 점수예 (블록당)
OCR 중 바코드 판독아니요
hOCR 내보내기아니요
스레드 안전 병렬 처리제한적예 (스레드당 한 번)
크로스 플랫폼 배포플랫폼별 ONNX 런타임 바이너리가 필요합니다예 (Windows, Linux, macOS, Docker)
Docker 배포수동 모델 COPY 지침 필요기본 제공
콜드 스타트 오버헤드2–5초 (모델 로딩)최소한의
상업적 지원아니요
라이선스Apache 2.0 (무료)영구 ($999 Lite, $1,499 Pro, $2,999 Enterprise)

빠른 시작: RapidOCR.NET에서 IronOCR로의 마이그레이션

1단계: NuGet 패키지 교체

RapidOCR.NET 및 ONNX Runtime 종속성을 제거하십시오:

dotnet remove package RapidOcrNet
dotnet remove package Microsoft.ML.OnnxRuntime
SHELL

NuGet 에서IronOCR설치하세요.

dotnet add package IronOcr

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

RapidOCR.NET 네임스페이스를IronOCR네임스페이스로 대체하십시오:

// Before (RapidOCR.NET)
using RapidOcrNet;

// After (IronOCR)
using IronOcr;
C#

단계 3: 라이선스 초기화

아무 IronTesseract 호출 전에 응용 프로그램 시작 시 라이선스 초기화를 추가합니다:

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";

IronOCR 라이선스 페이지 에서 무료 평가판 키를 다운로드할 수 있습니다.

코드 마이그레이션 예제

ONNX 모델 경로 구성 제거

이 마이그레이션에서 가장 기계적인 변화는 RapidOcrOptions 구성 블록을 삭제하고 이를 인자 없는 생성자로 대체하는 것입니다.

RapidOCR.NET의 접근 방식:

using RapidOcrNet;

// Startup validation — written because a missing model crashes at runtime, not at install
private static void EnsureModelsPresent(string modelDir)
{
    var required = new[]
    {
        Path.Combine(modelDir, "det.onnx"),
        Path.Combine(modelDir, "cls.onnx"),
        Path.Combine(modelDir, "rec_en.onnx"),
        Path.Combine(modelDir, "en_keys.txt")
    };

    var missing = required.Where(f => !File.Exists(f)).ToList();
    if (missing.Any())
        throw new FileNotFoundException(
            $"Missing model files: {string.Join(", ", missing)}\n" +
            "Download from: https://github.com/RapidAI/RapidOCR/releases");
}

// Engine factory — called once at startup, held for lifetime of service
public RapidOcrEngine CreateEngine(string modelDir)
{
    EnsureModelsPresent(modelDir);
    return new RapidOcrEngine(new RapidOcrOptions
    {
        DetModelPath = Path.Combine(modelDir, "det.onnx"),
        ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
        RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
        KeysPath     = Path.Combine(modelDir, "en_keys.txt"),
        UseGpu       = false,
        NumThreads   = Environment.ProcessorCount
    });
}
C#

IronOCR 접근 방식:

using IronOcr;

// 아니요 model validation, no path configuration, no GPU flags
// IronTesseract is thread-safe; create one per thread or on demand
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
C#

전체 EnsureModelsPresent 유효성 검사 메소드, RapidOcrOptions 구성 객체, 그리고 엔진 팩토리 클래스는 삭제할 수 있습니다. IronOCR은 NuGet 패키지의 일부로 엔진을 내부적으로 제공하므로 검증할 모델 파일은 없습니다. IronTesseract 설치 가이드에는 초기화 옵션과 라이선스 키 위치에 대한 자세한 내용이 포함되어 있습니다.

탐지, 분류 및 인식 파이프라인 통합

RapidOCR.NET은 탐지, 방향 분류, 인식의 3단계 ONNX 파이프라인을 실행하며, 호출자가 정렬하고 조합해야 하는 순서가 정해지지 않은 평면 텍스트 블록 목록을 반환합니다. IronOCR는 내부 Tesseract 5 엔진에 의해 지원되는 단일 .Read() 호출을 노출하여 이미 적용된 읽기 순서로 구조화된 출력을 반환합니다.

RapidOCR.NET의 접근 방식:

using RapidOcrNet;

public class InvoiceTextExtractor
{
    private readonly RapidOcrEngine _engine;

    public InvoiceTextExtractor(string modelDir)
    {
        // Three separate ONNX models run in sequence on every call
        _engine = new RapidOcrEngine(new RapidOcrOptions
        {
            DetModelPath = Path.Combine(modelDir, "det.onnx"),   // Stage 1: detect text regions
            ClsModelPath = Path.Combine(modelDir, "cls.onnx"),   // Stage 2: classify direction
            RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),// Stage 3: recognize characters
            KeysPath     = Path.Combine(modelDir, "en_keys.txt")
        });
    }

    public string ExtractInvoiceText(string imagePath)
    {
        var result = _engine.Run(imagePath);

        // Blocks are unordered — must sort by vertical position, then horizontal
        var orderedBlocks = result.TextBlocks
            .OrderBy(b => b.BoundingBox.Top)
            .ThenBy(b => b.BoundingBox.Left)
            .ToList();

        // Manual assembly — no paragraph or line structure
        return string.Join(Environment.NewLine,
            orderedBlocks.Select(b => b.Text));
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class InvoiceTextExtractor
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractInvoiceText(string imagePath)
    {
        // Single call — detection, recognition, reading order all internal
        var result = _ocr.Read(imagePath);
        return result.Text; // Already in reading order
    }

    public IEnumerable<string> ExtractInvoiceParagraphs(string imagePath)
    {
        var result = _ocr.Read(imagePath);
        // Structured paragraphs with coordinates — no sorting or assembly needed
        foreach (var page in result.Pages)
            foreach (var paragraph in page.Paragraphs)
                yield return paragraph.Text;
    }
}
C#

3단계 파이프라인은 전적으로IronOCR내부에서 처리됩니다. 수동 OrderBy 체인을 가진 result.TextBlocks 목록이 result.Text로 압축됩니다. TextBlocks에서 경계 상자 데이터를 필요로 했던 호출자에게, result.Pages[i].Paragraphs, .Lines, 및 .Words 컬렉션이 구조화된 API를 통해 동등한 좌표를 제공합니다. '읽기 결과 사용법' 및 'OCR 결과' 기능 페이지에는 전체 구조화된 출력 모델이 상세히 설명되어 있습니다.

사용자 정의 모델 로딩 대체

런타임 시 OCR 구성을 전환해야 하는 응용 프로그램 — 예를 들어 문서 유형에 따라 다른 인식 매개 변수를 통해 문서를 라우팅하는 경우 — 는 RapidOCR.NET에서 전체 RapidOcrEngine을 다시 구축해야 합니다. 구성은 생성자에 결합되어 있기 때문입니다. IronOCR은 엔진 구성을 속성으로 노출하며, 이는 단일 인스턴스에서 읽기 작업별로 조정할 수 있습니다.

RapidOCR.NET의 접근 방식:

using RapidOcrNet;

public class DocumentRouter
{
    private readonly string _modelDir;

    public DocumentRouter(string modelDir) => _modelDir = modelDir;

    // Must create separate engine instances per configuration
    // Each engine holds ~300-500 MB of loaded model weights
    private RapidOcrEngine BuildEnglishEngine() =>
        new RapidOcrEngine(new RapidOcrOptions
        {
            DetModelPath = Path.Combine(_modelDir, "det.onnx"),
            ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
            RecModelPath = Path.Combine(_modelDir, "en_rec.onnx"),
            KeysPath     = Path.Combine(_modelDir, "en_keys.txt")
        });

    private RapidOcrEngine BuildChineseEngine() =>
        new RapidOcrEngine(new RapidOcrOptions
        {
            DetModelPath = Path.Combine(_modelDir, "det.onnx"),
            ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
            RecModelPath = Path.Combine(_modelDir, "ch_rec.onnx"),  // separate download
            KeysPath     = Path.Combine(_modelDir, "ch_keys.txt")   // separate download
        });

    public string ProcessDocument(string imagePath, string language)
    {
        // Rebuild engine for each language — model reload cost on every switch
        using var engine = language == "chinese"
            ? BuildChineseEngine()
            : BuildEnglishEngine();

        var result = engine.Run(imagePath);
        return string.Join("\n", result.TextBlocks
            .OrderBy(b => b.BoundingBox.Top)
            .Select(b => b.Text));
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class DocumentRouter
{
    // One instance handles all languages — language is a property, not a constructor param
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ProcessDocument(string imagePath, string language)
    {
        // Language switch requires no model reload, no rebuild
        _ocr.Language = language switch
        {
            "chinese"  => OcrLanguage.ChineseSimplified,
            "japanese" => OcrLanguage.Japanese,
            "arabic"   => OcrLanguage.Arabic,
            "russian"  => OcrLanguage.Russian,
            _          => OcrLanguage.English
        };

        return _ocr.Read(imagePath).Text;
    }
}
C#

엔진 재빌드, 모델 재로드, 언어별 별도 다운로드가 필요 없습니다. 비영어 대상에 대한 언어 팩은 NuGet — dotnet add package IronOcr.Languages.ChineseSimplified — 를 통해 설치되며, 복원 단계는 자동으로 배포를 처리합니다. 다국어 사용 안내서는 언어 팩 설치 방법을 다루며, 언어 색인에는 사용 가능한 125개 이상의 모든 팩이 나열되어 있습니다.

배치 처리 마이그레이션

RapidOCR.NET은 단일 RapidOcrEngine 인스턴스에 대한 스레드 안전 보장을 제공하지 않습니다. 일괄 처리를 위해서는 단일 스레드 큐 또는 스레드별 엔진 인스턴스화가 필요하며, 각각 300~500MB의 모델 메모리 공간을 차지합니다. IronOCR는 명시적으로 스레드 안전성을 갖추고 있습니다: 각 스레드마다 하나의 IronTesseract를 생성하여 잠금 없이 동시에 실행하세요.

RapidOCR.NET의 접근 방식:

using RapidOcrNet;

public class BatchOcrProcessor
{
    private readonly string _modelDir;

    public BatchOcrProcessor(string modelDir) => _modelDir = modelDir;

    // Thread-pool processing — each thread needs its own engine copy
    // 4 threads × 300-500 MB model footprint = 1.2-2 GB RAM minimum
    public Dictionary<string, string> ProcessBatch(IReadOnlyList<string> imagePaths)
    {
        var results = new System.Collections.Concurrent.ConcurrentDictionary<string, string>();

        Parallel.ForEach(imagePaths, new ParallelOptions { MaxDegreeOfParallelism = 4 },
            imagePath =>
            {
                // Each thread must create its own engine — not safe to share
                using var engine = new RapidOcrEngine(new RapidOcrOptions
                {
                    DetModelPath = Path.Combine(_modelDir, "det.onnx"),
                    ClsModelPath = Path.Combine(_modelDir, "cls.onnx"),
                    RecModelPath = Path.Combine(_modelDir, "rec_en.onnx"),
                    KeysPath     = Path.Combine(_modelDir, "en_keys.txt")
                });

                var result = engine.Run(imagePath);
                results[imagePath] = string.Join("\n",
                    result.TextBlocks
                          .OrderBy(b => b.BoundingBox.Top)
                          .Select(b => b.Text));
            });

        return new Dictionary<string, string>(results);
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class BatchOcrProcessor
{
    // Thread-safe: create IronTesseract per thread, no shared state required
    public Dictionary<string, string> ProcessBatch(IReadOnlyList<string> imagePaths)
    {
        var results = new System.Collections.Concurrent.ConcurrentDictionary<string, string>();

        Parallel.ForEach(imagePaths, imagePath =>
        {
            // Lightweight construction — no model loading overhead per thread
            var ocr = new IronTesseract();
            var result = ocr.Read(imagePath);
            results[imagePath] = result.Text;
        });

        return new Dictionary<string, string>(results);
    }
}
C#

스레드마다 RapidOcrEngine의 인스턴스화가 사라집니다.IronOCR스레드 인스턴스는 경량화되어 있어 생성 시 외부 모델을 로드할 필요가 없습니다. 멀티스레딩 예제는 높은 처리량을 가진 파이프라인을 위한 동시 처리 패턴을 보여줍니다.

다중 프레임 TIFF 처리

RapidOCR.NET은 단일 이미지 파일만 지원합니다. 멀티 페이지 TIFF — 팩스로 수신된 문서와 스캔된 아카이브의 표준 형식 — 를 처리하려면 개별 프레임으로 나누고, 이것들을 임시 파일에 저장한 후, 각각에 대해 engine.Run()를 실행하고, 이후 정리해야 합니다. IronOCR는 OcrInput.LoadImageFrames을 통해 멀티 프레임 TIFF를 본래적으로 처리합니다.

RapidOCR.NET의 접근 방식:

using RapidOcrNet;
// Also requires: SixLabors.ImageSharp or System.Drawing for TIFF frame extraction

public class TiffOcrProcessor
{
    private readonly RapidOcrEngine _engine;

    public TiffOcrProcessor(string modelDir)
    {
        _engine = new RapidOcrEngine(new RapidOcrOptions
        {
            DetModelPath = Path.Combine(modelDir, "det.onnx"),
            ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
            RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
            KeysPath     = Path.Combine(modelDir, "en_keys.txt")
        });
    }

    public string ProcessMultiPageTiff(string tiffPath)
    {
        var pageTexts = new List<string>();
        var tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString());
        Directory.CreateDirectory(tempDir);

        try
        {
            // External library required to split TIFF frames
            var framePaths = SplitTiffIntoFrames(tiffPath, tempDir); // not in RapidOcrNet

            foreach (var framePath in framePaths)
            {
                var result = _engine.Run(framePath);
                pageTexts.Add(string.Join("\n",
                    result.TextBlocks
                          .OrderBy(b => b.BoundingBox.Top)
                          .Select(b => b.Text)));
            }
        }
        finally
        {
            // Clean up temp frame files
            Directory.Delete(tempDir, recursive: true);
        }

        return string.Join("\n\n", pageTexts);
    }

    private IEnumerable<string> SplitTiffIntoFrames(string tiffPath, string outputDir)
    {
        // Requires external library — implementation depends on what is installed
        throw new NotImplementedException("Add SixLabors.ImageSharp or similar");
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class TiffOcrProcessor
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ProcessMultiPageTiff(string tiffPath)
    {
        using var input = new OcrInput();
        input.LoadImageFrames(tiffPath); // All frames loaded — no external library needed

        var result = _ocr.Read(input);
        return result.Text; // Pages assembled in order automatically
    }

    public IEnumerable<(int PageNumber, string Text, double Confidence)> ProcessTiffWithPageData(string tiffPath)
    {
        using var input = new OcrInput();
        input.LoadImageFrames(tiffPath);

        var result = _ocr.Read(input);

        foreach (var page in result.Pages)
            yield return (page.PageNumber, page.Text, page.Confidence);
    }
}
C#

외부 이미지 라이브러리, 임시 파일, 정리 로직이 필요 없습니다. LoadImageFrames는 모든 TIFF 프레임을 한 번의 호출로 OcrInput 파이프라인에 읽어들입니다. TIFF 및 GIF 입력 방법 안내서에는 프레임 선택, 페이지 범위 필터링, 대용량 다중 프레임 문서의 메모리 효율적인 처리에 대한 내용이 포함되어 있습니다.

스캔된 양식에서 구조화된 데이터 추출

RapidOCR.NET은 바운딩 박스가 포함된 텍스트 블록을 반환하지만, 단락, 줄 또는 단어와 같은 상위 수준의 문서 구조는 포함하지 않습니다. 스캔된 양식에서 개별 필드를 추출하려면 원시 블록 목록에 대해 좌표 교차 로직을 작성해야 합니다. IronOCR은 모든 레벨의 좌표와 함께 문자 수준까지 구조화된 결과 트리를 제공합니다.

RapidOCR.NET의 접근 방식:

using RapidOcrNet;

public class FormFieldExtractor
{
    private readonly RapidOcrEngine _engine;

    public FormFieldExtractor(string modelDir)
    {
        _engine = new RapidOcrEngine(new RapidOcrOptions
        {
            DetModelPath = Path.Combine(modelDir, "det.onnx"),
            ClsModelPath = Path.Combine(modelDir, "cls.onnx"),
            RecModelPath = Path.Combine(modelDir, "rec_en.onnx"),
            KeysPath     = Path.Combine(modelDir, "en_keys.txt")
        });
    }

    // Extract text within a defined region by filtering block coordinates manually
    public string ExtractFieldByRegion(string imagePath, float regionLeft, float regionTop,
                                        float regionRight, float regionBottom)
    {
        var result = _engine.Run(imagePath);

        // Filter blocks whose bounding box intersects the target region
        var blocksInRegion = result.TextBlocks
            .Where(b =>
                b.BoundingBox.Left   < regionRight  &&
                b.BoundingBox.Right  > regionLeft   &&
                b.BoundingBox.Top    < regionBottom &&
                b.BoundingBox.Bottom > regionTop)
            .OrderBy(b => b.BoundingBox.Top)
            .ThenBy(b => b.BoundingBox.Left);

        return string.Join(" ", blocksInRegion.Select(b => b.Text));
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class FormFieldExtractor
{
    private readonly IronTesseract _ocr = new IronTesseract();

    // Use CropRectangle to OCR only the target region — no post-filter needed
    public string ExtractFieldByRegion(string imagePath, int x, int y, int width, int height)
    {
        var region = new CropRectangle(x, y, width, height);

        using var input = new OcrInput();
        input.LoadImage(imagePath, region);

        return _ocr.Read(input).Text;
    }

    // Extract all fields with their coordinates from a full-page scan
    public IEnumerable<(string Text, int X, int Y, double Confidence)> ExtractAllWords(string imagePath)
    {
        var result = _ocr.Read(imagePath);

        foreach (var page in result.Pages)
            foreach (var word in page.Words)
                yield return (word.Text, word.X, word.Y, word.Confidence);
    }
}
C#

CropRectangle는 관심 지역에 대해 정확한 OCR을 하며, 전체 페이지 OCR을 실행하고 그 결과를 필터링하는 것보다 더 빠르고 정확합니다. 단어마다의 좌표와 신뢰 값은 수동 경계 상자 교차 코드 없이 result.Pages[i].Words에서 직접 사용할 수 있습니다. 지역 기반 OCR 사용법자르기 사각형 예제에서 이 패턴을 자세히 다룹니다.

RapidOCR.NET API에서 IronOCR로의 매핑 참조

RapidOCR.NETIronOCR에 상응하는
using RapidOcrNetusing IronOcr
new RapidOcrEngine(new RapidOcrOptions { ... })new IronTesseract()
RapidOcrOptions.DetModelPath불필요 — 내부적으로 번들됨
RapidOcrOptions.ClsModelPath불필요 — 내부적으로 번들됨
RapidOcrOptions.RecModelPath불필요 — 내부적으로 번들됨
RapidOcrOptions.KeysPath불필요 — 내부적으로 번들됨
RapidOcrOptions.UseGpu해당 없음 — 내부적으로 CPU 최적화됨
RapidOcrOptions.NumThreads각 스레드마다 하나의 Parallel.ForEach를 사용하세요
engine.Run(imagePath)ocr.Read(imagePath)
engine.Dispose()using var ocr = new IronTesseract()
result.TextBlocksresult.Pages[i].Words / .Lines / .Paragraphs
result.TextBlocks[i].Textresult.Words[i].Text
result.TextBlocks[i].Confidenceresult.Words[i].Confidence
result.TextBlocks[i].BoundingBox.Topresult.Words[i].Y
result.TextBlocks[i].BoundingBox.Leftresult.Words[i].X
수동 OrderBy(b => b.BoundingBox.Top) 정렬필요하지 않음 — result.Text가 읽기 순서에 있음
string.Join("\n", result.TextBlocks.Select(b => b.Text))result.Text
언어 파일 교체 (다른 모델 다운로드)ocr.Language = OcrLanguage.French
언어 변경을 위한 엔진 재구축필요하지 않음 — 호출당 ocr.Language를 설정합니다
PDF-이미지 변환 + engine.Run() 루프ocr.Read("document.pdf")
다중 프레임 TIFF 수동 프레임 분할input.LoadImageFrames("document.tiff")
검색 가능한 PDF 기능 없음result.SaveAsSearchablePdf("output.pdf")
BARCODE 기능 없음ocr.Configuration.ReadBarCodes = true

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

문제 1: 마이그레이션 후에도 Models 디렉터리가 여전히 존재함

RapidOCR.NET: 프로젝트 내 models/ 디렉토리에는 det.onnx, cls.onnx, rec_en.onnx, en_keys.txt 및 이를 빌드 시 복사하는 MSBuild <Content> 항목이 포함되어 있습니다. IronOCR로 전환한 후에도 이 디렉터리와 해당 항목들은 그대로 남아 빌드 출력 크기를 불필요하게 늘리고 있습니다.

솔루션: models/ 디렉토리를 삭제하고, .csproj에서 해당 <ItemGroup>를 제거하며, 누락된 파일을 점검하는 모든 시작 유효성 검사 로직을 제거하세요. 별도로 설치된 경우 Microsoft.ML.OnnxRuntime NuGet 참조도 제거하세요. IronOCR을 사용하는 .NET 애플리케이션의 실행 결과물에는 외부 모델 파일이 포함되지 않습니다.

<!-- Remove this entire block from .csproj -->
<ItemGroup>
  <Content Include="models\**\*.*">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  </Content>
</ItemGroup>
XML

이슈 2: 스레드별 엔진 구성 패턴

RapidOCR.NET: 공유 상태 문제를 피하고자 각 스레드에 대해 새로운 RapidOcrEngine를 생성한 병렬 처리 코드는 상당한 메모리 비용이 발생했습니다: 각 엔진 인스턴스는 독립적으로 300-500 MB의 ONNX 모델 가중치를 로드했습니다.

**솔루션:**IronOCRIronTesseract 인스턴스는 스레드 안전하며 경량입니다. 각 스레드마다 Parallel.ForEach에서 하나를 생성하면 인스턴스 당 모델 가중치 로드 비용을 걱정할 필요가 없습니다.IronOCR접근방식은 위의 배치 처리 마이그레이션 예제와 동일합니다 — IronTesseract은 300-500 MB 모델 가중치 로드 비용 없이 각 RapidOcrEngine 인스턴스가 소용한 것과 같은 스레드별 구축 패턴으로 이 시나리오를 처리합니다. 멀티스레딩 예제는 높은 처리량을 가진 파이프라인의 표준 패턴을 보여줍니다.

문제 3: 지원되지 않는 언어 예외

RapidOCR.NET: RapidOCR.NET을 통해 비-CJK 문서를 처리하거나, 존재하지 않는 스페인어/프랑스어/독일어 모델을 사용하여 엔진을 구축하려고 시도하는 코드는 런타임 시 파일 미검출 오류가 발생하거나 빈 결과를 반환할 것입니다.

솔루션: 적절한 언어 팩 NuGet 패키지를 설치하고 목표 OcrLanguage 열거형 값으로 ocr.Language를 설정하세요. 모델 다운로드, 엔진 재빌드, 각 언어별 추가 코드 경로 없이:

dotnet add package IronOcr.Languages.Spanish, IronOcr.Languages.French, IronOcr.Languages.Arabic

var ocr = new IronTesseract();
ocr.Language = OcrLanguage.Spanish;
var result = ocr.Read("spanish-document.jpg");
C#

사용자 지정 언어 팩 가이드에서는 표준 125개 이상의 팩을 넘어서는 고급 언어 구성에 대해 다룹니다.

문제 4: 마이그레이션 후 텍스트 블록 정렬 로직이 작동하지 않음

RapidOCR.NET: result.TextBlocks은 비정렬 평면 목록이었기 때문에 코드베이스에는 결과 처리 코드에 걸쳐 .OrderBy(b => b.BoundingBox.Top).ThenBy(b => b.BoundingBox.Left) 체인이 퍼져 있었습니다.

해결책: 이 정렬 로직을 완전히 삭제하십시오. IronOCR의 result.Text는 이미 자연 읽기 순서로 조립되어 있습니다. 정렬된 블록에서 경계 상자 좌표를 소비한 코드인 경우 블록 참조를 result.Pages[i].Words[j]로 교체하세요:

// Before: manual sort + coordinate extraction
var sorted = result.TextBlocks
    .OrderBy(b => b.BoundingBox.Top)
    .ThenBy(b => b.BoundingBox.Left);

foreach (var block in sorted)
    Console.WriteLine($"{block.Text} at ({block.BoundingBox.Left}, {block.BoundingBox.Top})");

// After: structured access, already in order
foreach (var page in result.Pages)
    foreach (var word in page.Words)
        Console.WriteLine($"{word.Text} at ({word.X}, {word.Y})");
C#

이슈 5: 모델 파일 삭제 후 CI/CD 파이프라인 실패

RapidOCR.NET: 별도의 단계를 통해 models/ 디렉토리를 캐시하거나 가져온 빌드 파이프라인은 마이그레이션 이후 복원할 항목을 찾지 못할 경우 실패하게 됩니다.

해결책: CI 파이프라인에서 모델 파일 가져오기 및 캐싱 단계를 완전히 제거하십시오. IronOCR의 엔진은 표준 dotnet restore 단계의 일부로 복원됩니다. 추가적인 파이프라인 단계는 필요하지 않습니다. 컨테이너화된 배포의 경우, 모든 COPY models/ ./models/ Docker 지시사항을 제거하세요 —IronOCRDocker 배포 가이드는 하나의 필수 시스템 패키지 (libgdiplus Debian/Ubuntu 이미지에서)을 설명합니다.

이슈 6: 부분 마이그레이션 후 ONNX 런타임 버전 충돌

RapidOCR.NET: 다른 ONNX 기반 ML 패키지(ML.NET, ONNX 객체 감지 등)를 사용하는 응용 프로그램은 RapidOCR.NET 호환성을 위해 특정 버전으로 Microsoft.ML.OnnxRuntime을 고정할 수 있었을 것입니다. RapidOCR.NET을 제거하면 다른 패키지들에서 버전 충돌이 발생할 수 있습니다.

솔루션: 명시적 패키지 목록에서 Microsoft.ML.OnnxRuntime을 제거하세요. IronOCR는 ONNX Runtime 종속성이 없으므로 RapidOCR.NET 참조를 제거하면 버전 고정이 완전히 제거됩니다. ONNX Runtime이 반드시 필요한 다른 ML 패키지는 RapidOCR.NET의 제약 없이 표준 NuGet 종속성 해결을 통해 자체적으로 호환되는 버전을 해결할 수 있습니다.

RapidOCR.NET 마이그레이션 체크리스트

이동 전 작업

변경 사항을 적용하기 전에 코드베이스에서 RapidOCR.NET 사용처를 모두 검토하십시오:

# Find all files that reference RapidOcrNet
grep -r "RapidOcrNet\|RapidOcrEngine\|RapidOcrOptions" --include="*.cs" .

# Find model path configuration
grep -r "DetModelPath\|ClsModelPath\|RecModelPath\|KeysPath" --include="*.cs" .

# Find MSBuild model copy entries
grep -r "det\.onnx\|cls\.onnx\|rec.*\.onnx\|keys\.txt" --include="*.csproj" .

# Find model validation logic
grep -r "ValidateModel\|models/" --include="*.cs" .

# Find ONNX Runtime references
grep -r "OnnxRuntime\|Microsoft\.ML" --include="*.csproj" .

# Find language-switching patterns (multiple engine instances per language)
grep -r "CreateEnglishEngine\|CreateChineseEngine\|rec_en\|ch_rec\|en_keys\|ch_keys" --include="*.cs" .
SHELL

결과를 목록화하세요: 엔진이 생성되는 장소, 모델 경로가 구성되는 장소, 텍스트 블록이 정렬되는 장소, PDF-이미지 변환이 engine.Run()로 공급되는 모든 장소를 기록하세요.

코드 업데이트 작업

  1. 모든 .csproj 파일에서 RapidOcrNet NuGet 패키지 참조를 제거하세요.
  2. 모든 .csproj 파일에서 Microsoft.ML.OnnxRuntime NuGet 패키지 참조를 제거하세요.
  3. IronOcr NuGet 패키지를 설치하세요.
  4. 애플리케이션에 필요한 비영어 언어용 언어 팩 NuGet 패키지를 설치하십시오.
  5. 프로젝트 및 저장소에서 models/ 디렉토리를 삭제하세요.
  6. 모든 .csproj 파일에서 <Content Include="models\**\*.*"> MSBuild 항목을 제거하세요.
  7. 시작 모델 유효성 검사 메소드 (EnsureModelsPresent 스타일 메소드)를 제거하세요.
  8. 모든 소스 파일에서 using RapidOcrNet을(를) using IronOcr으로 교체하세요.
  9. new RapidOcrEngine(new RapidOcrOptions { ...를 다음으로 대체하십시오. })with new IronTesseract()`.
  10. engine.Run(imagePath)을(를) ocr.Read(imagePath)으로 교체하세요.
  11. result.TextBlocks 어셈블리 체인 (.OrderBy().Select(b => b.Text))을 result.Text으로 교체하세요.
  12. 좌표 필터 필드 추출을 CropRectangle 지역 입력으로 교체하세요.
  13. 스레드별 엔진 생성을 스레드별 IronTesseract 생성으로 교체하세요.
  14. 언어별 엔진 팩토리 메소드를 ocr.Language = OcrLanguage.X 할당으로 교체하세요.
  15. PDF-이미지 변환 코드를 제거하고 직접 ocr.Read("file.pdf") 호출로 교체하세요.
  16. 멀티 프레임 TIFF 프레임 분할 코드를 제거하고 input.LoadImageFrames("file.tiff")로 교체하세요.
  17. 응용 프로그램 시작 시 IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"을(를) 추가하세요.
  18. CI/CD 파이프라인 정의에서 모델 파일 가져오기 및 캐시 단계를 제거하십시오.
  19. Dockerfile에서 ONNX 모델 COPY 지시 사항을 제거하세요.

마이그레이션 후 테스트

  • 기존 모든 이미지 OCR 경로가 RapidOCR.NET 출력 결과와 동등하거나 그 이상의 정확도로 텍스트를 반환하는지 확인하십시오.
  • 각 문서 유형에 대한 예상 필드 순서와 일치하는 result.Text 읽기 순서를 확인하세요.
  • 응용 프로그램이 사용하는 모든 OcrLanguage 값에 대해 언어 전환된 읽기를 테스트하세요.
  • 병렬 배치 프로세서를 실행하고 스레드 경합 오류나 오래된 결과 문제가 없는지 확인하십시오.
  • 다중 프레임 TIFF 처리 시 올바른 페이지 수와 페이지별 텍스트가 반환되는지 확인하십시오.
  • 예상 좌표 지역에 대해 CropRectangle를 통한 양식 필드 추출을 테스트하세요.
  • 빌드 출력 및 배포 패키지에서 models/ 디렉토리가 없는 것을 확인하세요.
  • CI 파이프라인을 처음부터 끝까지 실행하고 모델 가져오기 단계가 남아 있지 않은지 확인하십시오.
  • Docker 컨테이너를 빌드 및 실행하고 시작 시 COPY models/ 레이어나 파일 찾기 실패 오류가 없는지 확인하세요.
  • 콜드 스타트 지연 시간이 감소했는지 확인하기 위해 시작 시간 측정을 테스트합니다.

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

배포가 이제 결정론적입니다. dotnet restoredotnet publish는 외부 파일 종속성 없이 완전하고 작동하는 OCR 배포를 생성합니다. 패키지 버전을 설치하는 동일한 NuGet 복원 작업으로 엔진 실행에 필요한 모든 구성 요소가 설치됩니다. 별도로 버전을 관리해야 할 모델 파일도, 구성해야 할 CI 캐시 단계도, 유지 관리해야 할 배포 검증 스크립트도 없습니다. 이 파이프라인은 다른 .NET 패키지 종속성과 마찬가지로 간단합니다.

언어 범위는 비즈니스 요구 사항과 함께 확장됩니다. 새로운 문서 언어에 대한 지원을 추가하는 것은 dotnet add package IronOcr.Languages.X을 실행하고 ocr.Language을 설정하는 것을 의미합니다. 업스트림 모델 가용성 확인, 모델 다운로드, 엔진 리팩토링은 수행되지 않습니다. 처음에는 영어 OCR로 시작하다가 나중에 독일어 계약서, 아랍어 청구서 또는 러시아어 구매 주문서를 처리해야 하는 팀은 애플리케이션 아키텍처를 변경하지 않고도 처리 범위를 확장할 수 있습니다. 125개 이상의 모든 언어 팩은 동일한 설치 방식을 따릅니다.

구조화된 출력이 좌표 조립 코드를 제거합니다. result.Pages, .Paragraphs, .Lines, .Words, 및 .Characters 계층 구조는 평면한 TextBlocks 목록과 그 구조 결여 문제로 인한 정렬 로직을 대체합니다. 블록 좌표를 정렬하여 읽기 순서대로 텍스트를 추출하는 코드는 삭제되었습니다. 단어마다의 경계 상자를 필요로 했던 코드는 교차 필터링 없이 word.X, word.Y, word.Width, word.Height에서 받습니다. OCR 결과 기능 페이지에는 전체 출력 모델이 설명되어 있습니다.

PDF 및 TIFF 처리에 외부 라이브러리가 필요하지 않습니다. 단일 이미지 JPG를 제외한 가장 일반적인 두 가지 문서 형식인 다중 페이지 PDF와 다중 프레임 TIFF는 IronOCR에서 기본적으로 처리됩니다. PDF 또는 TIFF 입력을 지원하기 위해 종속성 트리에 추가된 모든 외부 라이브러리를 제거할 수 있습니다. 결과적으로 업데이트해야 할 패키지 수가 줄어들고, 버전 호환성 문제가 감소하며, 프로젝트 파일이 더 간소화됩니다. PDF 입력 방법TIFF 입력 방법 문서에서는 두 형식에 대해 상세히 다루고 있습니다.

운영 중 발생하는 사고에 대한 지원 경로가 마련되어 있습니다. 상용 라이선스에는 GitHub 이슈 응답을 기다릴 수 없는 문제에 대해 연락할 수 있는 연락처가 지정된 직접 이메일 지원이 포함됩니다. SLA 의무가 있거나 비즈니스에 중요한 문서 처리 파이프라인을 운영하는 팀은 커뮤니티의 응답을 기다리기보다 라이브러리를 관리하는 엔지니어에게 문제를 에스컬레이션할 수 있습니다. IronOCR 문서 허브에서는 해당 지원 경로와 함께 참조 문서를 제공합니다.

$999 영구 라이선스는 일회성 비용입니다. 페이지당 가격 책정, 거래당 과금, 비용 협상을 재시작하는 연간 갱신이 없습니다. 모델 관리, PDF 변환 우회 작업, CI 파이프라인 유지 관리, 지원되지 않는 언어 관련 문제 해결에 소요되는 엔지니어링 시간을 비용으로 산정한 개발 팀들은, 라이선스 비용 대비 비용 효율성이 뛰어나다는 점을 일관되게 확인합니다.

참고해 주세요: RapidOCR 및 Tesseract는 각각의 소유자의 등록 상표입니다. 이 사이트는 Google 또는 RapidOCR과 관련이 없으며, 그들로부터의 보증이나 후원을 받지 않습니다. 모든 제품명, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

관련 기사

Key in blue circle

무료 30일 체험 키를 즉시 받으세요.

Your trial license will be sent to your email address

제한 없음. 100% 무제한 이용. 신용카드 불필요.

bullet_checked신용카드나 계정 생성은 필요하지 않습니다.제한 없음. 100% 무제한 이용. 신용카드 불필요.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
부담 없는 무료 상담을 받아보세요
아래 양식을 작성하시거나 sales@ironsoftware.com으로 이메일을 보내주세요.
고객님의 정보는 항상 비밀로 유지됩니다.
전 세계 수백만 엔지니어들이 신뢰하는 제품입니다.
Iron Software의 고객 로고
지금 바로 30일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.