IRONSOFTWAREHOME
동영상

TesseractOCR에서 IronOCR로 마이그레이션하기

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

이 가이드는 .NET 개발자가 테서랙트OCR NuGet 패키지(Sicos1977/Kees van Spelde 포크)에서 IronOCR로 완전히 마이그레이션하는 과정을 안내합니다. 이 과정은 전체 교체 경로를 다룹니다: 외부 전처리 종속성 제거, 네이티브 PDF 입력 및 검색 가능한 PDF 출력 지원, 네임스페이스 및 API 호출 업데이트, 그리고 마이그레이션된 통합 기능 검증 등이 포함됩니다. 비교 기사를 미리 읽을 필요는 없습니다.

TesseractOCR에서 전환해야 하는 이유

TesseractOCR은 최신 .NET을 대상으로 하며 Tesseract 5 네이티브 라이브러리를 번들로 제공하는, 활발히 유지 관리되는 커뮤니티 래퍼입니다. 구형 래퍼에서 이 버전으로 업그레이드하면 프레임워크 호환성 문제가 해결됩니다. 이는 래퍼 레이어 아래에 존재하는 아키텍처상의 격차를 해결하지는 않습니다. 실제 운영 환경에서 이러한 문제점이 드러나면 마이그레이션 논의가 시작됩니다.

전처리는 라이브러리 외부에서 완전히 수행됩니다. TesseractOCR는 제공된 어떤 픽셀이라도 engine.Process(image)를 호출합니다. 비뚤어진 스캔본, 대비가 낮은 팩스, 영수증을 휴대폰으로 찍은 사진 등 모든 자료가 Tesseract 엔진에 원본 그대로 입력됩니다. 사용 가능한 출력을 복구하려면 SixLabors.ImageSharp, SkiaSharp 또는 유사한 이미징 라이브러리를 추가하고 문서 유형별로 조정된 매개변수로 수동 필터 체인을 작성하며 TesseractOCR.Pix.Image이 파일 경로를 예상하기 때문에 전처리된 이미지를 임시 파일을 통해 라우팅해야 합니다. 표준 .NET Standard 이미징 라이브러리에는 디스키우(Deskew) 기능이 전혀 없습니다. 이를 구현하려면 호프 변환(Hough transform) 각도 감지 알고리즘을 처음부터 구현해야 하며, 일반적으로 50~100줄의 추가 코드가 필요합니다. 이는 일회성 설정 비용이 아니며, 새로운 문서 유형이 파이프라인에 추가될 때마다 반복적으로 발생합니다.

PDF 입력에는 별도의 라이브러리와 임시 파일 파이프라인이 필요합니다. TesseractOCR은 PDF가 아닌 이미지를 처리합니다. 모든 PDF 워크플로에는 PDF 페이지를 BGRA 바이트 배열로 렌더링하기 위한 추가 패키지(Docnet.Core, PdfiumViewer 등)와, 해당 바이트를 TesseractOCR이 읽을 수 있는 형식으로 변환하는 헬퍼 메서드, 그리고 전체 루프를 감싸는 임시 파일 생성 및 정리 로직이 필요합니다. 그 결과, 모든 PDF OCR 작업마다 약 100줄의 인프라 코드가 필요하게 됩니다. 암호로 보호된 PDF는 처리를 전에 복호화하는 데 iText (AGPL 라이선스)나 PDFSharp와 같은 세 번째 라이브러리가 필요합니다.

검색 가능한 PDF 출력 기능이 없습니다. 스캔된 문서에서 기계가 읽을 수 있는 PDF를 생성해야 하는 팀(문서 관리, 아카이빙 및 규정 준수 워크플로우에서 흔히 요구되는 사항)은 TesseractOCR이 이를 위한 메커니즘을 제공하지 않는다는 사실을 알게 됩니다. 여기에는 SaveAsSearchablePdf()이 없으며, hOCR-to-PDF 파이프라인이 없고, 추출된 텍스트 이외의 출력 형식이 없습니다. 이 기능을 추가하려면 별도의 PDF 라이브러리를 사용하거나 TesseractOCR을 완전히 포기해야 합니다.

TIFF 다중 프레임 문서는 수동 페이지 루프가 필요합니다. 팩스 워크플로 및 문서 스캐너에서 흔히 볼 수 있는 다중 페이지 TIFF 파일은 TesseractOCR에서 기본적으로 다중 프레임 처리를 지원하지 않습니다. 모든 프레임을 추출하려면 외부 라이브러리를 사용하여 TIFF 파일을 불러온 다음, 프레임을 순차적으로 처리하여 각각을 임시 파일에 저장하고, 각 임시 파일을 OCR 엔진에 개별적으로 입력해야 합니다.

커뮤니티 규모로 인해 실질적인 지원에는 한계가 있습니다. TesseractOCR의 NuGet 다운로드 수는 약 20만 건입니다. .NET Tesseract 래퍼에 대한 Stack Overflow, 블로그 게시물, GitHub 이슈 스레드는 대개 charlesw API — TesseractEngine, Pix.LoadFromFile를 참조하며 Sicos1977 API는 아닙니다. 테서랙트OCR 특유의 문제를 해결하려는 실제 상황에서는 금방 한계에 부딪히게 됩니다.

근본적인 문제

TesseractOCR은 전처리 기능이 없으며 PDF를 지원하지 않습니다. 모든 실제 문서 워크플로에서는 OCR을 실행할 수 있는 단계에 도달하기 위해서만도 결국 외부 라이브러리가 필요합니다:

// TesseractOCR: three packages, a temp file, and manual byte conversion
// just to OCR one PDF page — before any preprocessing
// dotnet add package TesseractOCR
// dotnet add package Docnet.Core
// dotnet add package SixLabors.ImageSharp   (preprocessing)

using var library = DocLib.Instance;
using var docReader = library.GetDocReader(pdfPath, new PageDimensions(200, 200));
using var pageReader = docReader.GetPageReader(0);
var bytes = pageReader.GetImage(); // BGRA — not a format Pix.Image accepts directly

string tempPath = Path.GetTempFileName() + ".png";
SaveBgraAsPng(bytes, pageReader.GetPageWidth(), pageReader.GetPageHeight(), tempPath);
// ^ 30+ line helper method needed here

using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var image = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
using var page = engine.Process(image);
string text = page.Text;
File.Delete(tempPath); // hope this succeeds
C#
// IronOCR: one package, three lines, preprocessing automatic
// dotnet add package IronOcr

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

##IronOCR대 TesseractOCR: 기능 비교

아래 표는 마이그레이션 평가 시 가장 중요한 기능들을 정리한 것입니다.

기능테서랙트OCRIronOCR
NuGet 패키지TesseractOCRIronOcr
.NET 호환성.net 6.0, 7.0, 8.0.NET Framework 4.6.2 이상, .NET Core, .NET 5/6/7/8/9
라이선스Apache 2.0 (무료)상업적 (영구적, $999부터)
Tessdata 관리필수 (GitHub에서 수동 다운로드)필요 없음 (내부적으로 번들됨)
내장 전처리 기능None기울기 보정, 노이즈 제거, 대비 조정, 이진화, 선명도 향상, 크기 조정, 확대/축소, 침식, 반전
심도 있는 배경 소음 제거아니요예 (DeepCleanBackgroundNoise())
네이티브 PDF 입력아니요 (Docnet.Core 또는 이와 유사한 라이브러리가 필요합니다)예 (input.LoadPdf())
비밀번호로 보호된 PDF아니요 (암호 해독을 위해 별도의 라이브러리가 필요합니다)예 (단일 Password 매개변수)
검색 가능한 PDF 출력아니요예 (result.SaveAsSearchablePdf())
다중 프레임 TIFF 입력아니요 (외부 프레임 추출 필요)예 (input.LoadImageFrames())
스트림 및 바이트 배열 입력아니요 (임시 파일 중계 필요)예 (직접 LoadImage(stream), LoadImage(bytes))
나사 안전아니요 (스레드당 하나의 엔진 인스턴스)예 (스레드 간 공유되는 단일 IronTesseract)
영역 기반 OCR아니요예 (CropRectangle)
OCR 중 바코드 판독아니요예 (ocr.Configuration.ReadBarCodes = true)
구조화된 출력(페이지, WORD, 좌표)아니요 (단순 텍스트 문자열만)예 (Pages, Paragraphs, Lines, Words과 X/Y 포함)
자신감 점수문서 수준 부동 소수점(0.0–1.0)문서 및 WORD 수준 이중 평가 (0–100)
hOCR 내보내기아니요
125개 이상의 언어를 지원하는 NuGet 패키지아니요
크로스 플랫폼 배포윈도우, 리눅스, macOS윈도우, 리눅스, macOS, Docker, Azure, AWS
상업적 지원아니요 (단일 자원봉사 유지보수자)예 (이메일, SLA 옵션)

빠른 시작: TesseractOCR에서 IronOCR로 마이그레이션

1단계: NuGet 패키지 교체

TesseractOCR 및 이를 지원하기 위해 추가된 모든 라이브러리를 제거하십시오:

dotnet remove package TesseractOCR
dotnet remove package Docnet.Core
dotnet remove package SixLabors.ImageSharp
SHELL

NuGet 에서IronOCR설치하세요.

dotnet add package IronOcr

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

모든 테서랙트OCR 네임스페이스의 가져오기를 IronOCR로 대체하세요:

// Before (TesseractOCR)
using TesseractOCR;
using TesseractOCR.Enums;

// After (IronOCR)
using IronOcr;
C#

단계 3: 라이선스 초기화

응용 프로그램 시작 시, OCR 호출 전에 라이선스 초기화를 한 번 수행하십시오:

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

IronOCR 라이선스 페이지에서 평가를 위한 무료 체험판 라이선스를 이용할 수 있습니다.

코드 마이그레이션 예제

외부 전처리 파이프라인 교체

TesseractOCR은 문서 품질 향상을 위해 외부 이미지 처리 라이브러리가 필요합니다. 아래 코드는 문서 품질이 일정하지 않을 때 팀이 작성하는 패턴을 보여줍니다. 즉, OCR을 실행하기 전에 그레이스케일 변환, 대비 조정, 노이즈 제거 및 임시 파일 쓰기 작업이 수행됩니다. 스캔된 이미지의 기울기를 보정하는 기능(Deskew)은 표준 .NET Standard 이미징 라이브러리에서는 제공되지 않으며 별도의 알고리즘이 필요합니다.

TesseractOCR 접근 방식:

// Requires: dotnet add package SixLabors.ImageSharp
// Manual preprocessing — parameters must be tuned per document type
// Deskew is NOT in ImageSharp — requires custom Hough transform (~50-100 lines)

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using TesseractOCR;
using TesseractOCR.Enums;

public string ExtractFromLowQualityScan(string imagePath)
{
    using var image = Image.Load(imagePath);

    image.Mutate(x => x.Grayscale());
    image.Mutate(x => x.Contrast(1.5f));          // manual tuning required
    image.Mutate(x => x.GaussianBlur(0.5f));      // noise reduction approximation
    image.Mutate(x => x.BinaryThreshold(0.5f));   // threshold requires per-doc adjustment

    // Deskew omitted — no built-in support, ~80 lines of additional code

    string tempPath = Path.GetTempFileName() + ".png";
    try
    {
        image.Save(tempPath);

        using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
        using var pix = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
        using var page = engine.Process(pix);

        return page.Text;
    }
    finally
    {
        File.Delete(tempPath);
    }
}
C#

IronOCR 접근 방식:

// 아니요 external imaging library
// 아니요 temp file — OcrInput accepts a path, stream, or byte array directly
// Deskew is built in — automatic angle detection and correction

using IronOcr;

public string ExtractFromLowQualityScan(string imagePath)
{
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    input.Deskew();           // automatic angle correction
    input.DeNoise();          // intelligent noise removal
    input.Contrast();         // automatic contrast enhancement
    input.Binarize();         // clean black-and-white conversion

    var ocr = new IronTesseract();
    return ocr.Read(input).Text;
}
C#

ImageSharp 의존성을 제거하면 튜닝 주기가 완전히 사라집니다. OcrInput 전처리 파이프라인은 문서 OCR에 맞게 조정된 알고리즘을 적용합니다. 명암 배수값이나 블러 반경을 추측할 필요가 없습니다. 이미지 필터 튜토리얼이미지 품질 보정 가이드는 기본값을 조정해야 하는 경우를 대비해 매개변수 옵션을 포함한 모든 사용 가능한 필터를 다룹니다.

다중 프레임 TIFF 처리 대체

팩스 문서, 문서 스캐너 출력물 및 보관 파일은 종종 여러 페이지로 구성된 TIFF 파일 형태로 도착합니다. TesseractOCR은 다중 프레임 기능을 지원하지 않습니다. 각 프레임은 외부 라이브러리를 사용하여 추출한 후 디스크에 저장하고, 엔진에 한 번에 하나씩 입력해야 합니다. IronOCR은 단 한 번의 호출로 전체 TIFF 파일을 불러옵니다.

TesseractOCR 접근 방식:

// Requires: dotnet add package SixLabors.ImageSharp
// Manual frame extraction — every frame becomes a temp file on disk

using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Tiff;
using TesseractOCR;
using TesseractOCR.Enums;

public string ExtractFromMultiPageTiff(string tiffPath)
{
    var allText = new System.Text.StringBuilder();
    var tempFiles = new List<string>();

    try
    {
        using var image = Image.Load(tiffPath);
        using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);

        for (int frameIndex = 0; frameIndex < image.Frames.Count; frameIndex++)
        {
            // Clone frame and save to temp file — no in-memory path
            using var frameImage = image.Frames.CloneFrame(frameIndex);
            string tempPath = Path.GetTempFileName() + ".png";
            tempFiles.Add(tempPath);
            frameImage.SaveAsPng(tempPath);

            using var pix = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
            using var page = engine.Process(pix);

            allText.AppendLine($"=== Frame {frameIndex + 1} ===");
            allText.AppendLine(page.Text);
        }
    }
    finally
    {
        foreach (var f in tempFiles)
            try { File.Delete(f); } catch { }
    }

    return allText.ToString();
}
C#

IronOCR 접근 방식:

// 아니요 external library for frame extraction
// All frames processed in one Read() call — no manual loop required

using IronOcr;

public string ExtractFromMultiPageTiff(string tiffPath)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);   // loads all frames automatically
    var result = ocr.Read(input);

    // Access per-page text if needed
    foreach (var page in result.Pages)
        Console.WriteLine($"Frame {page.PageNumber}: {page.Text}");

    return result.Text;
}
C#

프레임 추출 루프, 임시 파일 목록, finally 정리 블록 — 모든 것이 사라집니다. 20페이지 분량의 팩스 TIFF 파일의 경우, 약 40줄을 6줄로 대체합니다. TIFF 및 GIF 입력 가이드에는 선택적 프레임 범위를 포함한 다중 프레임 로딩 옵션이 설명되어 있습니다.

검색 가능한 PDF 출력 생성

이 시나리오에는 TesseractOCR에서 적용할 수 있는 마이그레이션 경로가 없습니다. 즉, 구현이 불가능합니다. 검색 색인화, 접근성 또는 보관을 위해 기계가 읽을 수 있고 텍스트 선택이 가능한 문서로 변환해야 하는 스캔된 PDF 파일의 경우, 검색 가능한 PDF 출력을 생성해야 합니다. TesseractOCR은 추출된 텍스트만 생성합니다. IronOCR은 검색 가능한 PDF를 직접 생성합니다.

TesseractOCR 접근 방식:

// 아니요 path available — 테서랙트OCR cannot produce any PDF output.
// The closest workaround requires a separate PDF library (iTextSharp AGPL,
// or similar) to overlay extracted text onto the original PDF manually.
// This is 150-300 lines of additional code and introduces AGPL license concerns.

// The best available output from TesseractOCR:
using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
using var pix = TesseractOCR.Pix.Image.LoadFromFile("scanned-page.png");
using var page = engine.Process(pix);

string extractedText = page.Text; // flat string — no PDF output possible
File.WriteAllText("output.txt", extractedText);
// Cannot produce a searchable PDF — no API exists for this
C#

IronOCR 접근 방식:

// Native searchable PDF output — no additional library required
// Input can be a scanned image, a scanned PDF, or a multi-page TIFF

using IronOcr;

public void CreateSearchablePdf(string scannedPdfPath, string outputPath)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadPdf(scannedPdfPath);
    input.Deskew();     // improve accuracy before generating the output
    input.DeNoise();

    var result = ocr.Read(input);
    result.SaveAsSearchablePdf(outputPath);   // searchable, text-selectable PDF
}
C#

SaveAsSearchablePdf() 호출은 OCR 텍스트를 사본 이미지 뒤에 보이지 않는 레이어로 PDF에 내장시킵니다. 문서의 시각적 형식은 그대로 유지되지만, 전체 텍스트를 검색, 선택 및 색인화할 수 있게 됩니다. 검색 가능한 PDF 가이드에는 전체 API가 수록되어 있으며, 검색 가능한 PDF 예제에서는 완전한 작동 방식을 보여줍니다.

바이트 배열 입력 대체 및 임시 파일 제거

TesseractOCR의 Pix.Image API는 파일 경로를 허용합니다. 이미지 데이터가 데이터베이스, HTTP 멀티파트 업로드, 메모리 캐시 등에서 바이트 배열 형태로 도착하면, TesseractOCR은 처리 전에 임시 파일에 쓰기를 강제합니다. IronOCR의 OcrInput는 바이트 배열과 스트림을 직접 수용하여 임시 파일 단계를 완전히 제거합니다.

TesseractOCR 접근 방식:

// TesseractOCR.Pix.Image has no byte[] or Stream overload
// Every in-memory image must be written to disk before processing

using TesseractOCR;
using TesseractOCR.Enums;

public string ExtractFromBytes(byte[] imageBytes)
{
    // Force a disk write just to satisfy the file-path API
    string tempPath = Path.GetTempFileName() + ".png";

    try
    {
        File.WriteAllBytes(tempPath, imageBytes);

        using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
        using var pix = TesseractOCR.Pix.Image.LoadFromFile(tempPath);
        using var page = engine.Process(pix);

        return page.Text;
    }
    finally
    {
        // Risk: if an exception fires between WriteAllBytes and Delete,
        // temp files accumulate on the server disk
        if (File.Exists(tempPath))
            File.Delete(tempPath);
    }
}
C#

IronOCR 접근 방식:

// OcrInput accepts byte arrays and streams natively
// 아니요 disk write, no temp file cleanup, no cleanup failure risk

using IronOcr;

public string ExtractFromBytes(byte[] imageBytes)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadImage(imageBytes);   // direct byte array — no temp file
    return ocr.Read(input).Text;
}

public string ExtractFromStream(Stream imageStream)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadImage(imageStream);  // direct stream — no intermediate buffer
    return ocr.Read(input).Text;
}
C#

업로드된 문서를 처리하는 웹 애플리케이션에서, 임시 파일 패턴은 부하가 걸릴 때 디스크 사용량을 증가시키고, 정리 코드가 예외를 발생시킬 경우 경합 상태를 유발합니다. 스트림 입력 가이드이미지 입력 가이드MemoryStream, byte[], Bitmap 및 파일 경로를 포함하여 지원되는 모든 입력 형식을 다룹니다.

구조화된 데이터를 활용한 WORD 수준 신뢰도 필터링

TesseractOCR는 문서 수준의 단일 신뢰도 점수 (page.MeanConfidence, 0.0에서 1.0 사이의 부동소수점)와 평범한 텍스트 문자열을 반환합니다. 단어별 신뢰도, 단어 위치, 구조적 계층 구조는 없습니다. 불확실한 WORD를 표시하거나, 특정 영역을 추출하거나, 텍스트를 문서 좌표에 매핑하는 워크플로를 구축하려면 근본적으로 다른 출력 모델로 전환해야 합니다.

TesseractOCR 접근 방식:

// Only document-level confidence available
// 아니요 word coordinates, no structural hierarchy

using TesseractOCR;
using TesseractOCR.Enums;

public void ProcessWithConfidence(string imagePath)
{
    using var engine = new Engine(@"./tessdata", Language.English, EngineMode.Default);
    using var pix = TesseractOCR.Pix.Image.LoadFromFile(imagePath);
    using var page = engine.Process(pix);

    float docConfidence = page.MeanConfidence; // 0.0 to 1.0 for the whole document

    if (docConfidence >= 0.7f)
        Console.WriteLine($"Accepted ({docConfidence:P0}): {page.Text}");
    else
        Console.WriteLine($"Rejected ({docConfidence:P0}): document needs preprocessing");

    // 아니요 way to identify WHICH words are uncertain
    // 아니요 word coordinates available
}
C#

IronOCR 접근 방식:

// Per-word confidence and coordinate data
// Filter individual uncertain words without discarding the whole document

using IronOcr;

public void ProcessWithWordLevelConfidence(string imagePath)
{
    var ocr = new IronTesseract();
    using var input = new OcrInput();
    input.LoadImage(imagePath);
    var result = ocr.Read(input);

    Console.WriteLine($"Document confidence: {result.Confidence}%");

    // Iterate words and flag those below threshold
    foreach (var page in result.Pages)
    {
        foreach (var word in page.Words)
        {
            if (word.Confidence < 70)
            {
                // Low-confidence word — log position for review
                Console.WriteLine(
                    $"Low confidence word '{word.Text}' ({word.Confidence}%) " +
                    $"at X:{word.X} Y:{word.Y}");
            }
        }
    }

    // Extract only high-confidence text
    var reliableWords = result.Pages
        .SelectMany(p => p.Words)
        .Where(w => w.Confidence >= 70)
        .Select(w => w.Text);

    Console.WriteLine(string.Join(" ", reliableWords));
}
C#

WORD별 신뢰도 필터링은 청구서 처리, 양식 추출 및 불확실한 텍스트를 그대로 처리하는 것보다 검토를 위해 표시하는 것이 더 나은 모든 워크플로우에서 필수적입니다. 신뢰도 점수 가이드에는 전체 점수 산정 모델이 설명되어 있으며, 읽기 결과 가이드에는 완전한 구조화된 출력 계층 구조가 문서화되어 있습니다.

테서랙트OCR API에서 IronOCR로의 매핑 참조

테서랙트OCRIronOCR노트
new Engine(tessDataPath, Language.English, EngineMode.Default)new IronTesseract()tessdata 경로 없음; EngineMode 선택 불필요
TesseractOCR.Pix.Image.LoadFromFile(path)input.LoadImage(path)또한 byte[]Stream를 허용합니다.
engine.Process(pixImage)ocr.Read(input)OcrResultPage 대신 반환합니다.
page.Textresult.Text동일한 의미
page.MeanConfidence (0.0–1.0 부동소수점)result.Confidence (0–100 더블)규모가 다릅니다 — 업데이트 기준 비교
언어.영어\언어.프랑스어OcrLanguage.English + OcrLanguage.French
EngineMode.Default해당 없음IronOCR은 내부적으로 모드를 선택합니다
EngineMode.LstmOnly해당 없음자동
TesseractOCR.Exceptions.TesseractExceptionIronOcr.Exceptions.OcrException처리해야 할 예외 유형 수가 줄어듭니다.
DllNotFoundException (네이티브 없음)적용 안 됨IronOCR은 자체 종속성을 번들로 제공합니다
BadImageFormatException (아키텍처 불일치)적용 안 됨내부에서 처리됨
외부 Image.Mutate(x => x.Grayscale())input.Binarize()내장 기능, 외부 라이브러리 필요 없음
외부 Image.Mutate(x => x.Contrast(...))input.Contrast()자동 보정
외부 호프 변환(Hough transform)을 이용한 기울기 보정input.Deskew()내장형, 단일 메서드 호출
외부 GaussianBlur 노이즈 필터input.DeNoise()지능형 노이즈 제거
DocLib.GetDocReader(pdfPath, ...)input.LoadPdf(pdfPath)Docnet.Core는 필요하지 않습니다
docReader.GetPageReader(i).GetImage() + 임시 파일input.LoadPdf(pdfPath)전체 루프 교체됨
input.LoadPdf(encrypted, Password: "...")단일 매개변수 — 별도의 라이브러리 불필요
해당 없음 (PDF 출력 없음)result.SaveAsSearchablePdf(outputPath)TesseractOCR에는 상응하는 기능이 없습니다.
해당 없음 (프레임 미지원)input.LoadImageFrames(tiffPath)단일 호출로 다중 프레임 TIFF 처리
해당 없음 (파일 경로만)input.LoadImage(stream) / input.LoadImage(bytes)임시 파일 패턴 제거
스레드별 Engine 인스턴스스레드 간 공유되는 단일 IronTesseract설계상 스레드 안전
page.MeanConfidence (문서 전용)단어별 word.Confidence단어별 점수 확인 가능

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

문제 1: 마이그레이션 후 신뢰도 임계값이 깨짐

TesseractOCR: page.MeanConfidence는 0.0에서 1.0 사이의 범위에 있는 부동소수점을 반환합니다. 코드는 종종 if (confidence >= 0.7f)을 확인하여 결과를 수락합니다.

해결책: IronOCR은 0~100점 척도에서 신뢰도를 'double'로 보고합니다. 모든 기존 임계값을 100으로 곱하세요. 임계값이 0.7f일 때 70.0가 됩니다. 문서 수준 신뢰도는 result.Confidence에 있습니다; 단어 수준 신뢰도는 result.Pages[n].Words 내에 word.Confidence에 있습니다.

// Before (TesseractOCR): page.MeanConfidence >= 0.7f
// After (IronOCR):
var result = new IronTesseract().Read("document.png");
if (result.Confidence >= 70.0)
{
    Console.WriteLine(result.Text);
}
C#

문제 2: 마이그레이션 시도 후 임시 디렉터리가 가득 차는 현상

TesseractOCR: Pix.Image.LoadFromFile() 제약 조건을 중심으로 작성된 코드는 종종 finally 블록에서 정리되는 임시 파일을 생성합니다. 만약 finally 블록 자체가 예외를 발생시키거나 어플리케이션이 강제로 종료되면 임시 파일이 쌓이게 됩니다.

해결책: 모든 File.WriteAllBytes(tempPath, bytes) + Pix.Image.LoadFromFile(tempPath) 패턴을 input.LoadImage(bytes) 또는 input.LoadImage(stream)으로 대체하세요. 코드가 임시 파일을 생성하지 않게 되면, 정리 로직과 임시 저장소를 위한 디렉터리 생성 코드는 완전히 삭제할 수 있습니다. GetTempFileName, GetTempPath, SaveBgraAsPng을 검색하여 모든 발생을 찾아보세요.

grep -rn "GetTempFileName\|GetTempPath\|SaveBgraAsPng" --include="*.cs" .
SHELL
// Before: byte[] → temp file → Pix.Image.LoadFromFile
// After: byte[] → OcrInput directly
using var input = new OcrInput();
input.LoadImage(imageBytes);   // no disk write
var result = ocr.Read(input);
C#

지원되는 모든 입력 형식에 대해서는 이미지 입력 가이드를 참조하십시오.

문제 3: 언어 연산자 변경으로 인한 컴파일러 오류

TesseractOCR: 다국어 OCR은 플래그 열거형에 비트별 OR 연산을 사용합니다: Language.English | 언어.프랑스어. 이것은 [Flags] 열거형 패턴입니다.

해결책: IronOCR는 더하기 연산자를 사용합니다: OcrLanguage.English + OcrLanguage.French. 이것들은 비슷해 보이지만 서로 다른 연산자입니다. Language.OcrLanguage.로 찾아 바꾸기를 수행하고 | to + 각각의 언어 표현식 안에서 대부분의 경우를 다룹니다. 런타임 빌드된 언어 조합도 +을 사용하는지 확인하세요.

// Before (TesseractOCR):
var engine = new Engine(@"./tessdata",
    Language.English | Language.French | Language.German,
    EngineMode.Default);

// After (IronOCR):
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English + OcrLanguage.French + OcrLanguage.German;
C#

문제 4: 제거 후에도 Docnet 및 ImageSharp 패키지가 계속 참조됨

TesseractOCR: PDF 워크플로우에 TesseractOCR을 사용하는 프로젝트는 일반적으로 Docnet.Core를 직접적인 종속성으로, 전처리에는 SixLabors.ImageSharp 또는 SkiaSharp를 사용합니다. IronOCR로 전환한 후에도 이러한 패키지는 종종 .csproj에 남아 있습니다. 사용하는 문이 완전히 제거되지 않았기 때문입니다.

해결책: .csproj에서 패키지를 제거한 후 남아있는 using Docnet.Core, using SixLabors.ImageSharp 및 관련 네임스페이스 참조를 검색하세요. 만약 using 문이 더 이상 종속성 트리에 존재하지 않는 네임스페이스를 참조한다면, 컴파일러는 이를 플래그 처리할 것입니다. 하지만 이는 dotnet remove package 명령이 실제로 실행된 경우에만 해당됩니다.

grep -rn "using Docnet\|using SixLabors\|using SkiaSharp" --include="*.cs" .
SHELL

식별된 파일의 참조를 제거한 후 SaveBgraAsPng, ApplyGrayscale, ApplyThreshold 및 유사한 전처리 헬퍼 메서드를 삭제하세요. 이는 이전 파이프라인에서 사용되었습니다.

이슈 5: 마이그레이션 후 Docker 이미지 크기 증가

TesseractOCR: 일부 Docker 구성에서는 시스템 패키지로 apt-get install tesseract-ocr tesseract-ocr-eng를 통해 Tesseract를 설치한 후 해당 시스템 바이너리를 참조합니다. 이는 언어 팩에 따라 이미지에 약 30~80MB가 추가됩니다.

해결책: IronOCR은 NuGet 패키지 내에 자체 Tesseract 바이너리를 포함하고 있습니다. Dockerfile 내 apt-get install tesseract-ocr 라인은 더 이상 필요하지 않으며 제거해야 합니다. 언어 팩은 apt-get install tesseract-ocr-fra에서가 아닌 NuGet에서 제공됩니다. Docker 배포 가이드는 검증된 기본 이미지 구성과 IronOCR이 컨테이너에서 실행되는 데 필요한 정확한 패키지 목록을 제공합니다.

# Remove these lines after migration:
# RUN apt-get install -y tesseract-ocr tesseract-ocr-eng tesseract-ocr-fra
# COPY ./tessdata /app/tessdata
Text

이슈 6: TesseractExceptionDllNotFoundException catch 블록이 도달 불가능하게 됩니다

TesseractOCR: 프로덕션 테서랙트OCR 통합은 TesseractOCR.Exceptions.TesseractException, 결여된 네이티브 바이너리에 대한 DllNotFoundException 및 아키텍처 불일치에 대한 BadImageFormatException을 캡처합니다. 이러한 예외 유형은 tessdata 및 네이티브 바이너리 배포의 불안정성에 대한 방어적 대응입니다.

해결책: IronOCR은 네이티브 종속성을 번들로 제공하며 초기화를 내부적으로 관리합니다. DllNotFoundExceptionBadImageFormatException은 적용되지 않습니다. 해당 catch 블록을 제거해 주세요. 예외 표면은 OCR 실패에 대한 IronOcr.Exceptions.OcrException 및 파일 접근 문제에 대한 표준 IOException으로 줄어듭니다.

// Before: five exception types to handle
catch (TesseractOCR.Exceptions.TesseractException ex) { ... }
catch (DllNotFoundException ex) { ... }
catch (BadImageFormatException ex) { ... }
catch (OutOfMemoryException ex) { ... }

// After: two exception types
catch (IronOcr.Exceptions.OcrException ex) { ... }
catch (IOException ex) { ... }
C#

테서랙트OCR 마이그레이션 체크리스트

사전 마이그레이션

코드베이스 내 모든 테서랙트OCR 사용 지점을 검토하십시오:

grep -rn "using TesseractOCR" --include="*.cs" .
grep -rn "new Engine(" --include="*.cs" .
grep -rn "Pix\.Image\.LoadFromFile\|engine\.Process\|page\.Text\|MeanConfidence" --include="*.cs" .
grep -rn "Language\." --include="*.cs" .
SHELL

제거될 모든 지원 인프라를 식별하십시오:

grep -rn "using Docnet\|using SixLabors\|GetTempFileName\|SaveBgraAsPng" --include="*.cs" .
grep -rn "tessdata" --include="*.cs" .
grep -rn "tessdata" --include="*.csproj" .
grep -rn "tessdata" Dockerfile 2>/dev/null || true
SHELL

마이그레이션 전 대표 문서 샘플을 대상으로 현재 정확도 기준을 문서화하여, 마이그레이션 후 품질을 검증할 수 있도록 해야 합니다.

코드 마이그레이션

  1. dotnet remove package TesseractOCR 실행
  2. dotnet remove package Docnet.Core 실행 (있다면)
  3. dotnet remove package SixLabors.ImageSharp 실행 (전처리를 위해 추가된 경우)
  4. dotnet add package IronOcr 실행
  5. 애플리케이션 시작 시 IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY" 추가
  6. using TesseractOCRusing TesseractOCR.Enumsusing IronOcr으로 대체
  7. new Engine(tessDataPath, Language.English, EngineMode.Default)new IronTesseract()으로 대체
  8. TesseractOCR.Pix.Image.LoadFromFile(path)input.LoadImage(path)으로 OcrInput 인스턴스에서 대체
  9. engine.Process(pixImage)ocr.Read(input)으로 대체
  10. page.Textresult.Text으로 대체
  11. 신뢰도 임계값 비교 업데이트 —IronOCR 0–100 척도에 맞춰 0.0–1.0 사이의 모든 값에 100을 곱합니다.
  12. Language.X를 | Language.YwithOcrLanguage.X + OcrLanguage.Y`
  13. 모든 전처리 헬퍼 메서드 삭제 (SaveBgraAsPng, 수동 필터 체인, 임시 파일 로직)
  14. Docnet PDF 렌더링 루프를 input.LoadPdf(path) 또는 input.LoadPdfPages(path, start, end)으로 대체
  15. 다중 프레임 TIFF 루프를 input.LoadImageFrames(tiffPath)으로 대체
  16. File.WriteAllBytes(tempPath, bytes) + LoadFromFile(tempPath)input.LoadImage(bytes)으로 대체
  17. catch 블록 업데이트 — TesseractException, DllNotFoundException, BadImageFormatException 제거
  18. 프로젝트 출력 디렉터리 구성 및 Docker 이미지에서 tessdata 폴더를 제거하십시오.

마이그레이션 이후

  • dotnet build이 0개의 컴파일러 오류와 도달 불가능한 catch 경고를 생성하지 않는지 확인
  • 마이그레이션 전 정확도 기준 샘플에 대해 OCR을 실행하고 결과를 비교하십시오
  • 여러 페이지로 구성된 TIFF 파일을 처리할 때 추출된 페이지 수가 정확한지 확인하십시오
  • 검색 가능한 PDF 출력 파일이 텍스트 선택이 가능한 PDF 뷰어에서 열리는지 확인하십시오
  • 애플리케이션의 실제 데이터 소스에서 바이트 배열 및 스트림 입력 경로를 테스트합니다
  • WORD별 신뢰도 값이 0–100 범위(0.0–1.0이 아님)에 있는지 확인하십시오.
  • 병렬 처리 테스트를 실행하여 스레드별 엔진 할당 경고가 발생하지 않는지 확인하십시오
  • 대상 환경 (Docker, Azure, Linux)에 배포하고 IronOCR가 DllNotFoundException 없이 초기화되는지 확인
  • 배포 스크립트 어디에서도 tessdata 폴더나 .traineddata 파일이 참조되지 않는지 확인

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

전처리가 100줄의 종속성이 아닌 한 줄의 설정이 됩니다. 마이그레이션 후, input.Deskew(), input.DeNoise(), input.Contrast()은 외부 이미징 라이브러리, 수동 매개변수 튜닝 및 두 개를 연결하는 임시 파일 쓰기를 대체합니다. 휴대폰으로 찍은 사진, 비뚤어진 스캔본, 대비가 낮은 팩스 등, 이전에는 전담 전처리 엔지니어가 필요했던 문서 유형들도 내장된 파이프라인을 통해 안정적인 결과물을 생성합니다. 전처리 기능 페이지에는 사용 가능한 모든 필터가 나열되어 있습니다.

PDF는 일류 입력 및 출력 형식입니다. Docnet 종속성, BGRA-to-PNG 변환 헬퍼, 임시 파일 관리 루프, 암호로 보호된 파일을 위한 세 번째 라이브러리 등 모든 것이 사라집니다. 시스템에 도착하는 모든 PDF는 즉시 input.LoadPdf()으로 들어갑니다. 검색 가능해야 하는 모든 스캔된 문서는 result.SaveAsSearchablePdf()을 통해 나갑니다. TesseractOCR에서는 100줄 이상의 코드가 필요했던 전체 PDF 처리 과정이 이제 몇 번의 메서드 호출만으로 가능해집니다. 지원되는 모든 PDF 워크플로를 확인하려면 PDF OCR 사용 사례 페이지를 살펴보세요.

구조화된 출력이 평면 텍스트 문자열을 대체합니다. result.Pages, result.Paragraphs, result.Linesresult.Words은 요소별 좌표 및 단어별 신뢰도 점수와 함께 문서 구조를 노출합니다. 이전에는 인보이스 번호, 날짜, 금액과 같은 특정 필드를 찾기 위해 파싱 휴리스틱을 사용해야 했던 워크플로에서, 이제는 WORD 단위 좌표와 신뢰도 필터링을 대신 사용할 수 있습니다. 이는 IronOCR의 OCR 결과 기능을 기반으로 신뢰할 수 있는 양식 추출 및 문서 처리 파이프라인을 구축하기 위한 토대입니다.

배포가 tessdata 조율을 요구하지 않게 됩니다. tessdata 폴더, curl 다운로드 스크립트, Docker COPY ./tessdata 레이어, .traineddata 파일을 위한 CI/CD 캐시 설정 — 이 모든 것이 사라집니다. 이 라이브러리는 NuGet 패키지로 제공되며, 버전 관리가 이루어지고 프로젝트의 다른 종속성과 함께 복원되며, 대상 환경이 개발자 워크스테이션, Docker 컨테이너, Azure App Service 또는 AWS Lambda인 경우에도 동일하게 배포됩니다. Azure 배포 가이드Linux 배포 가이드는 프로덕션 환경을 위한 검증된 구성을 제공합니다.

라이선스 모델은 명확합니다. TesseractOCR은 무료이지만, 이를 구동하는 데 필요한 인프라 비용은 발생합니다. 즉, 전처리 구현, PDF 라이브러리 평가, tessdata 배포 스크립팅, 그리고 외부 종속성 체인의 지속적인 유지보수에 소요되는 개발자 시간이 포함됩니다. IronOCR의 영구 라이선스 ($999 Lite, 1,499달러 Professional, 2,999달러 Enterprise)는 인프라 작업 몇 주를 대체하고 반복되는 유지관리 표면을 제거하는 일회성 비용입니다. 단일 자원봉사 유지보수자의 GitHub 이슈 큐에 의존하는 대신, 응답 경로가 보장되는 유료 지원 서비스를 제공합니다.

참고해 주세요: PDFium, PDFSharp, Tesseract 및 iText는 각 소유자의 등록 상표입니다. 이 사이트는 Chromium Project, Google, empira Software GmbH 또는 iText Group과 제휴되어 있거나, 그들의 승인을 받았거나, 후원을 받고 있지 않습니다. 모든 제품 이름, 로고 및 브랜드는 해당 소유자의 자산입니다. 비교는 정보 제공 목적으로만 사용되며, 작성 시점에 공개적으로 이용 가능한 정보를 반영합니다.

관련 기사

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일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.