IRONSOFTWAREHOME
동영상

테서랙트에서 IronOCR로 마이그레이션하기

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

이 가이드는 charlesw Tesseract NuGet 패키지에서 IronOCR로 직접 마이그레이션 경로를 제공합니다. tessdata 폴더 관리를 제거하고, TesseractEnginePix 초기화 패턴을 대체하고, 내장 전처리 파이프라인을 추가하고, 네이티브 PDF 지원을 잠금 해제하는 데 필요한 구체적인 단계를 다룹니다 - 이 라이브러리의 비교 기사에서 이미 조사된 자료를 중복하지 않고.

Tesseract에서 전환해야 하는 이유

charlesw Tesseract 패키지는 진정한 OCR 기능을 제공하며, NuGet 다운로드 800만 회가 이를 증명합니다. 문제는 엔진에 있는 것이 아닙니다. 프로덕션급 결과물을 출시하기 전에 엔진 주위에 구축해야 하는 인프라에 있습니다. 대부분의 마이그레이션 결정은 네 가지 구체적인 문제점을 해결하기 위해 이루어집니다.

Tessdata 폴더 관리가 모든 환경에 복합됩니다. 단어를 인식하기 전에 tessdata 경로가 존재해야 하며, 애플리케이션이 필요한 모든 언어에 맞는 올바른 .traineddata 파일들로 채워져야 하며, TesseractEngine에 전달된 정확한 경로에서 접근 가능해야 합니다. 즉, 개발용 머신, CI 빌드, 스테이징 서버, 프로덕션 호스트 및 Docker 컨테이너를 위해 별도의 폴더를 설정해야 합니다. 파일이 없으면 배포 후 런타임에 TesseractException: Failed to initialise tesseract engine을(를) 던지며, 메시지는 항상 어떤 파일이 없는지를 식별하지 않습니다. 새로운 환경이 생길 때마다 이러한 실패가 반복될 가능성이 있습니다.

Tesseract 4.1.1이 마지막 버전입니다. charlesw 래퍼는 2019년에 출시된 Tesseract 4.1.1에 고정되어 있습니다. Tesseract 5.x는 특정 문서 유형에서 측정 가능한 수준의 정확도 향상을 가져오는 LSTM 모델 개선 사항을 도입했습니다. 해당 버전은 이 패키지를 통해 사용할 수 없으며, 2021년 이후 래퍼의 유지보수 주기는 상당히 느려졌습니다. 현재 Tesseract 릴리스와 동등한 정확도를 중요하게 생각하는 팀들은 charlesw 래퍼를 통해 업그레이드할 수 있는 경로가 없습니다.

전처리 과정이 없으므로 실제 문서에 대한 신뢰도가 떨어집니다. Tesseract는 깨끗하고 고해상도이며 방향이 올바른 입력 데이터를 기대합니다. 이 번역은 기울기, 노이즈, 낮은 DPI 또는 색상 배경에 대해 내장된 보정 기능을 적용하지 않습니다. 그레이스케일 변환, 대조 향상, 이진화, 중간 노이즈 필터링, 평면화 등 수동으로 전처리 파이프라인을 구축하면 System.Drawing.Common를 사용하여 약 180줄의 코드가 필요하거나 올바른 호프 변형 평면화를 위해 OpenCvSharp4를 끌어옵니다(Windows 전용). 이후 새로운 문서 소스가 도입되면서 발생하는 예외적인 경우를 처리하기 위해 해당 파이프라인을 지속적으로 유지 관리해야 합니다.

PDF는 별도의 의존성 체인을 필요로 하는 부수적인 요소입니다. 계약서, 청구서, 은행 거래 내역서 및 규정 준수 문서는 PDF 형식으로 제공됩니다. Tesseract는 PDF 파일을 열 수 없습니다. 이 간극을 메우려면 별도의 PDF 렌더링 라이브러리(PdfiumViewer, PDFtoImage 또는 Docnet.Core)가 필요하며, 각 라이브러리마다 고유한 네이티브 바이너리, 플랫폼별 배포 단계 및 라이선스 고려 사항이 있습니다. GhostScript는 AGPL 라이선스와 관련된 사항을 포함합니다. 비밀번호로 보호된 PDF 파일은 또 다른 라이브러리를 추가합니다. 여러 환경에 걸쳐 세 개의 별도 네이티브 종속성 체인을 관리하는 팀은 유지 관리의 한계점에 도달하게 되며, 이로 인해 단일 패키지 대안을 직접 검토하게 됩니다.

스레드 안전하지 않은 엔진 설계로 병렬 처리 속도가 제한됩니다. TesseractEngine 인스턴스는 스레드 간에 공유할 수 없습니다. 표준 병렬 처리 패턴은 스레드당 하나의 엔진을 생성하며, 인스턴스당 40~100MB의 언어 모델 데이터를 로드합니다. 8개의 병렬 스레드는 문서 처리 전에 320-800 MB의 엔진 초기화 오버헤드를 의미합니다. 이는 버그가 아닙니다. 스레드 안전하지 않은 API의 의도된 사용 방식입니다. 하지만 메모리 소모는 실제로 발생하며, 배치 크기가 커질수록 누적됩니다.

근본적인 문제

모든 Tesseract 애플리케이션은 동일한 방식으로 시작됩니다. 즉, 애플리케이션이 실행되는 모든 컴퓨터에서 올바른 tessdata 경로를 지정해야 합니다.

Tesseract 접근 방식:

// TessDataPath must exist and be populated — breaks on first clean deployment
private const string TessDataPath = @"./tessdata";

public static string ExtractText(string imagePath)
{
    // Runtime failure if eng.traineddata is missing from TessDataPath
    if (!Directory.Exists(TessDataPath))
        throw new DirectoryNotFoundException(
            $"Tessdata not found at {TessDataPath}. " +
            "Download from https://github.com/tesseract-ocr/tessdata");

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img   = Pix.LoadFromFile(imagePath);  // Leptonica Pix object
    using var page  = engine.Process(img);
    return page.GetText();
}
C#

IronOCR 접근 방식:

// No tessdata folder. No path. No file check. Just OCR.
var text = new IronTesseract().Read("document.jpg").Text;
C#

TessDataPath 상수, Directory.Exists 보호, Pix 객체 및 3단계 using 중첩이 사라집니다. 언어 데이터는 NuGet 패키지에 포함되어 있습니다.

##IronOCR대 Tesseract: 기능 비교

다음 표는 마이그레이션 결정 시 가장 중요한 기능을 다루고 있습니다.

기능테서랙트(찰스위)IronOCR
NuGet 패키지TesseractIronOcr
테서랙트 엔진 버전4.1.1 (2019, 고정)최적화된 Tesseract 5.x
테스데이터 관리매뉴얼 폴더 + 파일 다운로드번들 제공 — 별도 설정 불필요
언어 팩수동 .traineddata 다운로드언어별 NuGet 패키지
지원 언어100개 이상 (수동)125+ (NuGet)
다국어 동시"eng+fra+deu" 문자열OcrLanguage.French + OcrLanguage.German
이미지 전처리매뉴얼 (~180줄)내장된 한 줄 메서드
디스큐매뉴얼 (호프 변환 필요)input.Deskew()
디노이즈매뉴얼 (중앙값 필터)input.DeNoise()
대비 / 이진화수동 픽셀 반복input.Contrast(), input.Binarize()
심층 노이즈 제거사용 불가input.DeepCleanBackgroundNoise()
PDF 입력없음 — 외부 라이브러리 필요원어(스캔본, 디지털, 혼합)
비밀번호로 보호된 PDF복호화 라이브러리가 필요합니다.input.LoadPdf(path, Password: "...")
여러 페이지로 구성된 TIFF 파일수동 프레임 반복input.LoadImageFrames()
검색 가능한 PDF 출력지원되지 않음result.SaveAsSearchablePdf()
구조화된 결과 액세스ResultIterator 루프result.Pages, .Paragraphs, .Words
스레드 안전성스레드 안전하지 않음스레드 안전 단일 인스턴스
바코드 판독지원되지 않음ocr.Configuration.ReadBarCodes = true
크로스 플랫폼플랫폼별 필수 네이티브 DLL단일 NuGet, 모든 플랫폼 지원
Docker 배포apt-get + tessdata 복사 단계추가 조치 없음
라이선스Apache 2.0 (무료)영구 ($999 Lite / $1,499 Pro / $2,999 Enterprise)
상업적 지원커뮤니티만예 (이메일 + 우선순위 등급)

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

1단계: NuGet 패키지 교체

charlesw Tesseract 래퍼 제거:

dotnet remove package Tesseract
SHELL

NuGet 에서IronOCR설치하세요.

dotnet add package IronOcr

언어 팩은 필요할 때 별도의 패키지로 설치됩니다:

dotnet add package IronOcr.Languages.French, IronOcr.Languages.German

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

Tesseract 네임스페이스를IronOCR네임스페이스로 교체하세요:

// Before
using Tesseract;

// After
using IronOcr;
C#

단계 3: 라이선스 초기화

애플리케이션 시작 시, 어떤 IronTesseract 호출 전에 라이선스 초기화를 한 번 추가하십시오.

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

개발 단계에서는 키 없이 무료 체험판을 사용할 수 있습니다. 프로덕션 배포에는 라이선스 페이지에서 발급받은 유효한 키가 필요합니다.

코드 마이그레이션 예제

Tessdata 경로 제거 및 엔진 초기화

가장 즉각적인 변화는 TesseractEngine 초기화 및 그것을 둘러싼 모든 tessdata 유효성 검사 코드를 제거하는 것입니다.

Tesseract 접근 방식:

// Every class that uses OCR must handle this initialization block
private const string TessDataPath = @"./tessdata";

public string RecognizeInvoiceNumber(string imagePath)
{
    // Check tessdata presence — missing file = silent runtime failure
    foreach (var lang in new[] { "eng" })
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
            throw new FileNotFoundException(
                $"Missing {lang}.traineddata. " +
                "Download from https://github.com/tesseract-ocr/tessdata");
    }

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);

    // Pix is a Leptonica wrapper type — not a standard .NET image
    using var img  = Pix.LoadFromFile(imagePath);
    using var page = engine.Process(img);

    string text = page.GetText();
    float  conf = page.GetMeanConfidence();

    return conf > 0.7f ? text : string.Empty;
}
C#

IronOCR 접근 방식:

using IronOcr;

public string RecognizeInvoiceNumber(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);

    // Confidence property returns 0-100 double
    return result.Confidence > 70 ? result.Text : string.Empty;
}
C#

FileNotFoundException 보호, tessdata 상수, Pix 객체 및 3단계 중첩이 사라졌습니다. 언어 데이터가 포함되어 있기 때문에 IronTesseract은 인자 없이 구성됩니다. 기본 설정과 다른 동작이 필요한 경우 IronTesseract 설정 가이드에서 구성 옵션을 확인하시고, 전체 신뢰도 API에 대해서는 신뢰도 점수 가이드를 참조하십시오.

전처리 파이프라인을 활용한 다중 페이지 TIFF 처리

스캔된 문서 아카이브나 팩스 시스템에서 흔히 볼 수 있는 다중 프레임 TIFF 파일은 Tesseract를 사용하여 명시적으로 프레임을 순차 처리해야 합니다. IronOCR은 한 번의 호출로 모든 프레임을 불러오고 전처리 파이프라인을 일관되게 적용합니다.

Tesseract 접근 방식:

using Tesseract;
using System.Drawing;
using System.Drawing.Imaging;

private const string TessDataPath = @"./tessdata";

public static string ExtractFromMultiPageTiff(string tiffPath)
{
    var allText = new System.Text.StringBuilder();

    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var tiffImage = Image.FromFile(tiffPath);

    int frameCount = tiffImage.GetFrameCount(FrameDimension.Page);

    for (int i = 0; i < frameCount; i++)
    {
        tiffImage.SelectActiveFrame(FrameDimension.Page, i);

        // Must save each frame to disk — Pix.LoadFromFile requires a path
        string tempPath = Path.GetTempFileName() + ".png";
        try
        {
            tiffImage.Save(tempPath, ImageFormat.Png);

            using var img  = Pix.LoadFromFile(tempPath);
            using var page = engine.Process(img);
            allText.AppendLine(page.GetText());
        }
        finally
        {
            File.Delete(tempPath); // Uncleaned temp files fill disk on failure
        }
    }

    return allText.ToString();
}
C#

IronOCR 접근 방식:

using IronOcr;

public static string ExtractFromMultiPageTiff(string tiffPath)
{
    using var input = new OcrInput();
    input.LoadImageFrames(tiffPath);  // Loads all frames at once
    input.Deskew();                   // Applied to every frame uniformly
    input.DeNoise();

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

프레임 반복 없음. 임시 파일 생성 없음. 정리 로직은 포함하지 마십시오. 전처리 파이프라인은 별도의 루프 없이 모든 프레임에 적용됩니다. TIFF 및 GIF 입력 가이드에서는 대용량 아카이브 파일의 선택적 프레임 범위 처리를 포함하여 다중 프레임 처리에 대해 상세히 설명합니다.

검색 가능한 PDF 생성

스캔된 PDF를 검색 가능한 PDF로 변환하려면 Tesseract가 (외부 PDF 라이브러리를 통해) 각 페이지를 이미지로 렌더링하고, OCR을 실행한 다음, 텍스트 레이어가 포함된 PDF를 재구성해야 합니다. 이는 여러 라이브러리를 사용하는 다단계 프로세스입니다. IronOCR은 입력, OCR, 출력을 단일 파이프라인에서 처리합니다.

Tesseract 접근 방식:

// Requires: PdfiumViewer + Tesseract + a PDF writer library (iText, PdfSharp)
// Each library adds its own native dependencies and license considerations

using Tesseract;
// using PdfiumViewer;  // Comment: must add NuGet + deploy native pdfium.dll
// using iText.Kernel.Pdf;  // Comment: AGPL or commercial license required

private const string TessDataPath = @"./tessdata";

public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    // Step 1: Render PDF pages to images (requires PdfiumViewer)
    // Step 2: Run OCR on each image (Tesseract)
    // Step 3: Write text positions back into PDF (requires iText or PDFsharp)
    //
    // Total: ~150 lines across three libraries
    // Native binaries required: tesseract*.dll, leptonica*.dll, pdfium.dll
    // License risk: iText is AGPL unless you purchase a commercial license

    throw new NotImplementedException(
        "Requires PdfiumViewer + Tesseract + a PDF writer. " +
        "No single-package solution exists with this stack.");
}
C#

IronOCR 접근 방식:

using IronOcr;

public static void CreateSearchablePdf(string inputPdfPath, string outputPdfPath)
{
    using var input = new OcrInput();
    input.LoadPdf(inputPdfPath);
    input.Deskew();    // Correct scanned page skew before OCR
    input.DeNoise();   // Remove scanner artifacts

    var result = new IronTesseract().Read(input);
    result.SaveAsSearchablePdf(outputPdfPath);
}
C#

단 하나의 메서드 호출만으로 텍스트 레이어가 포함된 검색 가능한 PDF를 생성합니다. 외부 PDF 라이브러리 없음, 네이티브 pdfium 바이너리 없음, AGPL 종속성으로 인한 라이선스 문제 없음. 검색 가능한 PDF 사용 안내서에는 출력 형식이 설명되어 있으며, PDF OCR 예제에서는 스캔된 문서의 전체 처리 과정을 단계별로 안내합니다. IronOCR이 PDF 입력 데이터를 어떻게 처리할 수 있는지에 대한 더 넓은 맥락을 파악하려면, PDF OCR 사용 사례 페이지에서 생산 환경 아키텍처 패턴을 확인하시기 바랍니다.

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

Tesseract는 ResultIterator를 통해 단어 수준 데이터를 노출하여 수동 경계 상자 추출이 필요한 do/while 루프를 요구합니다. IronOCR은 문서 계층 구조(페이지, 단락, 줄, WORD)를 좌표가 미리 채워진 강타입 컬렉션으로 노출합니다.

Tesseract 접근 방식:

using Tesseract;

private const string TessDataPath = @"./tessdata";

public static void ExtractStructuredData(string imagePath)
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img    = Pix.LoadFromFile(imagePath);
    using var page   = engine.Process(img);
    using var iter   = page.GetIterator();

    iter.Begin();
    do
    {
        if (iter.IsAtBeginningOf(PageIteratorLevel.Para))
            Console.WriteLine("-- New Paragraph --");

        if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
        {
            string word       = iter.GetText(PageIteratorLevel.Word);
            float  confidence = iter.GetConfidence(PageIteratorLevel.Word);
            Console.WriteLine(
                $"Word: '{word?.Trim()}' " +
                $"at ({bounds.X1},{bounds.Y1})-({bounds.X2},{bounds.Y2}) " +
                $"conf={confidence:P0}");
        }
    }
    while (iter.Next(PageIteratorLevel.Word));
}
C#

IronOCR 접근 방식:

using IronOcr;

public static void ExtractStructuredData(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);

    foreach (var page in result.Pages)
    {
        Console.WriteLine($"Page {page.PageNumber} — confidence: {result.Confidence}%");

        foreach (var paragraph in page.Paragraphs)
        {
            Console.WriteLine($"  Paragraph at ({paragraph.X},{paragraph.Y}):");
            Console.WriteLine($"  {paragraph.Text}");

            foreach (var word in paragraph.Words)
            {
                Console.WriteLine(
                    $"    Word: '{word.Text}' " +
                    $"at ({word.X},{word.Y}) " +
                    $"size {word.Width}x{word.Height} " +
                    $"conf={word.Confidence:P0}");
            }
        }
    }
}
C#

ResultIterator 루프는 완전히 사라집니다. 문서 계층 구조는 열거 가능한 컬렉션 집합으로 구성됩니다. 즉, 반복자 상태가 없으며, 수동 레벨 추적이나 출력 매개변수를 통한 바운딩 박스 추출이 필요하지 않습니다. 각 WORD 객체는 고유한 좌표와 신뢰도를 가지고 있습니다. '읽기 결과 가이드' 문서는 계층 구조의 모든 수준을 다루며, 'OcrResult API 참조'에는 사용 가능한 모든 속성이 나열되어 있습니다.

Tessdata 파일 관리 없이 다국어 OCR

Tesseract 애플리케이션에 언어를 추가하는 것은 .traineddata 파일을 다운로드하고 tessdata 폴더에 배치하고 해당 폴더를 포함한 모든 배포 매니페스트를 업데이트하고 엔진 초기화 문자열을 수정하는 것을 의미합니다. IronOCR의 경우, 단일 NuGet 패키지 참조로 제공됩니다.

Tesseract 접근 방식:

using Tesseract;

private const string TessDataPath = @"./tessdata";

public static string ExtractFromEuropeanDocument(string imagePath)
{
    // Before this call works, these files must exist:
    // ./tessdata/eng.traineddata  (~15 MB, from GitHub)
    // ./tessdata/fra.traineddata  (~15 MB, from GitHub)
    // ./tessdata/deu.traineddata  (~15 MB, from GitHub)
    // ./tessdata/spa.traineddata  (~15 MB, from GitHub)
    // Total: ~60 MB to download, version-match, and deploy to every environment

    foreach (var lang in new[] { "eng", "fra", "deu", "spa" })
    {
        if (!File.Exists(Path.Combine(TessDataPath, $"{lang}.traineddata")))
            throw new FileNotFoundException(
                $"Download {lang}.traineddata from " +
                "https://github.com/tesseract-ocr/tessdata " +
                $"and place in {TessDataPath}");
    }

    // Language string is a concatenation — order affects recognition priority
    using var engine = new TesseractEngine(TessDataPath, "eng+fra+deu+spa", EngineMode.Default);
    using var img    = Pix.LoadFromFile(imagePath);
    using var page   = engine.Process(img);
    return page.GetText();
}
C#

IronOCR 접근 방식:

// Install language packs once per project:
// dotnet add package IronOcr.Languages.French
// dotnet add package IronOcr.Languages.German
// dotnet add package IronOcr.Languages.Spanish
using IronOcr;

public static string ExtractFromEuropeanDocument(string imagePath)
{
    var ocr = new IronTesseract();
    ocr.Language = OcrLanguage.English;
    ocr.AddSecondaryLanguage(OcrLanguage.French);
    ocr.AddSecondaryLanguage(OcrLanguage.German);
    ocr.AddSecondaryLanguage(OcrLanguage.Spanish);

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

tessdata 폴더, 파일 존재 여부 루프, 경로 결합 문자열 및 배포 매니페스트 업데이트는 PackageReference.csproj의 줄로 대체됩니다. Docker에 언어를 추가하는 것은 Dockerfile COPY 단계가 아닌 하나의 추가 dotnet add package를 의미합니다. 다중 언어 가이드는 전체 125개 이상의 언어 카탈로그 및 CJK 문자 세트를 다루며, 언어 색인은 사용 가능한 모든 언어 팩을 나열합니다.

Tesseract API와IronOCR매핑 참조

테서랙트(찰스위)IronOCR
new TesseractEngine(tessDataPath, "eng", EngineMode.Default)new IronTesseract()
Pix.LoadFromFile(path)input.LoadImage(path) 또는 ocr.Read(path)
Pix.LoadFromMemory(bytes)input.LoadImage(bytes)
engine.Process(img)ocr.Read(input)
page.GetText()result.Text
page.GetMeanConfidence()result.Confidence
page.GetHOCRText(0)result.SaveAsHocrFile(path)
engine.Process(img, tessRect)input.LoadImage(path, new CropRectangle(x, y, w, h))
page.GetIterator()result.Pages / result.Paragraphs / result.Words
iter.GetText(PageIteratorLevel.Word)result.Words[i].Text
iter.GetConfidence(PageIteratorLevel.Word)result.Words[i].Confidence
iter.TryGetBoundingBox(PageIteratorLevel.Word, out bounds)word.X, word.Y, word.Width, word.Height
"eng+fra+deu" 언어 문자열ocr.AddSecondaryLanguage(OcrLanguage.French)
Tessdata 폴더 + .traineddata 파일NuGet 언어 패키지 (IronOcr.Languages.French)
해당 사항 없음 — PDF 뷰어 또는 유사 프로그램이 필요합니다.input.LoadPdf(path)
해당 없음 — 암호 해독 라이브러리 필요input.LoadPdf(path, Password: "secret")
해당 없음 — iText 또는 PDFSharp 필요result.SaveAsSearchablePdf(outputPath)
해당 없음 — 수동 System.Drawing 파이프라인input.Deskew(), input.DeNoise(), input.Binarize()
해당 없음 — 스레드별 엔진: Parallel.ForEach모든 스레드에서 공유되는 단일 IronTesseract
해당 없음 — 지원되지 않음ocr.Configuration.ReadBarCodes = true

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

문제 1: 마이그레이션 후에도 Tessdata 경로 참조가 남아 있음

Tesseract: TessDataPath 상수, Directory.Exists(TessDataPath) 보호 및 File.Exists(Path.Combine(TessDataPath, lang + ".traineddata")) 검사가 코드베이스 전체와 프로젝트 파일에 <Content Include="tessdata\**"> 빌드 항목으로 나타납니다.

해결 방법: 모든 발생 위치를 검색하여 tessdata 폴더 자체와 함께 삭제하십시오:

# Find all tessdata references in source
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .
grep -r "tessdata" --include="*.csproj" .
SHELL

경로 상수와 파일 가드(file guards)를 제거한 후, 프로젝트에서 tessdata 폴더를 삭제하십시오. <Content Include="tessdata\**" CopyToOutputDirectory="..." />의 줄을 .csproj 파일에서 제거하십시오. Dockerfile COPY ./tessdata 줄과 ENV TESSDATA_PREFIX 환경 변수 선언도 제거해도 안전합니다.

문제 2: Pix 객체 유형을 확인할 수 없음

Tesseract: PixTesseract 네임스페이스에서 Leptonica 이미지 래퍼 유형입니다. 참조는 변수 선언 (using var img = Pix.LoadFromFile(...)), Pix 매개변수를 수용하는 메서드 서명, 및 Pix.LoadFromMemory()또는 Pix.LoadFromBitmap()를 호출하는 모든 코드에 나타납니다.

해결책: OcrInput 인스턴스에서 Pix.LoadFromFile(path)input.LoadImage(path)로 교체하십시오. Pix.LoadFromMemory(bytes)input.LoadImage(bytes)로 교체하십시오. OcrInput 클래스는 파일 경로, 바이트 배열, 스트림 및 System.Drawing.Bitmap 객체를 직접 수용합니다. 중간 래퍼 유형으로의 변환은 필요하지 않습니다. 허용되는 입력 유형의 전체 목록은 이미지 입력 가이드와 스트림 입력 가이드를 참조하십시오.

문제 3: ResultIterator 루프 패턴에 직접적인 대응 개념이 없음

Tesseract: iter.Begin(), iter.Next(PageIteratorLevel.Word)iter.TryGetBoundingBox()과 함께 ResultIterator를 반복하는 코드는 단어 수준 또는 문자 수준 추출의 표준 패턴입니다. 이 패턴에서는 반복자 상태와 레벨 전환을 수동으로 추적해야 합니다.

해결책: result.Words, result.Pages 또는 적절한 컬렉션 레벨 위의 LINQ로 반복자를 교체하십시오.

// Before: iterator loop
using var iter = page.GetIterator();
iter.Begin();
do
{
    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out var bounds))
    {
        string text = iter.GetText(PageIteratorLevel.Word);
        // process text and bounds
    }
}
while (iter.Next(PageIteratorLevel.Word));

// After: enumerable collection
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
    // word.Text, word.X, word.Y, word.Width, word.Height, word.Confidence
}
C#

단락 수준 접근을 위해 - Tesseract 반복자에 명확한 유추가 없는 - result.Pages[i].Paragraphs를 사용하십시오. 읽기 결과 가이드에는 사용 가능한 모든 레벨이 기록되어 있습니다.

문제 4: PDF 라이브러리 코드는 완전히 제거되어야 합니다

Tesseract: PDF 페이지를 Tesseract에 전달하기 전에 이미지로 변환하는 모든 코드 - PdfiumViewer document.Render() 루프, PDFtoImage Conversion.ToImage() 호출, Docnet.Core GetPageReader() 패턴 또는 GhostScript 프로세스 호출 - 는 Tesseract가 PDF를 열 수 없는 문제를 우회하기 위해 존재합니다. 이러한 클래스, 루프, 임시 파일 패턴 및 네이티브 바이너리 배포는 모두 실제 요구 사항을 뒷받침하는 기반 구조입니다.

해결책: PDF 렌더링 코드를 완전히 삭제하십시오. 전체 렌더 후 OCR 블록을 input.LoadPdf(path)로 교체하십시오:

// Before: ~50-150 lines of PdfiumViewer + Tesseract + temp file management
// After:
using var input = new OcrInput();
input.LoadPdf("document.pdf");
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
C#

.csproj에서 PdfiumViewer, PDFtoImage 및 Docnet.Core 패키지 참조를 제거하십시오. 네이티브 바이너리 배포 (pdfium.dll, GhostScript 실행 파일)을 빌드 스크립트와 Dockerfile에서 제거하십시오. PDF 입력 가이드에는 페이지 범위 선택 및 암호로 보호된 PDF에 대한 내용이 포함되어 있습니다.

이슈 5: 스레드별 병렬 처리 엔진 패턴

Tesseract: 안전한 병렬 OCR의 표준 패턴은 단일 엔진이 스레드 안전하지 않기 때문에 Parallel.ForEach 본체 내부에 새 TesseractEngine을 생성합니다. 이렇게 하면 스레드당 전체 언어 모델이 로드됩니다.

해결책: 반복문 전에 IronTesseract 을 한 번 생성하고 내부에서 참조하십시오:

// Before: engine per thread, 40-100 MB per language model, times thread count
Parallel.ForEach(files, file =>
{
    using var engine = new TesseractEngine(TessDataPath, "eng", EngineMode.Default);
    using var img    = Pix.LoadFromFile(file);
    using var page   = engine.Process(img);
    results[file] = page.GetText();
});

// After: single engine, thread-safe, shared pool
var ocr = new IronTesseract();
Parallel.ForEach(files, file =>
{
    var result = ocr.Read(file);
    results[file] = result.Text;
});
C#

스레드 안전 보장 변경은 또한 각 스레드별 엔진을 제때 릴리스하도록 하기 위해 필요했던 반복문 내부의 using 폐기 패턴을 제거합니다.

문제 6: EngineMode 열거형에 직접적인 매핑이 없음

Tesseract: EngineMode.Default, EngineMode.TesseractOnlyEngineMode.LstmOnly은/는 Tesseract가 레거시 엔진, LSTM 또는 둘 다를 사용할지 선택하기 위해 TesseractEngine 생성자에서 나타납니다. charlesw 래퍼는 Tesseract 4.x가 두 엔진을 모두 유지했기 때문에 이러한 모드를 제공합니다.

해결책: IronOCR은 고정밀도 구성인 Tesseract 5 LSTM 엔진만을 사용합니다. 레거시 엔진으로 되돌아갈 수 있는 옵션이 없기 때문에 EngineMode 매개변수가 존재하지 않습니다. 생성자 호출을 번역할 때 EngineMode 인수를 제거하십시오. 처리량 대비 정확도 조정을 위해 ocr.Configuration.PageSegmentationMode를 사용하고, 속도 최적화 가이드를 참조하십시오.

Tesseract 마이그레이션 체크리스트

사전 마이그레이션

코드베이스에서 Tesseract 및 tessdata에 대한 모든 참조를 검토하십시오:

# Find all using directives for the Tesseract namespace
grep -rn "using Tesseract" --include="*.cs" .

# Find TesseractEngine constructors
grep -rn "TesseractEngine\|TessDataPath\|tessdata" --include="*.cs" .

# Find Pix object usage
grep -rn "Pix\." --include="*.cs" .

# Find ResultIterator usage
grep -rn "GetIterator\|ResultIterator\|PageIteratorLevel" --include="*.cs" .

# Find PDF rendering libraries added for Tesseract
grep -rn "PdfiumViewer\|PDFtoImage\|Docnet\|GhostScript" --include="*.cs" .

# Find tessdata references in project files
grep -rn "tessdata\|traineddata" --include="*.csproj" .

# Find tessdata references in Dockerfiles
grep -rn "tessdata\|TESSDATA_PREFIX\|libtesseract" Dockerfile* .
SHELL

마이그레이션 범위를 추정하기 위한 현황 조사 결과:

  • using Tesseract을(를) 사용하여 몇 개의 클래스가 변경이 필요한지 확인하기 위해 파일 수를 세십시오
  • 사용 중인 PDF 렌더링 라이브러리를 확인하십시오(PdfiumViewer, PDFtoImage, Docnet.Core, GhostScript). -IronOCR언어 NuGet 패키지를 추가하려는 언어를 결정하기 위해 TesseractEngine 생성자 문자열에 어떤 언어가 참조되는지 확인하십시오.

코드 마이그레이션

  1. 모든 .csproj 파일에서 Tesseract NuGet 패키지 참조를 제거하십시오
  2. Tesseract 지원만을 위해 추가된 PDF 렌더링 라이브러리 NuGet 참조(PdfiumViewer, PDFtoImage, Docnet.Core)를 제거하십시오.
  3. IronOcr NuGet 패키지를 설치하십시오
  4. 필요한 언어 NuGet 패키지 (IronOcr.Languages.French 등)를 설치하십시오
  5. 애플리케이션 시작 시 IronOcr.License.LicenseKey = "YOUR-KEY";을 추가하십시오
  6. 모든 영향을 받는 파일의 using Tesseract;using IronOcr;으로 교체하십시오
  7. TessDataPath 상수와 모든 Directory.Exists / File.Exists tessdata 보호를 제거하십시오
  8. new TesseractEngine(...)new IronTesseract()로 교체하십시오
  9. Pix.LoadFromFile(path)input.LoadImage(path)OcrInput 인스턴스에 교체하십시오
  10. Pix.LoadFromMemory(bytes)input.LoadImage(bytes)으로 교체하십시오
  11. engine.Process(img)ocr.Read(input)로 교체하십시오
  12. page.GetText()result.Text로 교체하십시오
  13. page.GetMeanConfidence()result.Confidence로 교체하십시오
  14. ResultIterator 루프를 result.Words 또는 result.Pages[i].Paragraphs에 대한 열거로 교체하십시오
  15. PDF 렌더링 루프를 input.LoadPdf(path)로 교체하십시오 - 렌더링 라이브러리 코드를 완전히 삭제하십시오
  16. "eng+fra+deu" 언어 문자열을 ocr.AddSecondaryLanguage(OcrLanguage.X) 호출로 교체하십시오
  17. tessdata 폴더와 빌드 <Content Include="..."> 프로젝트 항목을 삭제하십시오
  18. 빌드 스크립트 및 Dockerfile에서 네이티브 바이너리 배포 단계 제거 (tessdata COPY, TESSDATA_PREFIX ENV, apt-get libtesseract-dev)

마이그레이션 이후

  • Tesseract 래퍼를 사용하여 개발 시 사용된 것과 동일한 샘플 이미지로 기본 텍스트 추출 기능을 확인하십시오.
  • 신뢰도 점수가 적절한지 확인하십시오(일반 문서의 경우 70% 이상, 고품질 스캔 문서의 경우 85% 이상).
  • 다중 페이지 TIFF 입력이 result.Pages에서 올바른 페이지 수를 생성하는지 테스트하십시오
  • PdfiumViewer나 외부 라이브러리 없이도 스캔된 PDF를 읽을 수 있는지 확인하십시오.
  • input.LoadPdf(path, Password: "...")을 사용하여 암호로 보호된 PDF 읽기 테스트를 알려진 암호화된 파일에 대해 수행하십시오
  • 검색 가능한 PDF 출력 파일이 Adobe Reader에서 열리고 텍스트 검색을 지원하는지 확인하십시오
  • 병렬 처리 테스트: IronTesseract 인스턴스를 Parallel.ForEach 루프 전에 하나 생성하고 스레드 안전 예외가 없는지 확인하십시오
  • 각 언어 팩이 대상 언어 문서 세트에 대해 올바른 출력을 생성하는지 확인하십시오
  • COPY tessdataapt-get libtesseract-dev 없이 Docker 빌드를 실행하십시오 - 컨테이너가 시작되고 문서를 처리하는지 확인하십시오
  • 게시된 출력 디렉터리에 tessdata 폴더와 네이티브 DLL 파일이 없는지 확인하십시오.
  • 네이티브 바이너리 참조를 제거한 후에 TesseractException 또는 System.DllNotFoundException가 로그에 나타나지 않는지 확인하십시오

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

배포가 단일 패키지로 줄어듭니다. Tessdata 폴더, 플랫폼별 네이티브 라이브러리 (tesseract50.dll, leptonica-1.82.0.dll, libtesseract.so.5) 및 모든 PDF 렌더링 네이티브 바이너리가 배포 아티팩트에서 사라집니다. 새로운 환경(Linux 컨테이너, AWS Lambda 함수, macOS 개발자용 컴퓨터 등)을 추가할 때 플랫폼별 별도의 설정 단계가 필요하지 않습니다. Docker 배포 가이드와 Linux 배포 가이드에는 Install-Package, 라이선스 키 추가, 실행 순서의 프로세스가 명시되어 있습니다. apt-get, COPY, 환경 변수는 사용하지 마십시오.

언어 추가에 몇 초가 걸립니다, 몇 분이 아닙니다. 스페인어 OCR 지원 추가가 '다운로드 spa.traineddata, tessdata 폴더에 배치, 배포 매니페스트 업데이트, 엔진 생성자에서 경로 확인'에서 dotnet add package IronOcr.Languages.Spanishocr.AddSecondaryLanguage(OcrLanguage.Spanish)으로 변환됩니다. 두 단계의 절차는 모든 플랫폼에서 동일하게 적용됩니다. 다국적 문서 처리 워크플로에서 흔히 볼 수 있는 10개 이상의 언어를 지원하는 팀은 지속적인 유지 관리에 소요되던 시간을 단 몇 분의 일회성 설정으로 단축할 수 있습니다. 언어 색인에서 전체 카탈로그를 확인해 보세요.

PDF 워크플로에는 외부 라이브러리가 필요하지 않습니다. PdfiumViewer 네이티브 바이너리를 배포 및 유지 관리하고, 32/64비트 환경에 맞춰 pdfium.dll의 비트 수를 관리하며, GhostScript의 AGPL 라이선스 관련 사항을 처리하고, 페이지별 렌더링 루프를 작성해야 하는 번거로움이 사라집니다. input.LoadPdf()은 스캔된 PDF, 디지털 PDF, 혼합 콘텐츠 PDF 및 암호로 보호된 PDF를 네이티브로 읽습니다. result.SaveAsSearchablePdf()는 2차 라이브러리를 연계하지 않고 검색 가능한 출력을 생성합니다. 스캔된 PDF를 불러오고, 기울기를 보정하고 노이즈를 제거하며, OCR을 수행하고, 검색 가능한 결과물을 저장하는 전체 프로세스를 수행하는 데 10줄 미만의 코드만 필요합니다. 프로덕션 파이프라인 패턴에 대해서는 검색 가능한 PDF 블로그 게시물을 참조하십시오.

전처리가 당신에 의해 구축되는 것이 아니라 내장됩니다. 약 180줄의 수동 전처리 코드 - 그레이스케일 색상 행렬, 픽셀 반복 대조 강화, 중간 필터 노이즈 제거, Hough 변형 평면화, DPI 크기 조정 - 는 일련의 한 줄 메서드 호출로 변환됩니다: input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize(). 대부분의 실제 문서에서 기본 읽기 방식은 명시적인 필터 호출 없이 지능적인 자동 전처리 기능을 적용합니다. 이미지 품질 보정 가이드이미지 필터 튜토리얼은 전체 필터 목록을 다룹니다.

Tesseract 5의 정확도 데이터가 즉시 이용 가능합니다. charlesw 래퍼는 Tesseract 4.1.1 버전에 고정되어 있습니다. IronOCR은 별도의 조치 없이도 최적화된 Tesseract 5 LSTM 엔진을 제공합니다. 저해상도 스캔본, 팩스, 수기 작성 양식 등 처리하기 어려운 문서 유형에서 정확도 저하를 경험한 팀은 패키지를 전환하는 즉시 Tesseract 5의 개선된 기능을 활용할 수 있습니다. 정확도 차이는 LSTM 인식이 기존 엔진보다 우수한 문서에서 가장 두드러지며, 이는 실제 OCR 작업 부하의 대부분을 차지합니다.

상업적 지원은 커뮤니티 문제 해결을 대체합니다. charlesw 래퍼는 커뮤니티에서 유지 관리하는 오픈 소스 프로젝트로, 응답 시간 보장이나 SLA가 없습니다. IronOCR은 이메일 지원, 상위 요금제 대상 우선 지원, 정기적인 .NET 호환성 업데이트가 제공되는 상용 유지보수 코드베이스를 제공합니다. 문서 처리 파이프라인에 대한 운영 SLA를 보유한 팀의 경우, 해당 지원 모델이 중요합니다. IronOCR 제품 페이지와 문서 허브에서는 전체 기능 세트와 배포 옵션을 다루고 있습니다.

참고해 주세요: Ghostscript, PDFium, PDFSharp, Tesseract, 및 iText는 각각의 소유자의 등록 상표입니다. 이 사이트는 Artifex Software, 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일 무료 체험판 키를 받으세요.
신용카드나 계정 생성은 필요하지 않습니다.