XImage.OCR에서 IronOCR로 마이그레이션하기
이 가이드는 기존 XImage.OCR 통합을 IronOCR로 전환하는 .NET 개발자를 위한 것입니다. 이 문서는 패키지 통합 프로세스, 네임스페이스 및 API 변경 사항, 그리고 XImage.OCR의 분산된 아키텍처로 인해 가장 큰 문제가 발생하는 시나리오에 대한 구체적인 코드 마이그레이션 예시를 다룹니다. 비교 기사를 미리 읽을 필요는 없습니다.
XImage.OCR에서 마이그레이션해야 하는 이유
XImage.OCR은 RasterEdge에서 제공하는 상용 Tesseract OCR 래퍼로, 일련의 연계된 NuGet 패키지를 통해 기능을 제공합니다. 이 아키텍처는 소규모에서는 잘 작동하지만, 애플리케이션이 확장됨에 따라 유지보수 비용이 누적됩니다.
언어가 늘어날수록 패키지 수도 증가합니다. 언어를 추가한다는 것은 NuGet 패키지를 추가한다는 것을 의미합니다. 다섯 언어 애플리케이션에는 코드-7244 패키지가 6개 포함되어 있습니다. 10개 언어를 지원하는 애플리케이션은 11개를 감당합니다. 모든 패키지는 코어와 동일한 버전에 고정되어야 합니다. 이는 개발자가 체인의 일부만 업데이트할 경우 런타임 오류가 발생하지 않게 하는 제약 조건입니다. IronOCR은 125개 이상의 모든 언어를 지원하는 단일 패키지를 제공합니다.
버전 동기화는 지속적인 위험입니다. 코드-7245는 패키지를 탐욕스럽게 업데이트합니다. 코드-7246가 12.5.0으로 진행되지만 코드-7247이 계속해서 12.4.0에 있을 때, 오류는 빌드 시가 아니라 런타임에 발생하며, 메시지는 거의 동기화 문제를 원인으로 지적하지 않습니다. CI/CD 파이프라인을 운영하는 팀들은 모든 XImage.OCR 패키지에 명시적인 버전 고정(version pinning)을 추가하는 방법을 배우게 됩니다. 이는 분산된 모델을 보완하는 것 외에는 아무런 목적도 없는 불필요한 작업입니다.
내장된 전처리 기능이 없으므로 실제 문서에서 높은 정확도를 보장합니다. XImage.OCR은 이미지를 기본 Tesseract 엔진으로 직접 전달합니다. 150 DPI 해상도로 스캔하고 2도 기울어진 이미지도 변경 없이 Tesseract로 전송됩니다. 사용 중인 Tesseract 래퍼에 관계없이 이러한 입력에 대한 정확도 상한선은 60~75%입니다. IronOCR은 코드-7248, 코드-7249, 코드-7250, 코드-7251, 코드-7252를 포함한 전처리 파이프라인을 제공하여 인식 실행 전 이러한 문제를 수정합니다.
구조화된 출력을 얻으려면 수동 파싱이 필요합니다. XImage.OCR은 일반 문자열을 반환합니다. 단어 위치, 줄 경계 또는 단어별 신뢰도를 추출하려면 해당 문자열을 직접 파싱해야 합니다. IronOCR은 코드-7253 객체를 반환하며, 코드-7254, 코드-7255, 코드-7256, 코드-7257과 픽셀 좌표 및 신뢰도 점수가 내장된 문자별 데이터를 제공합니다.
출력 형식은 일반 텍스트로 제한됩니다. XImage.OCR 결과물을 검색 가능한 PDF로 작성하려면 RasterEdge PDF SDK가 필요하며, 이는 별도의 유료 구매가 필요합니다. IronOCR은 추가 종속성 없이 코드-7258을 통해 검색 가능한 PDF를 생성합니다.
크로스 플랫폼 배포는 지원되지 않습니다. XImage.OCR은 Windows 전용입니다. Linux 컨테이너, macOS 개발 환경, Azure 또는 AWS에서의 클라우드 네이티브 배포에는 별도의 라이브러리가 필요합니다. IronOCR은 동일한 패키지로 Windows, Linux, macOS, Docker, Azure App Service 및 AWS Lambda에서 실행됩니다.
근본적인 문제
XImage.OCR은 언어당 하나의 NuGet 패키지가 필요합니다. 열 개의 언어는 서로 버전 고정된 열한 개의 패키지를 의미합니다:
<!-- XImage.OCR: 11 packages to support 10 languages — every version must match -->
<PackageReference Include="RasterEdge.XImage.OCR" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.English" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.German" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.French" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Spanish" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Italian" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Portuguese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.ChineseSimplified" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Japanese" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Korean" Version="12.4.0" />
<PackageReference Include="XImage.OCR.Language.Arabic" Version="12.4.0" />
IronOCR은 전체 블록을 한 줄로 대체합니다:
<!-- IronOCR: One package. 125+ languages. 아니요 version coordination. -->
<PackageReference Include="IronOcr" Version="2024.x.x" />
##IronOCR대 XImage.OCR: 기능 비교
아래 표는 마이그레이션 결정과 가장 관련이 깊은 기능들을 다루고 있습니다.
| 기능 | XImage.OCR | IronOCR |
|---|---|---|
| 영어 전용 NuGet 패키지 | 2 (코어 + 언어 팩) | 1 |
| 10개 언어용 NuGet 패키지 | 11 | 1 |
| 버전 동기화 필요 | 예 — 모든 패키지가 일치해야 합니다 | 아니요 |
| 지원 언어 | ~15개 별도 패키지 | 125개 이상 번들 제공 |
| 내장 전처리 기능 | None | 기울기 보정, 노이즈 제거, 대비 조정, 이진화, 선명도 향상, 크기 조정, 확대/축소, 침식, 반전 |
| 심층 노이즈 제거 | None | Yes (코드-7259) |
| 네이티브 PDF 입력 | RasterEdge PDF SDK가 필요합니다. | Yes (코드-7260) |
| 검색 가능한 PDF 출력 | RasterEdge PDF SDK가 필요합니다. | Yes (코드-7261) |
| 여러 페이지로 구성된 TIFF 입력 | 제한적 | Yes (코드-7262) |
| 바이트 배열 입력 | MemoryStream을 통한 수동 처리 | Yes (코드-7263) |
| 스트림 입력 | 수동 | Yes (코드-7264) |
| 구조화된 출력 | 일반 문자열 | 페이지, 단락, 줄, 단어, 문자의 좌표 |
| 단어별 신뢰도 점수 | 사용 불가 | 예 |
| 바코드 판독 | 사용 불가 | Yes (코드-7265) |
| hOCR 내보내기 | 사용 불가 | 예 |
| 스레드 안전성 | 스레드 안전하지 않음 | 완전한 스레드 안전성 |
| 메모리 모델 (병렬) | 스레드당 하나의 핸들러 인스턴스 | 단일 공유 인스턴스 |
| 크로스 플랫폼 | 윈도우즈 | 윈도우, 리눅스, macOS, Docker, Azure, AWS |
| .NET 호환성 | .NET Standard 2.0, .NET Framework 4.5 이상 | .NET Framework 4.6.2 이상, .NET Core, .NET 5/6/7/8/9 |
| 라이선스 유형 | 상업용 (RasterEdge) | 영구 (Lite 코드-7266, Pro $1,499, Enterprise $2,999) |
| 상업적 지원 | RasterEdge 지원 | 예, 라이선스 등급별 |
빠른 시작: XImage.OCR에서 IronOCR로의 마이그레이션
단계 1: NuGet 패키지 교체
모든 XImage.OCR 패키지를 제거하십시오. 명령어 수는 설치한 언어 팩의 수와 일치합니다:
dotnet remove package RasterEdge.XImage.OCR
dotnet remove package XImage.OCR.Language.English
dotnet remove package XImage.OCR.Language.German
dotnet remove package XImage.OCR.Language.French
# Repeat for every language pack in your project
NuGet 에서IronOCR설치하세요.
단계 2: 네임스페이스 업데이트
RasterEdge 네임스페이스 임포트를 단일IronOCR네임스페이스로 대체하십시오:
// Before (XImage.OCR)
using RasterEdge.XImage.OCR;
using RasterEdge.Imaging.Basic;
// After (IronOCR)
using IronOcr;
단계 3: 라이선스 초기화
응용 프로그램 시작 시, OCR 호출 전에 라이선스 초기화를 한 번 수행하십시오:
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"키를 하드코딩하지 말고 환경 변수나 시크릿 관리자에 저장하십시오:
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY");Imports System
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY")코드 마이그레이션 예제
다중 패키지 초기화 통합
첫 번째 마이그레이션 작업은 XImage.OCR 초기화 블록(라이선스 활성화, 핸들러 생성, 문자열 기반 언어 할당)을 IronOCR의 동등한 기능으로 통합하는 것입니다.
XImage.OCR 접근 방식:
// Requires: RasterEdge.XImage.OCR + one XImage.OCR.Language.* package per language
// Language strings must exactly match installed package names or OCR fails at runtime
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("your-ximage-license-key");
var ocrHandler = new OCRHandler();
// String codes — typo "enh" instead of "eng" silently fails or throws at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra", "spa", "ita" };
// Process returns a plain string — no structure, no confidence
string extractedText = ocrHandler.Process("document.png");
Console.WriteLine(extractedText);
IronOCR 접근 방식:
// Requires: IronOcr (single package — all languages included)
IronOcr.License.LicenseKey = "YOUR-IRONOCR-LICENSE-KEY";
var ocr = new IronTesseract();
// Type-safe enum — compiler catches typos, no runtime surprises
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
using var input = new OcrInput();
input.LoadImage("document.png");
var result = ocr.Read(input);
Console.WriteLine(result.Text);
Console.WriteLine($"Confidence: {result.Confidence}%");
XImage.OCR의 문자열 기반 언어 코드(코드-7267, 코드-7268)는 해당 NuGet 패키지가 없거나 잘못된 버전일 경우 런타임에 실패합니다. IronOCR의 코드-7269 열거형은 잘못된 언어 조합을 컴파일할 수 없도록 합니다. IronTesseract 설정 가이드는 엔진 구성 옵션을 모두 다루며, 다중 언어 사용법은 혼합 언어 문서를 위한 기본 및 보조 언어 조합이 작동하는 방식을 문서화합니다.
이미지 형식 처리 통합
XImage.OCR은 형식에 따라 각 이미지 소스를 다르게 처리합니다. 바이트 배열, 스트림, 파일 경로는 각각 약간 다른 코드 경로를 필요로 합니다. IronOCR은 동일한 코드-7270 메서드를 통해 이들을 모두 수용합니다.
XImage.OCR 접근 방식:
// XImage.OCR: different handling per image source type
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// File path — works directly
string resultFromFile = ocrHandler.Process("invoice.jpg");
// Byte array — must write to temp file first, then process
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
string tempPath = Path.GetTempFileName() + ".jpg";
File.WriteAllBytes(tempPath, imageBytes);
try
{
string resultFromBytes = ocrHandler.Process(tempPath);
Console.WriteLine(resultFromBytes);
}
finally
{
File.Delete(tempPath); //수동cleanup — easy to forget
}
// Multi-page TIFF — must split frames manually
// 아니요 built-in TIFF frame iteration in base XImage.OCR
IronOCR 접근 방식:
// IronOCR: unified OcrInput accepts all source types identically
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
// File path
using (var input = new OcrInput())
{
input.LoadImage("invoice.jpg");
var result = ocr.Read(input);
Console.WriteLine($"From file: {result.Text}");
}
// Byte array — no temp file needed
byte[] imageBytes = File.ReadAllBytes("invoice.jpg");
using (var input = new OcrInput())
{
input.LoadImage(imageBytes);
var result = ocr.Read(input);
Console.WriteLine($"From bytes: {result.Text}");
}
// Multi-page TIFF — all frames processed in one call
using (var input = new OcrInput())
{
input.LoadImageFrames("scanned-archive.tiff");
var result = ocr.Read(input);
Console.WriteLine($"TIFF pages: {result.Pages.Count}");
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
}
XImage.OCR의 바이트 배열용 임시 파일 패턴은 디스크 공간 낭비와 오류 경로에서 파일 누수의 흔한 원인입니다. IronOCR의 코드-7271은 중간 파일을 완전히 제거합니다. 이미지 입력 가이드와 TIFF/GIF 입력 가이드는 스트림 및 다중 프레임 처리를 포함하여 지원되는 모든 소스 유형을 다룹니다.
출력 형식 간소화
XImage.OCR은 일반 문자열을 반환합니다. 검색 가능한 PDF를 생성하려면 별도의 RasterEdge 제품이 필요합니다. IronOCR은 별도의 패키지 없이 동일한 결과 객체에서 일반 텍스트, 검색 가능한 PDF 및 구조화된 데이터를 생성합니다.
XImage.OCR 접근 방식:
// XImage.OCR: plain text output only
// Searchable PDF requires purchasing the RasterEdge PDF SDK separately
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
string plainText = ocrHandler.Process("scanned-contract.jpg");
// To produce a searchable PDF from this text, you would need:
// 1. Purchase RasterEdge PDF SDK (separate commercial license)
// 2. Create a PDF document programmatically
// 3. Embed the extracted text as invisible text layer over the image
// 4. Manage the PDF document lifecycle manually
// 아니요 built-in path from OCR result to searchable PDF in XImage.OCR alone
Console.WriteLine(plainText);
IronOCR 접근 방식:
// IronOCR: plain text, searchable PDF, and structured data from one result
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadImage("scanned-contract.jpg");
var result = ocr.Read(input);
// Plain text
Console.WriteLine(result.Text);
// Searchable PDF — no extra package required
result.SaveAsSearchablePdf("searchable-contract.pdf");
// Structured data: paragraphs with bounding box coordinates
foreach (var page in result.Pages)
{
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($"Paragraph at ({paragraph.X}, {paragraph.Y}): {paragraph.Text}");
}
}
// Per-word confidence for quality gating
var lowConfidenceWords = result.Pages
.SelectMany(p => p.Words)
.Where(w => w.Confidence < 70)
.ToList();
Console.WriteLine($"Words below 70% confidence: {lowConfidenceWords.Count}");
코드-7272 호출은 인식된 텍스트를 원본 이미지 아래에 숨겨진 레이어로 포함하여 문서의 시각적 외관을 변경하지 않고 완전히 텍스트 검색 가능하게 만듭니다. 검색 가능한 PDF 사용 안내서에는 페이지 범위 옵션과 DPI 설정에 대한 내용이 포함되어 있습니다. 구조화된 데이터 추출 패턴의 경우, 결과 읽기 가이드는 단어 좌표 및 신뢰도 액세스 등을 포함하여 전체 코드-7273 계층을 문서화합니다. 검색 가능한 PDF 예제에는 완벽하게 작동하는 구현 예시가 포함되어 있습니다.
일괄 문서 처리
XImage.OCR은 스레드 안전하지 않습니다. 각 동시 작업자 스레드는 자체 코드-7274 인스턴스를 생성해야 하므로 스레드 수만큼 메모리 소비가 증가합니다. IronOCR은 모든 스레드에서 단일 공유 인스턴스를 사용합니다.
XImage.OCR 접근 방식:
// XImage.OCR: one handler per thread — memory multiplies with concurrency
// 4 threads processing English documents: 4 x ~100MB = ~400MB for OCR alone
// 4 threads processing 5 languages: 4 x ~250MB = ~1GB just for OCR handlers
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
documentPath =>
{
// Each thread must create and dispose its own handler
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
try
{
string text = ocrHandler.Process(documentPath);
results[documentPath] = text;
}
finally
{
//수동disposal required — no using statement support shown
ocrHandler.Dispose();
}
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
IronOCR 접근 방식:
// IronOCR: single IronTesseract instance shared across all threads
// Memory stays flat regardless of thread count
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract(); // Create once outside the parallel loop
var results = new ConcurrentDictionary<string, string>();
string[] documentPaths = Directory.GetFiles("./incoming", "*.png");
Parallel.ForEach(documentPaths, documentPath =>
{
// OcrInput is created per thread — IronTesseract instance is shared
using var input = new OcrInput();
input.LoadImage(documentPath);
input.Deskew(); // Preprocessing runs per-document, not per-thread engine
input.DeNoise();
var result = ocr.Read(input);
results[documentPath] = result.Text;
});
foreach (var kvp in results)
Console.WriteLine($"{Path.GetFileName(kvp.Key)}: {kvp.Value.Length} chars");
XImage.OCR의 스레드별 핸들러 패턴을 적용하면, 5개 언어를 로드하는 4스레드 배치 작업의 경우 단일 문서를 처리하기 전에 약 1GB의 OCR 핸들러 메모리를 차지하게 됩니다. IronOCR의 공유 인스턴스는 병렬 처리 여부와 관계없이 메모리 사용량을 단일 인스턴스 수준에 제한합니다. 멀티스레딩 예제는 해당 패턴을 완벽하게 보여주고 있으며, 속도 최적화 가이드는 처리량 중심의 배치 워크로드를 위한 구성 튜닝을 다룹니다.
BarCode 및 텍스트 통합 추출
XImage.OCR에는 BarCode 판독 기능이 없습니다. 텍스트와 BARCODE가 모두 포함된 문서의 경우, 두 개의 별도 라이브러리와 두 번의 별도 처리 과정이 필요합니다. IronOCR은 단일 읽기 작업으로 두 가지를 모두 추출합니다.
XImage.OCR 접근 방식:
// XImage.OCR: text only — barcodes require a separate library and second pass
var ocrHandler = new OCRHandler();
ocrHandler.Language = "eng";
// Pass 1: text extraction with XImage.OCR
string documentText = ocrHandler.Process("warehouse-label.png");
Console.WriteLine($"Text: {documentText}");
// Pass 2: barcode reading requires a completely separate library
// e.g., ZXing.Net, Dynamsoft Barcode Reader, or another commercial SDK
// - Additional NuGet package required
// - Additional license required
// - Additional code for result merging
// 아니요 combined text + barcode result object exists in XImage.OCR
IronOCR 접근 방식:
// IronOCR: text and barcodes from a single Read() call
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var ocr = new IronTesseract();
ocr.Configuration.ReadBarCodes = true; // Enable barcode extraction
using var input = new OcrInput();
input.LoadImage("warehouse-label.png");
var result = ocr.Read(input);
// Text and barcodes in one result object
Console.WriteLine($"Document text:\n{result.Text}");
if (result.Barcodes.Any())
{
Console.WriteLine($"\nBarcodes found: {result.Barcodes.Count}");
foreach (var barcode in result.Barcodes)
Console.WriteLine($" [{barcode.BarcodeType}] {barcode.Value}");
}
코드-7275 설정은 두 번째 라이브러리나 두 번째 읽기가 필요 없이 바코드 감지를 인식 패스에 추가합니다. 바코드 판독 방법 및 바코드 OCR 예제에서는 지원되는 바코드 형식과 혼합 콘텐츠 문서에 대한 구성 옵션을 다룹니다.
XImage.OCR API와IronOCR매핑 참조
| XImage.OCR | IronOCR에 상응하는 |
|---|---|
new OCRHandler() | new IronTesseract() |
RasterEdge.XImage.OCR.License.LicenseManager.SetLicense("key") | IronOcr.License.LicenseKey = "key" |
ocrHandler.Language = "eng" | ocr.Language = OcrLanguage.English |
ocrHandler.Languages = new[] { "eng", "deu" } | ocr.Language = OcrLanguage.English + OcrLanguage.German |
ocrHandler.Process(imagePath) | 코드-7285 (코드-7286 후) |
| 코드-7287 (객체에서) | 코드-7288 또는 코드-7289 |
ocrHandler.ProcessRegion(path, rect) | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
ocrHandler.SetVariable("tessedit_char_whitelist", "0-9") | ocr.Configuration.WhiteListCharacters = "0123456789" |
| 코드-7294 (일반 문자열) | result.Text |
result.MeanConfidence | result.Confidence |
| 동등한 것 없음 | 코드-7298 / 코드-7299 / 코드-7300 |
| 동등한 것 없음 | 코드-7301 (코드-7302, 코드-7303, 코드-7304와 함께) |
| 동등한 것 없음 | result.SaveAsSearchablePdf("output.pdf") |
| 동등한 것 없음 | input.Deskew() |
| 동등한 것 없음 | input.DeNoise() |
| 동등한 것 없음 | input.Contrast() |
| 동등한 것 없음 | input.Binarize() |
| 동등한 것 없음 | input.Sharpen() |
| 동등한 것 없음 | 코드-7311 (다중 프레임) |
| RasterEdge PDF SDK가 필요합니다. | input.LoadPdf(pdfPath) |
| RasterEdge PDF SDK가 필요합니다. | result.SaveAsSearchablePdf("output.pdf") |
| 사용 불가 | ocr.Configuration.ReadBarCodes = true |
| 스레드별 코드-7315 인스턴스 | 단일 공유 코드-7316 인스턴스 |
일반적인 마이그레이션 문제와 해결책
문제 1: 패키지 부분 업데이트 후 런타임 오류
XImage.OCR: 코드-7317이나 코드-7318을 오래된 패키지 캐시로 실행하면 코드-7319를 새 버전으로 발전시키면서 언어 팩은 이전 버전에 남게 될 수 있습니다. 이 오류는 런타임 중에 첫 번째 OCR 호출 시 발생하며, 오류 메시지에는 버전 불일치가 근본 원인임을 명확히 밝히지 않습니다. 불일치를 찾으려면 모든 코드-7320 항목을 수동으로 확인해야 합니다.
해결책: XImage.OCR 패키지를 제거하고 IronOCR을 설치한 후에는 버전 동기화를 유지할 필요가 없습니다. 단일 코드-7321 패키지가 모든 것을 포함합니다. 번들 기본값 이상의 언어 팩이 필요할 경우, 코드-7322 패키지를 독립적으로 설치하세요 — 코어와 버전 일치를 할 필요가 없습니다:
문제 2: 문자열 언어 코드로 인한 은밀한 OCR 오류
XImage.OCR: 언어 코드는 문자열입니다 (코드-7323, 코드-7324, 코드-7325). 언어 코드에서 오타가 발생하면 — 코드-7326, 코드-7327 대신 코드-7328 — 조용히 기본 언어로 돌아가거나 XImage.OCR 버전에 따라 런타임 예외를 발생시킵니다. 두 경우 모두 컴파일 시점에 감지되지 않습니다.
해결책: IronOCR은 코드-7329 열거형을 사용합니다. 잘못된 값은 컴파일 오류이지, 런타임 시 발생하는 예기치 못한 문제가 아닙니다. 문자열 배열을 열거형 표현식으로 변환:
// Before (XImage.OCR) — typos compile fine, fail at runtime
ocrHandler.Languages = new[] { "eng", "deu", "fra" };
// After (IronOCR) — typos are compile errors
ocr.Language = OcrLanguage.English + OcrLanguage.German + OcrLanguage.French;
여러 언어가 혼합된 문서의 경우, 주 언어와 보조 언어를 결합하는 방법에 대해서는 다국어 가이드를 참조하십시오.
문제 3: 바이트 배열 처리 후 디스크에 남아 있는 임시 파일
XImage.OCR: 바이트 배열에서 이미지를 처리하려면 코드-7330이 파일 경로를 수용하므로 임시 파일을 작성해야 합니다. 코드-7331 블록을 건너뛰는 예외 경로는 그 임시 파일들을 디스크에 남겨 둡니다. 처리량이 많은 애플리케이션에서는 이러한 데이터가 빠르게 누적됩니다.
해결책: 코드-7332는 코드-7333을 직접 수용합니다. 임시 파일이 생성되지 않습니다:
// Before (XImage.OCR) — temp file required
string tempPath = Path.GetTempFileName() + ".png";
File.WriteAllBytes(tempPath, imageBytes);
try { text = ocrHandler.Process(tempPath); }
finally { File.Delete(tempPath); }
// After (IronOCR) — direct byte array loading, no disk I/O
using var input = new OcrInput();
input.LoadImage(imageBytes);
var result = ocr.Read(input);
string text = result.Text;
이슈 4: 병렬 부하 시 메모리 고갈
XImage.OCR: 병렬 처리는 스레드당 하나의 코드-7334가 필요합니다. 5개 언어로 된 문서를 처리하는 8개의 스레드는 8개의 별도 엔진 인스턴스를 로드하며, 각 인스턴스는 5개 언어 팩을 모두 포함하고 있습니다. 언어당 인스턴스당 약 50MB의 메모리를 차지하는 8개의 스레드는 문서 데이터가 처리되기 전에도 OCR 엔진 메모리만 약 2GB를 소비합니다.
해결책: 단일 코드-7335 인스턴스가 모든 스레드를 처리합니다. 문서당 코드-7336을 생성하세요 (이것은 폐기 가능하고 가벼움), 애플리케이션 지속 시간 동안 코드-7337을 재사용하세요:
// Single instance — shared safely across all threads
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English + OcrLanguage.German +
OcrLanguage.French + OcrLanguage.Spanish + OcrLanguage.Italian;
Parallel.ForEach(documentPaths, path =>
{
using var input = new OcrInput(); // Per-document, lightweight
input.LoadImage(path);
var result = ocr.Read(input); // Thread-safe call on shared instance
ProcessResult(result.Text);
});
이슈 5: 부분 복원 후 CI/CD 파이프라인 중단
XImage.OCR: 패키지 캐시가 예열된 CI/CD 에이전트에는 종종 구버전의 XImage.OCR OCR 언어 팩이 캐시되어 있는 경우가 있습니다. 프로젝트 파일에서 핵심 패키지만 업데이트된 경우, 복원은 성공하지만 런타임에서는 일치하지 않는 어셈블리를 로드합니다. 빌드가 성공했습니다; 배포가 실패합니다.
해결책: IronOCR로 마이그레이션한 후, CI/CD 파이프라인이 하나의 패키지를 복원합니다. 예상되는 버전이 있는지 확인하기 위한 검증 단계를 추가하십시오:
# In your CI pipeline — verify single package restore
dotnet restore
dotnet list package | grep IronOcr
# 아니요 version coordination logic needed — only one package to check
문제 6: 다운스트림 파싱을 위한 구조화된 데이터 누락
XImage.OCR: 일반 문자열을 반환합니다. 단어 위치, 줄 그룹화 또는 단어별 신뢰도 정보가 필요한 애플리케이션은 공백 기반 휴리스틱 또는 사용자 정의 로직을 사용하여 문자열을 파싱해야 합니다. 다중 열 레이아웃, 표 또는 회전된 텍스트가 포함된 문서의 경우 이 파싱의 정확도가 떨어집니다.
해결책: IronOCR의 코드-7338은 전체 문서 계층을 직접 공개합니다. 문자열 구문 분석이 필요하지 않습니다.
var result = ocr.Read(input);
// Direct access to structured data — no string manipulation
foreach (var page in result.Pages)
{
foreach (var line in page.Lines)
{
// Line text, bounding box, and per-word data all available
Console.WriteLine($"Line [{line.X},{line.Y}]: {line.Text}");
foreach (var word in line.Words)
Console.WriteLine($" Word '{word.Text}' confidence: {word.Confidence}%");
}
}
정형화된 데이터 API의 전체 내용을 보려면 결과 읽기 방법 및 OCR 결과 기능 페이지를 참조하세요.
XImage.OCR 마이그레이션 체크리스트
사전 마이그레이션
변경 작업을 수행하기 전에 코드베이스를 감사하여 모든 XImage.OCR 관련 접점을 찾으십시오.
# Find all XImage.OCR namespace imports
grep -r "RasterEdge.XImage.OCR\|Yiigo.Image.Ocr\|XImage.OCR" --include="*.cs" .
# Find all OCRHandler usages
grep -r "OCRHandler\|ocrHandler" --include="*.cs" .
# Find all string-based language assignments
grep -r "\.Language\s*=\s*\"" --include="*.cs" .
grep -r "\.Languages\s*=\s*new\[\]" --include="*.cs" .
# Find all XImage.OCR package references in project files
grep -r "RasterEdge.XImage.OCR\|XImage.OCR.Language" --include="*.csproj" .
# Count distinct language packs installed
grep "XImage.OCR.Language" --include="*.csproj" -r . | wc -l
using 중인 이미지 소스 유형(파일 경로, 바이트 배열, 스트림, TIFF)을 기록하고, 바이트 배열 처리를 위해 임시 파일을 사용하는 위치를 파악하십시오. 이것들은 최우선 정화 대상입니다.
코드 마이그레이션
- 모든 코드-7339 및 코드-7340 패키지 참조를 각 코드-7341 파일에서 제거하세요.
- 코드-7342 패키지 참조를 추가하세요 (코드-7343).
- 모든 파일에서 코드-7344을 코드-7345로 교체하세요.
- 애플리케이션 시작 시(프로세스당 한 번) 코드-7346을 추가하세요.
- 코드-7347을 코드-7348로 교체하세요.
- 문자열 언어 할당(코드-7349, 코드-7350)을 코드-7351 열거형 값으로 교체하세요.
- 코드-7352를 코드-7353 + 코드-7354로 교체하세요.
- 바이트 배열에서 임시 파일로의 패턴을 코드-7355로 교체하세요.
- 다중 페이지 TIFF 수동 프레임 분할을 코드-7356으로 교체하세요.
- 코드-7357 스레드별 생성(코드-7358 루프)을 제거하세요 — 단일 공유 코드-7359 인스턴스를 사용하세요.
- 각 코드-7362 후에 전처리 호출(코드-7360, 코드-7361)을 추가하세요변동 품질 소스에서 온 문서에 대해.
- 일반 문자열 결과 처리를 코드-7363 텍스트용 또는 PDF 출력용 코드-7364로 교체하세요.
- 코드-7365를 코드-7366로 교체하세요.
- CI/CD 파이프라인 업데이트: 다중 패키지 복구 단계를 제거하고, 버전 동기화 로직을 제거하며, 단일 코드-7367 패키지 복구를 확인하세요.
마이그레이션 이후
- 기본 텍스트 추출 기능이 정상 작동하는 것으로 확인된 테스트 이미지를 사용하여 올바른 결과를 생성하는지 확인합니다.
- 다국어 문서가 설정된 모든 언어에 대한 텍스트를 반환하는지 확인합니다.
- 테스트 바이트 배열 입력 경로에서 디스크에 임시 파일이 생성되지 않고 올바른 출력이 생성됩니다.
- 다중 페이지 TIFF 문서가 코드-7368에서 올바른 페이지 수를 반환하는지 확인하세요.
- 부하 상태에서 병렬 배치 처리를 실행하고 최대 메모리 사용량을 측정합니다. 최대 메모리 사용량은 XImage.OCR 기준치보다 상당히 낮아야 합니다.
- 검색 가능한 PDF 출력물이 Adobe Acrobat 또는 PDF 뷰어에서 올바르게 열리고 텍스트를 선택할 수 있는지 확인합니다.
- 저품질 또는 왜곡된 스캔 이미지에서 전처리 테스트를 수행하고 추출된 텍스트 정확도를 XImage.OCR 기준선과 비교합니다.
- 라이선스 키 초기화가 첫 번째 OCR 호출 전에 실행되고 오류가 발생하지 않는지 확인합니다.
- 캐시된 패키지가 없는 깨끗한 환경에서 CI/CD 복원이 성공하는지 검증합니다.
- 구조화된 데이터 출력(코드-7369, 코드-7370)이 예상 문서 레이아웃과 일치하는지 확인하세요.
##IronOCR로 마이그레이션할 때의 주요 이점
단일 패키지로 전체 종속성 그래프를 대체합니다. 모든 코드-7371 패키지, 핵심 코드-7372 패키지, 그들 간의 버전 동기화 오버헤드는 하나의 코드-7373 명령으로 축소됩니다. 코드-7374 항목 수가 열한에서 하나로 줄어듭니다. CI/CD 복원 단계는 11개의 독립적인 오류 지점이 있는 다중 패키지 작업에서 단일 패키지 복원으로 변경됩니다. 이러한 간소화는 여러 가지 이점을 가져다줍니다. 보안 취약점을 감사해야 할 패키지 수가 줄어들고, .NET 호환성이 변경될 때 업데이트해야 할 항목 수도 줄어들며, 자동 업데이트 파이프라인에서 버전 조정 로직을 유지 관리할 필요가 없어집니다. IronOCR 제품 페이지 및 문서 허브에서 모든 기능 및 배포 참조 정보를 확인할 수 있습니다.
전처리 정확도 향상은 즉각적으로 이루어집니다. 이번 마이그레이션은 기존 시스템을 단순히 교체하는 것이 아니라 정확도를 향상시키는 것입니다. XImage.OCR이 기울기, 잡음 또는 낮은 해상도로 인해 정확도가 저하된 상태로 처리한 모든 문서는 이제 코드-7375, 코드-7376, 코드-7377을 통해 개선할 수 있는 직접적인 경로를 갖습니다. 외부 이미지 처리 라이브러리가 필요 없고, 개발팀에 이미지 처리 전문가가 없으며, 별도의 라이선스 및 유지 관리가 필요한 종속성도 없습니다. 코드-7378 이후 세 줄을 추가하면 이전에 '충분히 좋다'고 받아들인 문서에서 20~35 퍼센티지 포인트의 정확도를 회복할 수 있습니다. 이미지 품질 수정 가이드와 전처리 기능 페이지는 다양한 문서 품질 시나리오에 대한 각 필터의 효과를 다룹니다.
검색 가능한 PDF 및 구조화된 데이터로 추가 SDK 비용을 절감하세요. XImage.OCR 사용자가 가장 많이 요청하는 두 가지 기능인 검색 가능한 PDF 출력과 좌표가 포함된 단어 수준 데이터는 모두 별도의 상업용 라이선스가 필요한 RasterEdge 제품을 추가로 구매해야 합니다. 마이그레이션 후, 코드-7379은 추가 패키지 없이 보관 품질의 검색 가능 문서를 생성하고, 코드-7380/코드-7381는 바운딩 박스와 신뢰도 점수를 갖춘 구조화된 데이터를 제공합니다. 두 개의 라이선스가 필요했던 기능이 이제 하나의 라이선스로 제공됩니다. 전체 출력 형식에 대한 문서는 OCR 결과 기능 페이지 에서 확인할 수 있습니다.
병렬 처리는 메모리 사용량 증가 없이 확장 가능합니다. XImage.OCR의 스레드별 핸들러 모델은 확장에 많은 비용을 발생시킵니다. 스레드 수를 두 배로 늘리면 OCR 엔진 인스턴스가 사용하는 메모리도 두 배로 늘어납니다. IronOCR의 공유 인스턴스 모델은 병렬 처리 여부와 관계없이 메모리 사용량이 단일 인스턴스 수준으로 유지됨을 의미합니다. 8개의 동시 스레드로 문서 배치를 처리하는 서버는 한 번에 하나의 문서를 처리하는 서버와 동일한 OCR 엔진 메모리를 사용합니다. 이는 호스팅 비용 절감과 고정 인프라에서 처리량 여유 공간 확보로 직결됩니다.
코드 변경 없이 가능한 크로스 플랫폼 배포. 동일한 코드-7382 패키지와 동일한 애플리케이션 코드는 Windows, Linux, macOS, Docker, Azure App Service, AWS Lambda에서 실행됩니다. 플랫폼에 따라 달라지는 코드도 없고, 플랫폼별 패키지 변형도 없으며, OCR 레이어에 대한 환경별 배포 테스트도 필요 없습니다. 워크로드를 컨테이너화하거나, macOS 개발 환경을 운영하거나, Linux 기반 클라우드 인프라에 배포하는 팀은 즉각적인 호환성을 확보할 수 있습니다. Docker 배포 가이드 , Azure 배포 가이드 및 Linux 배포 가이드에는 각 대상 환경에 대한 설정 방법이 설명되어 있습니다.
125개 이상의 언어 지원으로 언어 지원 범위에 제한이 없어졌습니다. XImage.OCR은 상용 패키지 기준으로 최대 약 15개 언어까지만 지원합니다. 표준 tessdata 배포에는 100개 이상의 언어가 무료로 포함됩니다. IronOCR은 125개 이상의 언어를 묶어 제공하며, 해당 언어는 버전 잠금 제약 없이 깔끔한 설치 패턴을 따르는 선택적 코드-7383 패키지를 통해 노출됩니다. EU 24개 공식 언어, 주요 CJK 언어, 아랍어, 히브리어 및 특수 문자 체계를 모두 사용할 수 있습니다. 언어 목록 에는 지원되는 모든 언어와 해당 패키지 이름이 나열되어 있습니다.
