IRONSOFTWAREHOME
동영상

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

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

이 가이드는 스캔된 문서와 PDF에서 텍스트를 추출해야 하는 .NET 개발자를 위해 Syncfusion OCRProcessor에서IronOCR for .NET로의 완전한 마이그레이션 과정을 안내합니다. 특정 구성 변경, 코드 재작성, 배포 클린업에 대한 요구 사항을 다루며, Syncfusion.PDF.OCR.Net.CoreIronOcr NuGet 패키지로 대체하기 위한 내용으로, 특히 모든 Syncfusion OCR배포가 필요로 하는 tessdata 파일 관리 및 Tesseract 바이너리 경로 구성을 제거하는 데 중점을 둡니다.

Syncfusion OCR에서 마이그레이션해야 하는 이유

Syncfusion OCR은 1,600개 구성 요소로 이루어진 Suite에 내장된 Tesseract 래퍼입니다. 텍스트 추출만이 유일한 요구 사항인 팀의 경우, 이러한 아키텍처는 설정, 배포, 유지 관리, 라이선싱 등 모든 단계에서 번거로움을 야기합니다.

tessdata 폴더는 모든 환경을 따릅니다. 모든 개발자 워크스테이션, CI 러너, 스테이징 서버, 프로덕션 컨테이너에는 응용 프로그램이 사용하는 각 언어에 대한 .traineddata 파일을 포함하는 tessdata 디렉토리가 필요합니다. 영어 원문만으로도 표준 모델의 경우 23MB, 최상의 LSTM 모델의 경우 94MB에 달합니다. 5개 언어를 지원하는 애플리케이션은 배포 아티팩트마다 100~500MB의 용량을 추가합니다. 그 폴더는 OCRProcessor 생성자가 기대하는 정확한 경로에 있어야 하며 그렇지 않으면 응용 프로그램은 시작 시 즉시 오류를 발생합니다. 이는 일회성 설정 비용이 아니라 새로운 환경이 배포될 때마다 나타나는 반복적인 운영 비용입니다.

Tesseract 바이너리 경로 구성은 환경이 변경될 때마다 깨짐니다. OCRProcessor 생성자는 모든 대상 플랫폼에서 올바르게 해결되어야 하는 tessdata 디렉토리의 경로가 필요합니다. Windows 개발자 머신에서 작동하는 경로(@"tessdata/")는 배포 파이프라인이 명시적으로 폴더를 복사하지 않으면 Linux 컨테이너에서는 실패합니다. Docker 이미지 빌드는 COPY tessdata/ /app/tessdata/ 레이어를 포함해야 합니다. CI 파이프라인은 tessdata 다운로드를 스크립트로 처리해야 합니다. 에어갭(Air-gapped) 환경에서는 바이너리 파일 배포를 NuGet 패키지 복원과 별도로 관리해야 합니다. 각 환경은 경로 불일치로 인해 OCR 오류가 발생하거나 런타임 예외가 발생할 수 있는 새로운 가능성을 내포하고 있습니다.

PDF 중심 아키텍처는 이미지 입력에 대한 변환 오버헤드를 가합니다. Syncfusion의 OCRProcessor은 이미지 파일이 아니라 PdfLoadedDocument 객체를 허용합니다. JPG에서 텍스트를 추출하려면 PdfDocument을 생성하고, 페이지를 추가하고, 이미지를 그 위에 그리며 저장한 후 MemoryStreamPdfLoadedDocument으로 다시 로드한 다음 OCR을 실행해야 합니다 - 텍스트 인식 단계 전에 아홉 가지 작업이 필요한 것입니다. 이러한 왕복은 모든 이미지 우선 OCR 워크플로우에 대해 실행 오버헤드와 코드 복잡성을 추가합니다.

Suite 라이선스는 성장에 따른 준수 조건을 발생시킵니다. Syncfusion 커뮤니티 라이선스를 적용하려면 개발자 5명 미만, 직원 10명 미만, 연간 매출 100만 달러 미만, 외부 자금 조달 총액 300만 달러 미만이라는 조건을 모두 동시에 충족해야 합니다. 한도를 초과할 경우 라이선스는 즉시 무효화되며, 개발자 1인당 연간 $995–$1,595의 유료 업그레이드가 필요합니다. Syncfusion OCR을 3년 동안 상업적으로 사용해 온 5명의 개발자 팀은IronOCR Professional에서 제공하는 동일한 텍스트 추출 기능을 이용하기 위해 14,925~23,925달러를 지불하는 반면,IronOCR Professional은 일회성 2,999달러에 이용할 수 있습니다.

내장된 전처리 기능이 없으므로 화질이 저하된 스캔 이미지의 경우 외부 의존성이 필요합니다. Tesseract는 전처리 없이 회전되었거나 노이즈가 많거나 명암비가 낮은 이미지에서는 결과가 좋지 않습니다. Syncfusion은 사전 처리 API를 제공하지 않습니다. 기울기 보정, 노이즈 제거 또는 명암 보정이 필요한 개발자는 별도의 이미징 라이브러리(System.Drawing, SkiaSharp, ImageSharp)를 추가하고, 필터를 구현한 후, OCR을 시작하기 전에 출력을 PDF 라운드트립으로 연결해야 합니다. 이는 타사 종속성을 필요로 하며, IronOCR이 내장 메서드로 제공하는 기능을 구현하기 위해 20~40줄의 추가 코드가 필요합니다.

OCR만 필요하지만 전체 Suite가 라이선스되었습니다. Syncfusion은 사용되는 기능과 관계없이 Syncfusion.Pdf.Net.Core, Syncfusion.Compression.Net.Core 및 기타 transitive 종속성을 불러옵니다. 문서 처리 서비스에 특화된 팀에게 있어, 텍스트 추출과 무관한 구성 요소들에 대한 의존성 그래프는 빌드 시간, 컨테이너 이미지 크기, 라이선스 비용 측면에서 상당한 부담을 주게 됩니다.

근본적인 문제

Syncfusion OCR을 사용하려면 OCR 호출을 수행하기 전에 tessdata 파일 시스템 경로를 구성해야 합니다:

// Syncfusion: tessdata path required — fails in any environment where this path is wrong
private const string TessDataPath = @"tessdata/";

using var document = new PdfLoadedDocument("scanned-invoice.pdf");
using var processor = new OCRProcessor(TessDataPath);  // throws if path does not resolve
processor.Settings.Language = Languages.English;
processor.PerformOCR(document);

var text = new StringBuilder();
foreach (PdfLoadedPage page in document.Pages)
    text.AppendLine(page.ExtractText());
C#

IronOCR은 경로 설정이 필요하지 않습니다. 패키지에는 다음 언어 데이터가 포함되어 있습니다:

// IronOCR: no tessdata path, no path configuration, no folder to deploy
var text = new IronTesseract().Read("scanned-invoice.pdf").Text;
C#

IronOCR대 Syncfusion OCR: 기능 비교

아래 표는 Syncfusion OCR에서 마이그레이션하는 팀에게 가장 중요한 기능을 다루고 있습니다.

기능Syncfusion OCRIronOCR
NuGet 패키지Syncfusion.PDF.OCR.Net.Core (Suite)IronOcr (단독 실행)
tessdata 필수예 — 수동 다운로드 및 경로 설정아니요 — 내부적으로 번들됨
직접 이미지 OCR아니요 — PDF 변환을 통한 왕복 작업이 필요합니다예 — LoadImage() 또는 경로를 직접
PDF 직접 OCR예 — 기본 입력 모델예 — 최상의 지원
자동 전처리아니요 - 외부 라이브러리가 필요합니다예 — 기울기 보정, 노이즈 제거, 대비 조정, 이진화
검색 가능한 PDF 출력예 — PerformOCR() 후 저장예 — result.SaveAsSearchablePdf()
지원되는 언어60개 이상 (tessdata 수동 다운로드)NuGet 언어 패키지를 통해 125개 이상
다국어 동시예 — Languages 열거형의 비트 연산 플래그예 — AddSecondaryLanguage()
영역 기반 OCR아니요예 — CropRectangle
바코드 판독아니요예 — ocr.Configuration.ReadBarCodes = true
구조화된 출력페이지에 대해서만 page.ExtractText() 통해좌표가 지정된 페이지, 단락, 줄, 단어, 문자
자신감 점수아니요예 — result.Confidence 및 단어별 점수
hOCR 내보내기아니요
스트림 입력PDF 스트림으로만 제공이미지 및 PDF에 대한 직접 스트림 입력
스레드 안전성스레드 안전성이 문서화되어 있지 않음전체 — 스레드당 하나의 IronTesseract 인스턴스
크로스 플랫폼네 — 하지만 tessdata는 각 플랫폼에서 올바르게 해석되어야 합니다예 — 단일 NuGet 패키지, 경로 구성 불필요
Docker 배포이미지에 tessdata 레이어가 필요합니다단일 패키지, 추가 레이어 없음
라이센스 모델연간 Suite 구독 ($995–$1,595/개발자/년)영구 (Lite $999, Pro $1,499, Enterprise $2,999)
커뮤니티 라이선스 제한 사항감사 권한이 포함된 매출, 직원 수 및 자금 조달 한도무료 체험판에 대한 제한 없음
OCR 엔진Tesseract 5 (표준 래퍼)정확도가 향상된 최적화된 Tesseract 5

빠른 시작: Syncfusion OCR에서 IronOCR로의 마이그레이션

1단계: NuGet 패키지 교체

Syncfusion OCR 및 OCR 기능만을 위해 포함된 기타 Syncfusion 패키지는 제거하십시오:

dotnet remove package Syncfusion.PDF.OCR.Net.Core
dotnet remove package Syncfusion.Pdf.Net.Core
dotnet remove package Syncfusion.Compression.Net.Core
SHELL

NuGet 에서IronOCR설치하세요.

dotnet add package IronOcr

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

Syncfusion 네임스페이스 임포트를 단일IronOCR네임스페이스로 대체하십시오:

// Before (Syncfusion)
using Syncfusion.OCRProcessor;
using Syncfusion.PDF;
using Syncfusion.Pdf.Parsing;

// After (IronOCR)
using IronOcr;
C#

단계 3: 라이선스 초기화

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

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

Suite 등록은 필요하지 않습니다. 커뮤니티 라이선스 자격 확인은 필요하지 않습니다. 키(key)는 정적 속성에 할당된 일반 문자열입니다.

코드 마이그레이션 예제

Tessdata 경로 제거 및 OCR 초기화

Syncfusion 코드베이스는 일반적으로 tessdata 검증 로직을 포함합니다 — OCR을 시도하기 전에 디렉토리가 존재하고 필수 .traineddata 파일이 있는지 확인합니다. 이 가드 코드는 tessdata 파일이 누락되면 런타임 예외가 발생하기 때문에 존재하며, 언어 파일 누락으로 인한 운영 환경 사고가 빈번하게 발생하여 팀들이 방어적 검사를 작성하는 경우가 많습니다.

Syncfusion OCR 접근 방식:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class DocumentOcrService
{
    // Path hardcoded — different on every deployment target
    private const string TessDataPath = @"tessdata/";

    private bool ValidateTessdataBeforeUse(string languageCode)
    {
        // Guard required because missing files cause runtime exceptions
        if (!Directory.Exists(TessDataPath))
            throw new InvalidOperationException(
                "tessdata directory not found. Download from github.com/tesseract-ocr/tessdata_best");

        string filePath = Path.Combine(TessDataPath, $"{languageCode}.traineddata");
        if (!File.Exists(filePath))
            throw new InvalidOperationException(
                $"{languageCode}.traineddata not found — file must be downloaded manually");

        return true;
    }

    public string ExtractText(string pdfPath, string languageCode = "eng")
    {
        ValidateTessdataBeforeUse(languageCode);  // defensive check before every call

        using var document = new PdfLoadedDocument(pdfPath);
        using var processor = new OCRProcessor(TessDataPath);
        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        var sb = new StringBuilder();
        foreach (PdfLoadedPage page in document.Pages)
            sb.AppendLine(page.ExtractText());

        return sb.ToString();
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class DocumentOcrService
{
    // 아니요 tessdata path — no validation logic — no defensive checks
    public string ExtractText(string pdfPath)
    {
        return new IronTesseract().Read(pdfPath).Text;
    }
}
C#

전체 ValidateTessdataBeforeUse 메서드와 TessDataPath 상수가 삭제됩니다. tessdata 폴더를 복사하는 배포 파이프라인 단계가 제거되었습니다. CI 스크립트에서 .traineddata 파일을 다운로드하는 부분이 제거됩니다. 테스트 데이터를 컨테이너 이미지로 복사하는 Dockerfile 레이어가 제거되었습니다. 해당 코드는 교체할 필요가 없습니다. 더 이상 필요하지 않기 때문입니다. IronTesseract 설정 가이드에는 기본값 이외의 구성이 필요한 경우 사용할 수 있는 모든 초기화 옵션이 설명되어 있습니다.

검색 가능한 PDF 생성 파이프라인

Syncfusion의 검색 가능한 PDF 출력은 로드된 문서에서 PerformOCR()을 호출하여 작동하며, 빈 공간에 보이지 않는 텍스트 레이어를 추가한 다음 수정된 문서를 스트림에 저장합니다. 이 패턴은 입력과 출력이라는 두 개의 스트림을 관리해야 하며, OCR 및 저장 단계는 동일한 가변 문서 객체에 대해 수행되는 별도의 작업입니다.

Syncfusion OCR 접근 방식:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class SearchablePdfService
{
    private const string TessDataPath = @"tessdata/";

    public void ConvertToSearchable(string inputPdfPath, string outputPdfPath)
    {
        // Load document — mutable: PerformOCR modifies it in place
        using var document = new PdfLoadedDocument(inputPdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;

        // Step 1: OCR modifies the document object
        processor.PerformOCR(document);

        // Step 2: Save the modified document to a separate output file
        using var outputStream = new FileStream(outputPdfPath, FileMode.Create, FileAccess.Write);
        document.Save(outputStream);
    }

    public byte[] ConvertToSearchableBytes(string inputPdfPath)
    {
        using var document = new PdfLoadedDocument(inputPdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        using var outputStream = new MemoryStream();
        document.Save(outputStream);
        return outputStream.ToArray();
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class SearchablePdfService
{
    public void ConvertToSearchable(string inputPdfPath, string outputPdfPath)
    {
        var result = new IronTesseract().Read(inputPdfPath);
        result.SaveAsSearchablePdf(outputPdfPath);
    }

    public byte[] ConvertToSearchableBytes(string inputPdfPath)
    {
        using var input = new OcrInput();
        input.LoadPdf(inputPdfPath);

        var result = new IronTesseract().Read(input);

        // SaveAsSearchablePdf also accepts a MemoryStream
        using var ms = new MemoryStream();
        result.SaveAsSearchablePdf(ms);
        return ms.ToArray();
    }
}
C#

Syncfusion이 사용한 변형 가능한 문서 모델 – PerformOCR()이 로드된 문서를 저장하기 전에 변경하는 방식 –은 IronOCR의 불변의 읽기-출력 패턴으로 대체됩니다. recognized text는 OcrResult 객체에 저장될 수 있으며 검색 가능한 PDF로 저장, 일반 텍스트로 내보내기, 구조화된 데이터로 탐색 가능하며, 모두 동일한 결과로부터 가능합니다. 검색 가능한 PDF 사용 설명서검색 가능한 PDF 예제에는 PDF/A 준수 설정을 포함한 추가 출력 옵션이 설명되어 있습니다.

스트림 기반 PDF OCR 파이프라인

HTTP 업로드, 메시지 큐 또는 BLOB 스토리지를 통해 PDF 문서를 수신하는 프로덕션 서비스는 일반적으로 파일 경로 대신 스트림을 사용합니다. Syncfusion은 PdfLoadedDocument을 통해 스트림을 허용하지만, tessdata 경로 제약은 여전히 적용됩니다 — 스트림이 처리되는 서버에 tessdata 폴더가 존재해야 합니다.

Syncfusion OCR 접근 방식:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class StreamOcrService
{
    private const string TessDataPath = @"tessdata/";

    public string ExtractFromStream(Stream pdfStream)
    {
        // Stream input works, but tessdata path constraint remains
        using var document = new PdfLoadedDocument(pdfStream);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        var sb = new StringBuilder();
        foreach (PdfLoadedPage page in document.Pages)
            sb.AppendLine(page.ExtractText());

        return sb.ToString();
    }

    public async Task<string> ExtractFromStreamAsync(Stream pdfStream)
    {
        // 아니요 native async — must wrap in Task.Run
        return await Task.Run(() => ExtractFromStream(pdfStream));
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class StreamOcrService
{
    public string ExtractFromStream(Stream pdfStream)
    {
        using var input = new OcrInput();
        input.LoadPdf(pdfStream);    // accepts Stream directly

        return new IronTesseract().Read(input).Text;
    }

    public async Task<string> ExtractFromStreamAsync(Stream pdfStream)
    {
        using var input = new OcrInput();
        input.LoadPdf(pdfStream);

        var ocr = new IronTesseract();
        var result = await ocr.ReadAsync(input);   // native async support
        return result.Text;
    }
}
C#

OcrInputLoadPdf() 메서드는 중간 파일 쓰기가 필요 없이 Stream을 직접 허용합니다. IronOCR는 기본 비동기 통합을 위한 ReadAsync() 메서드도 제공하며, Task.Run() 래퍼가 필요 없습니다. 웹 API 컨트롤러, Azure Functions 및 기타 비동기 서비스 패턴의 경우, 이 도구는 API와 완벽하게 호환됩니다. 스트림 입력 가이드에는 이미지 스트림 및 다중 페이지 TIFF 스트림을 포함한 모든 스트림 로딩 옵션이 설명되어 있습니다. 비동기 OCR 가이드에서는 장시간 실행되는 문서 배치 작업에 대한 취소 토큰 지원 및 진행 상황 콜백을 다룹니다.

구조화된 단락 및 WORD 추출

Syncfusion의 텍스트 추출 모델은 두 가지 수준을 제공합니다: result.Text을 통해 전체 문서에 대한 연결된 텍스트, page.ExtractText()을 반복하여 페이지별 텍스트를 제공합니다. 하위 페이지 구조는 없습니다. 즉, WORD 좌표, 단락 경계, 토큰별 신뢰도 점수 등이 없습니다. 위치를 기준으로 특정 필드를 찾거나 신뢰도가 낮은 토큰을 필터링해야 하는 애플리케이션은 연결된 문자열 위에 자체 파싱 로직을 구현해야 합니다.

Syncfusion OCR 접근 방식:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class StructuredExtractionService
{
    private const string TessDataPath = @"tessdata/";

    public Dictionary<int, string> ExtractPerPage(string pdfPath)
    {
        var pageTexts = new Dictionary<int, string>();

        using var document = new PdfLoadedDocument(pdfPath);
        using var processor = new OCRProcessor(TessDataPath);

        processor.Settings.Language = Languages.English;
        processor.PerformOCR(document);

        // Page-level is the finest granularity available
        int pageNum = 1;
        foreach (PdfLoadedPage page in document.Pages)
        {
            pageTexts[pageNum] = page.ExtractText();
            pageNum++;
        }

        return pageTexts;
        // 아니요 word coordinates, no paragraph boundaries, no per-token confidence
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class StructuredExtractionService
{
    public void ExtractWithStructure(string pdfPath)
    {
        var result = new IronTesseract().Read(pdfPath);

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

        foreach (var page in result.Pages)
        {
            Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words");

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

    public IEnumerable<string> ExtractHighConfidenceWords(string pdfPath, int minConfidence = 80)
    {
        var result = new IronTesseract().Read(pdfPath);

        // Per-word confidence filtering — not possible with Syncfusion's page-level model
        return result.Pages
            .SelectMany(p => p.Words)
            .Where(w => w.Confidence >= minConfidence)
            .Select(w => w.Text);
    }
}
C#

구조화된 출력 모델은 단락, 줄, WORD 및 문자에 대해 바운딩 박스 좌표와 개별 신뢰도 점수를 제공합니다. 이는 특히 청구서 필드 추출, 양식 파싱, 문서 분류와 같은 워크플로우에서 유용합니다. 이러한 작업에서는 텍스트의 내용이 무엇인지 아는 것만큼이나 텍스트가 페이지의 어디에 위치하는지 파악하는 것이 중요하기 때문입니다. 읽기 결과 가이드OcrResult API 참조 문서는 전체 객체 그래프를 설명합니다.

병렬 실행을 통한 일괄 문서 처리

대용량 OCR 서비스는 수십 개 또는 수백 개의 문서를 동시에 처리합니다. Syncfusion는 OCRProcessor을 스레드 안전으로 문서화하지 않으며, 이는 순차적 처리를 강요하거나 개발자가 자체 인스턴스 풀을 구현해야 합니다.IronOCR인스턴스는 스레드당 생성이 안전하여 Parallel.ForEach 또는 PLINQ을 추가 동기화 없이 직접 사용할 수 있습니다.

Syncfusion OCR 접근 방식:

using Syncfusion.OCRProcessor;
using Syncfusion.Pdf.Parsing;

public class BatchOcrService
{
    private const string TessDataPath = @"tessdata/";

    public Dictionary<string, string> ProcessBatch(IEnumerable<string> pdfPaths)
    {
        var results = new Dictionary<string, string>();

        // Sequential processing — OCRProcessor thread safety not guaranteed
        foreach (var path in pdfPaths)
        {
            using var document = new PdfLoadedDocument(path);
            using var processor = new OCRProcessor(TessDataPath);

            processor.Settings.Language = Languages.English;
            processor.PerformOCR(document);

            var sb = new StringBuilder();
            foreach (PdfLoadedPage page in document.Pages)
                sb.AppendLine(page.ExtractText());

            results[path] = sb.ToString();
        }

        return results;
    }
}
C#

IronOCR 접근 방식:

using IronOcr;

public class BatchOcrService
{
    public Dictionary<string, string> ProcessBatch(IEnumerable<string> pdfPaths)
    {
        var results = new ConcurrentDictionary<string, string>();

        // Parallel processing — IronTesseract is safe per-thread
        Parallel.ForEach(pdfPaths, pdfPath =>
        {
            var ocr = new IronTesseract();   // one instance per thread
            var text = ocr.Read(pdfPath).Text;
            results[pdfPath] = text;
        });

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

병렬 처리를 위한 문서화된 패턴은 스레드당 하나의 IronTesseract 인스턴스를 생성하는 것입니다. 공유 상태, 잠금 경합, 인스턴스 풀링 인프라가 필요하지 않습니다. 멀티스레딩 예제에서는 일반적인 문서 배치 크기에 대한 처리량 벤치마크를 보여주고, 속도 최적화 가이드에서는 지연 시간에 민감한 워크로드를 위한 엔진 구성 옵션을 다룹니다.

Syncfusion OCRAPI와IronOCR매핑 참조

Syncfusion OCRIronOCR에 상응하는노트
Syncfusion.PDF.OCR.Net.CoreIronOcrNuGet 패키지 교체
Syncfusion.OCRProcessorIronOcr단일 네임스페이스
Syncfusion.Pdf제거하다더 이상 필요하지 않음
Syncfusion.Pdf.Parsing제거하다더 이상 필요하지 않음
SyncfusionLicenseProvider.RegisterLicense()IronOcr.License.LicenseKey =문자열 할당, Suite 등록 없음
new OCRProcessor(tessdataPath)new IronTesseract()경로 인수 없음
PdfLoadedDocument(filePath)경로를 ocr.Read(path)에 직접 전달또는 OcrInput을(를) LoadPdf()와 함께 사용
PdfLoadedDocument(stream)input.LoadPdf(stream)스트림 지원은 직접적입니다
processor.Settings.Language = Languages.Englishocr.Language = OcrLanguage.EnglishOcrLanguage 열거형
언어.영어\언어.프랑스어ocr.Language = OcrLanguage.English; ocr.AddSecondaryLanguage(OcrLanguage.French)
processor.PerformOCR(document)ocr.Read(input)OcrResult를 직접 반환
page.ExtractText()result.Text 또는 result.Pages[i].Text전체 텍스트에 루프가 필요하지 않습니다
document.Pages 반복result.Pages[] 배열단락, 단어, 문자 수 포함
OCR 후 document.Save(outputStream)result.SaveAsSearchablePdf(path)전용 메서드
Tessdata 유효성 검사 로직완전히 제거검증할 tessdata 없음
수동 tessdata 경로 상수완전히 제거IronOCR에서는 필요하지 않음
PdfBitmap 이미지-대-PDF 변환input.LoadImage(imagePath)이미지 OCR을 위한 PDF 왕복 변환 없음
전처리 API 없음input.Deskew(), input.DeNoise(), input.Contrast()OcrInput에 내장

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

문제 1: 패키지 전환 후 Tessdata 디렉터리를 찾을 수 없음

Syncfusion OCR: tessdata 디렉터리 유효성 검사 코드는 시작 시 또는 호출 시마다 실행되는 가드(guard)로 작성되었습니다. Syncfusion을 제거하고 IronOCR을 설치한 후에도 이 검증 코드는 여전히 컴파일됩니다 (Syncfusion 네임스페이스가 아닌 System.IO을 사용 중)이지만 이제 더 이상 존재하지 않는 작업을 보호합니다. 그대로 두면 향후 개발자들을 혼란스럽게 할 수 있는 사멸된 코드가 됩니다.

해결책: tessdata 검증 로직을 모두 완전히 삭제하십시오. TessDataPath 상수를 제거하고, 모든 Directory.Exists(TessDataPath) 검사, 모든 File.Exists(Path.Combine(TessDataPath, ...)) 검사 및 모든 시작 검증 방법을 제거합니다. IronOCR은 누락될 tessdata가 없기 때문에 tessdata 관련 예외를 발생시키지 않습니다:

// Delete these entirely — they have no equivalent in IronOCR
// private const string TessDataPath = @"tessdata/";
// private bool ValidateTessdata() { ... }

// The only error handling needed after migration:
try
{
    return new IronTesseract().Read(pdfPath).Text;
}
catch (FileNotFoundException)
{
    throw new ArgumentException($"PDF file not found: {pdfPath}");
}
C#

문제 2: 런타임 시 언어 파일 미제공

Syncfusion OCR: Language .traineddata 파일이 파일 시스템 인공물로 배포되고, CopyToOutputDirectory.csproj으로 표시되며 빌드 시스템에 의해 복사됩니다. 프로젝트에서 tessdata 폴더를 제거한 후에도, 언어 관련 CI 단계 및 .csproj 항목이 삭제된 파일을 참조하여 빌드 경고 또는 파이프라인 실패를 초래할 수 있습니다.

해결책: 모든 .csproj 파일과 CI 파이프라인 정의에서 tessdata 관련 항목을 제거합니다. 대신 NuGet 패키지로 언어 팩을 설치하십시오:

# Languages install as NuGet packages — no manual file management
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
SHELL
// Language configuration after migration
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);
var result = ocr.Read("multilingual-report.pdf");
C#

여러 언어 가이드에는 언어 팩 설치 및 125개 이상의 지원 언어에 대한 OcrLanguage 열거형 값이 포함되어 있습니다.

문제 3: 검색 가능한 PDF 출력 바이트 순서 차이

Syncfusion OCR: 검색 가능한 PDF는 PerformOCR()이 문서를 변형한 후 document.Save(stream)을 호출하여 생성되었습니다. 바이트 배열을 사용하는 일부 하위 소비자는 Syncfusion의 특정 PDF 구조, 메타데이터 필드 또는 생성자 문자열을 예상하도록 작성되었을 수 있습니다.

해결책: IronOCR의 SaveAsSearchablePdf()은 텍스트 레이어가 있는 표준 PDF를 생성합니다. 호환성을 확인하기 위해 하류 소비자(PDF 뷰어, 검색 인덱스, 아카이브 시스템)에서 번역 결과를 테스트하십시오. 바이트 단위로 완전히 동일한 출력이 필요한 경우, 텍스트 추출 가능성(원시 바이트가 아님)을 비교하는 과도기적 테스트가 적절한 승인 기준입니다:

// Verify the searchable PDF contains the expected text
var result = new IronTesseract().Read("scanned.pdf");
result.SaveAsSearchablePdf("output-searchable.pdf");

// Validation: confirm text layer is present and readable
var verificationText = new IronTesseract().Read("output-searchable.pdf").Text;
Assert.True(verificationText.Contains("expected content"));
C#

문제 4: 마이그레이션 시도 후 Docker 이미지 크기가 증가함

Syncfusion OCR: 일부 팀은 테스트 중의 예방 조치로 Docker 이미지에 tessdata 파일을 남겨둔 채 마이그레이션을 시도합니다. 이로 인해 이미지에 tessdata 레이어와IronOCR패키지가 모두 포함되어 이미지 크기가 불필요하게 커집니다.

해결책: 마이그레이션된 이미지를 빌드하기 전에 Dockerfile에서 tessdata COPY 레이어를 삭제합니다.IronOCR패키지는 독립형입니다. Docker 배포 가이드에서는 Alpine, Debian 및 Ubuntu 대상에 대해 검증된 기본 이미지 및 구성을 제공합니다:

# 제거하다 this layer entirely after migration
# COPY tessdata/ /app/tessdata/

#IronOCR requires only the standard .NET runtime
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "YourService.dll"]
Text

문제 5: 2단계 PerformOCR/ExtractText 패턴에 해당하는 직접적인 대응 항목이 없음

Syncfusion OCR: 어떤 호출 코드가 두 메서드 사이에 PdfLoadedDocument 참조를 전달합니다 — 한 메서드는 PerformOCR()을 호출하고 다른 메서드는 ExtractText()을 호출하며 문서 객체의 상태 변형에 의존합니다. IronOCR에서는 Read()이 자체 포함된 결과 객체를 반환하기 때문에 이러한 패턴이 존재하지 않습니다.

해결책: 파일 경로 또는 스트림을 수락하고 OcrResult을 반환하는 단일 메서드로 모든 분리된 OCR/추출 패턴을 리팩터링합니다. 결과 객체에는 텍스트, 페이지, 단락, 신뢰도, 검색 가능한 PDF로 저장하는 기능 등 모든 정보가 포함됩니다:

// Replace split PerformOCR / ExtractText pattern
public OcrResult ProcessDocument(string pdfPath)
{
    // One call, immutable result, all data available
    return new IronTesseract().Read(pdfPath);
}

// Callers decide what they need from the result
var result = service.ProcessDocument("contract.pdf");
var fullText = result.Text;
var confidence = result.Confidence;
result.SaveAsSearchablePdf("contract-searchable.pdf");
C#

이슈 6: 마이그레이션 후에도 커뮤니티 라이선스 등록 코드가 남아 있음

Syncfusion OCR: 애플리케이션 시작 시 Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense() 호출은 Suite 라이선스를 등록합니다. 이 호출은 종종 Program.cs, Startup.cs, 또는 정적 초기자에 있습니다. Syncfusion 패키지를 제거한 후, 이 줄로 인해 컴파일 오류가 발생합니다.

해결책: SyncfusionLicenseProvider.RegisterLicense() 호출을 삭제하고IronOCR라이선스 초기화로 대체합니다. 또한 커뮤니티 라이선스 자격 요건 관련 내용, 규정 준수 문서 참조, 또는 매출 및 직원 수 기준에 대한 언급은 모두 삭제해 주십시오. 이러한 개념들은 IronOCR에는 적용되지 않습니다:

// 제거하다 (causes compile error after package removal)
// Syncfusion.Licensing.SyncfusionLicenseProvider.RegisterLicense("SYNCFUSION-KEY");

// Add at application startup
IronOcr.License.LicenseKey = "YOUR-IRONOCR-KEY";
C#

Syncfusion OCR마이그레이션 체크리스트

사전 마이그레이션

변경 사항을 적용하기 전에 코드베이스를 검토하여 모든 Syncfusion OCR사용처를 확인하십시오:

# Find all Syncfusion namespace imports
grep -r "using Syncfusion" --include="*.cs" .

# Find OCRProcessor usage
grep -r "OCRProcessor\|PerformOCR\|PdfLoadedDocument\|ExtractText" --include="*.cs" .

# Find tessdata path references
grep -r "TessDataPath\|tessdata\|traineddata" --include="*.cs" .

# Find Syncfusion license registration
grep -r "SyncfusionLicenseProvider\|RegisterLicense" --include="*.cs" .

# Find csproj tessdata copy rules
grep -r "tessdata\|traineddata" --include="*.csproj" .

# Find Dockerfile tessdata layers
grep -r "tessdata" Dockerfile* docker-compose*.yml .
SHELL

코드를 작성하기 전에 결과를 정리하십시오. 어떤 파일에 OCR 호출이 포함되어 있는지, 어떤 파일에 tessdata 유효성 검사가 포함되어 있는지, 그리고 어떤 파이프라인 정의가 tessdata 폴더를 참조하는지 확인하십시오.

코드 마이그레이션

  1. 모든 .csproj 파일에서 Syncfusion.PDF.OCR.Net.Core, Syncfusion.Pdf.Net.Core 및 관련 패키지를 제거합니다.
  2. OCR을 수행하는 각 프로젝트에서 dotnet add package IronOcr을 실행합니다.
  3. 사용된 비영어 언어에 대해 NuGet을 통해 언어 팩을 설치합니다: dotnet add package IronOcr.Languages.[Language].
  4. 모든 서비스 클래스에서 private const string TessDataPath 상수를 삭제합니다.
  5. 모든 tessdata 검증 방법 (ValidateTessdata() 및 유사한 보호 장치)을 삭제합니다. 6.SyncfusionLicenseProvider.RegisterLicense()을(를) IronOcr.License.LicenseKey = "YOUR-KEY"로 애플리케이션 시작 시 대체합니다.
  6. using Syncfusion.OCRProcessor;를 다음으로 대체하십시오. using Syncfusion.PDF; using Syncfusion.Pdf.Parsing;withusing IronOcr;`.
  7. new OCRProcessor(TessDataPath) 초기화를 new IronTesseract()으로 대체합니다.
  8. PdfLoadedDocument + processor.PerformOCR() + page.ExtractText() 체인을 ocr.Read(path).Text로 대체합니다.
  9. Syncfusion의 비트 단위 언어 플래그(Languages.English | 언어.프랑스어 plus ocr.AddSecondaryLanguage()` 호출.
  10. document.Save(stream)PerformOCR() 이후 result.SaveAsSearchablePdf(path)로 검색 가능 PDF 출력에 대해 대체합니다.
  11. 이미지-대-PDF 변환 왕복을 직접 input.LoadImage(imagePath) 또는 ocr.Read(imagePath)로 대체합니다.
  12. 모든 .csproj 파일에서 tessdata CopyToOutputDirectory 항목을 제거합니다.
  13. 모든 CI/CD 파이프라인 정의에서 tessdata 다운로드 단계를 제거하십시오.
  14. 모든 Dockerfile에서 tessdata COPY 레이어를 제거합니다.

마이그레이션 이후

  • 마이그레이션 전에 사용했던 동일한 샘플 문서에서 PDF OCR이 예상된 텍스트 콘텐츠를 생성하는지 확인하십시오.
  • PDF 변환 단계 없이 이미지 OCR(JPG, PNG, BMP)이 정상적으로 작동하는지 확인하십시오.
  • 설치된 NuGet 언어 팩을 사용하여 다국어 문서가 올바르게 인식되는지 확인하십시오.
  • 생성된 파일을 PDF 뷰어에서 열어 텍스트 선택 및 검색 기능이 정상적으로 작동하는지 확인하여 검색 가능한 PDF 출력물을 테스트하십시오.
  • 업데이트된 Dockerfile로 생성된 새로운 Docker 컨테이너에서 애플리케이션을 실행하여 tessdata와 관련된 시작 오류가 발생하지 않는지 확인하십시오.
  • Syncfusion.Licensing 호출 또는 Syncfusion 네임스페이스 참조 없이 애플리케이션이 시작되는지 확인합니다.
  • result.Confidence가 합리적인 값을 반환하는지 확인합니다 (일반적으로 깨끗한 문서의 경우 80–99%). 이를 통해 OCR 엔진이 활성화되었음을 확인할 수 있습니다.
  • 병렬 OCR 호출을 동시에 실행하고 스레딩 예외나 손상된 결과가 발생하지 않는지 확인하여 병렬 배치 처리를 테스트합니다.
  • 마이그레이션 전후의 저품질 또는 회전된 스캔 이미지에서 텍스트 추출 정확도를 비교하고, 자동 전처리 파이프라인을 통해 개선된 점을 확인하십시오.

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

배포 복잡성이 단일 NuGet 패키지로 줄어듭니다. 마이그레이션 후, 모든 환경 — 개발자 워크스테이션, CI 러너, 스테이징 컨테이너, 프로덕션 서버 — 에는 빌드 시스템에 복원되는 IronOcr NuGet 패키지가 필요합니다. tessdata 폴더가 없습니다. 구성할 파일 시스템 경로는 없습니다. 언어 파일 다운로드 스크립트는 없습니다. 100~500MB의 바이너리 데이터를 포함하는 Dockerfile 레이어도 없습니다. 컨테이너 이미지의 크기가 더 작아지고, CI 파이프라인이 더 단순해지며, 수동 개입 없이도 첫 빌드 시 새로운 환경이 올바르게 프로비저닝됩니다.

라이선스 비용은 예측 가능하고 일회성으로 고정됩니다. 개발자당 연간 갱신 주기를 대체하여 일회성 영구 라이선스를 구매하면 됩니다.IronOCR Professional($2,399)을 구매하는 5명의 개발자 팀은 1년간의 업데이트가 포함된 이 라이브러리를 무기한 소유하게 됩니다. 모니터링해야 할 매출 기준도, 추적해야 할 직원 수 제한도, 감사 조항도, 유지 관리해야 할 규정 준수 문서도 없습니다. 사업 확장 관련 사건(신규 계약자, 대규모 계약, 자금 조달 라운드 등)은 라이선스 검토를 유발하지 않습니다.

OCR 파이프라인은 외부 종속성 없이 열화된 문서를 처리합니다. Deskew, denoise, 대비 향상, 이진화, 해상도 스케일링은 OcrInput에 대한 메서드로 제공됩니다. 별도의 이미지 라이브러리는 필요하지 않습니다. 이전에는 System.Drawing이나 SkiaSharp을 사용하여 사전 처리 단계가 필요했던, 약간 회전되었거나 스캐너 노이즈가 있거나 대비가 낮은 문서도 이제 동일한IronOCR호출 내에서 처리할 수 있습니다. 이미지 품질 보정 가이드전처리 기능 페이지에는 사용 가능한 모든 필터와 인식 정확도에 미치는 영향이 상세히 설명되어 있습니다.

구조화된 출력은 필드 수준 문서 인텔리전스를 가능하게 합니다. OcrResult 객체는 페이지, 단락, 줄, 단어, 문자 등의 전체 문서 구조를 노출하며, 바운딩 박스 좌표와 토큰별 신뢰도 점수를 제공합니다. 이전에는 필드 경계를 찾기 위해 연결된 텍스트 문자열을 파싱하던 애플리케이션이, 이제는 단락 및 WORD 좌표 데이터를 직접 사용할 수 있습니다. 청구서 처리, 양식 추출 및 문서 분류 워크플로는 Syncfusion의 페이지 수준 모델이 제공할 수 없는 공간 정보에 접근할 수 있습니다. PDF OCR 사용 사례 페이지에서는 일반적인 문서 인텔리전스 패턴을 다룹니다.

병렬 일괄 처리 프로세스는 인프라 없이 확장됩니다. 스레드당 하나의 IronTesseract 인스턴스를 생성하는 것이 완전한 스레딩 전략입니다 — 인스턴스 풀링, 세마포어 관리, 순차 처리 제한 없음. 시간당 500개의 문서를 처리하는 배치 서비스는 Parallel.ForEach과 동기화 한 줄로 사용 가능한 CPU 코어를 포화시킬 수 있습니다. 자립형 엔진 아키텍처란 각 스레드가 공유 가능한 가변 상태 없이 독립적으로 작동함을 의미합니다.

바이너리 파일 관리 없이 125개 이상의 언어를 사용할 수 있습니다. 모든 언어 팩은 표준 패키지 관리자를 통해 NuGet 패키지로 설치됩니다. 버전 관리, 업데이트 획득 및 종속성 해결은 다른 모든 프로젝트 종속성을 관리하는 것과 동일한 툴링으로 처리됩니다. 서비스에 일본어나 아랍어 OCR을 추가하려면 GitHub 저장소에서 수동 다운로드 후 배포 파이프라인 업데이트가 아닌, 하나의 dotnet add package 커맨드가 필요합니다. 언어 인덱스에는 설치 명령어와 함께 지원되는 모든 스크립트가 나열되어 있습니다.

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

관련 기사

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