Patagames Tesseract.NET SDK에서
이 가이드는 .NET 개발자가 Patagames Tesseract .NET SDK에서 IronOCR 로 완전히 마이그레이션하는 과정을 안내합니다. 이 문서에서는 기계적 API 변환, 대부분의 마이그레이션을 이끄는 크로스 플랫폼 배포 활성화, 그리고 프로덕션 OCR 파이프라인을 Windows 전용 상용 래퍼에서 Windows, Linux, macOS, Docker, Azure 및 AWS에서 수정 없이 실행되는 라이브러리로 이전하는 데 필요한 실질적인 코드 변경 사항을 다룹니다.
Patagames Tesseract .NET SDK에서 마이그레이션해야 하는 이유는 무엇일까요?
Patagames를 대체할 제품을 평가하는 대다수 팀은 OCR 정확도에 불만이 없습니다. 그들은 배포 과정에서 난관에 부딪힙니다. 예를 들어 Linux 컨테이너 대상, 클라우드 마이그레이션 프로젝트 또는 Ubuntu 기반 CI 파이프라인에서 문제가 발생하고, Windows 전용 네이티브 바이너리가 해당 플랫폼에서 실행될 방법이 없다는 것을 알게 됩니다. 그 단 하나의 제약 조건이 나머지 마이그레이션 평가의 방향을 결정합니다.
Windows 전용 배포는 최신 .NET 스택을 차단합니다. Patagames는 Tesseract 엔진 래퍼용 Windows 네이티브 바이너리를 제공합니다. Linux x64, macOS 또는 ARM 런타임 패키지는 없습니다. 런타임에 OcrApi 클래스를 통해 Windows DLL을 로드합니다; 다른 운영 체제에서는 응용 프로그램이 시작되지 않습니다. Microsoft가 새로운 크로스 플랫폼 개발에 대해 공식적으로 지원하지 않는 것으로 표시한 System.Drawing.Bitmap 종속성을 추가하면, 이 라이브러리는 모든 클라우드 제공자와 컨테이너 오케스트레이터의 기본 배포 모델과 호환되지 않습니다.
플랫폼 간 호환성도 없이 무료 엔진에 대해 상업용 요금을 지불해야 합니다. Patagames의 기반이 되는 Tesseract 엔진은 오픈 소스이며 무료입니다. tesseractocr와 같은 무료 커뮤니티 래퍼는 오늘날에도 미리 빌드된 Windows 바이너리를 함께 제공하여 Patagames가 역사적으로 제공했던 주요 편리성을 제거합니다. Patagames의 상업용 라이선스를 구매하면 Tesseract 원본보다 약간 더 깔끔한 API 인터페이스를 얻을 수 있지만, 전처리, PDF 지원, 검색 가능한 PDF 출력 또는 크로스 플랫폼 배포와 같은 2026년 기준 완전한 OCR 라이브러리를 정의하는 네 가지 기능은 추가되지 않습니다.
불투명한 가격 책정으로 예산 계획이 불가능합니다. 파타가메스는 라이선스 가격을 공개하지 않습니다. 라이브러리를 평가하려면 비용 비교를 하기 전에 영업 담당자와 상담해야 합니다. IronOCR의 가격은 1년 업데이트가 포함된 영구적인 단일 개발자 Light 라이선스를 위한 $999에서 시작합니다. 팀은 영업 프로세스 없이도 비용 대비 성능을 평가할 수 있습니다. 자세한 등급 정보는 IronOCR 라이선스 페이지를 참조하십시오.
원시 Tesseract 변수 API를 통해 유출. Patagames에서 페이지 세분화 모드를 설정하려면 api.SetVariable("tessedit_pageseg_mode", "3")를 호출해야 합니다 — 인텔리센스도 없고, 컴파일 시간 확인도 없으며, 발견할 수 없는 원시 문자열 기반 Tesseract 변수 할당입니다. 변수 이름을 잘못 입력하면 해당 호출은 아무런 동작도 하지 않고 조용히 종료됩니다. IronOCR는 IronTesseract.Configuration에 강력한 형식의 속성으로 모든 Tesseract 구성 옵션을 래핑합니다.
평면 문자열 이상의 구조화된 출력 없음. Patagames GetTextFromImage은 단일 문자열로 반환됩니다. 단어 경계, 줄 바꿈, 단락 구조 또는 단어별 신뢰도 점수에 접근할 수 없습니다. 양식에서 특정 필드를 추출하거나 OCR 정확도를 단어 단위로 검증해야 하는 애플리케이션은 Patagames API를 기반으로 구축할 수 있는 기반이 없습니다.
CI/CD 파이프라인이 Linux 단계에서 문제가 발생합니다. 최신 .NET 개발 팀은 Linux에서 CI를 실행합니다. GitHub Actions, GitLab CI, Azure DevOps 모두 기본적으로 Linux 기반 러너를 사용합니다. Tesseract.Net.SDK를 참조하는 프로젝트는 일반적으로 네이티브 바이너리 참조를 빌드하지 못하거나 통합 테스트 중에 런타임에 실패합니다. 모든 테스트 실행에는 Windows 전용 CI 실행기가 필요하거나 OCR 레이어를 완전히 모킹하는 해결 방법이 필요합니다.
근본적인 문제
Patagames는 Windows만을 대상으로 합니다. 배포 대상이 변경되는 순간 라이브러리는 더 이상 따라가지 못합니다.
// Patagames: Windows DLL loads; fails on Linux container or macOS developer machine
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng"); // tessdata path — must be manually managed in every environment
using var bitmap = new Bitmap(imagePath); // System.Drawing — unsupported on non-Windows targets
return api.GetTextFromImage(bitmap);
// IronOCR: same code runs on Windows, Linux, macOS, Docker, Azure, AWS
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read(imagePath).Text;
tessdata 디렉터리가 없습니다. 네이티브 DLL 경로가 없습니다. 플랫폼 조건문이 없습니다. NuGet 종속성 그래프는 각 대상에 대해 올바른 런타임을 자동으로 결정합니다.
IronOCR과 Patagames Tesseract .NET SDK: 기능 비교
다음 표는 현재 Patagames를 운영 중인 팀에 필요한 기능을 다룹니다.
| 기능 | Patagames Tesseract .NET SDK | IronOCR |
|---|---|---|
| 윈도우 지원 | 예 | 예 |
| 리눅스 지원 | 아니요 | 예 |
| macOS 지원 | 아니요 | 예 |
| Docker 배포 | 아니요 | 예 |
| Azure 앱 서비스 | 아니요 | 예 |
| AWS Lambda | 아니요 | 예 |
| NuGet 패키지 | Tesseract.Net.SDK | IronOcr |
| 라이선스 모델 | 상업용 (가격 문의) | 영구적 ($999–$2,399, 공개) |
| OCR 엔진 | 테서랙트(오픈 소스) | 최적화된 Tesseract 5 (번들) |
| 테스데이터 관리 | 수동 .traineddata 파일 디렉토리 | NuGet 언어 패키지 |
| 자동 전처리 | None | 기울기 보정, 노이즈 제거, 대비 조정, 이진화, 선명도 향상, 크기 조정, 팽창, 침식 |
| 심도 있는 배경 소음 제거 | None | 예 (DeepCleanBackgroundNoise()) |
| 네이티브 PDF 입력 | 아니요 (외부 렌더러 필요) | 예 |
| 여러 페이지로 구성된 TIFF 입력 | 제한적 | 예 (input.LoadImageFrames()) |
| 검색 가능한 PDF 출력 | 아니요 | 예 (result.SaveAsSearchablePdf()) |
| hOCR 내보내기 | 아니요 | 예 |
| 지원되는 언어 | 테서랙트 테스데이터 파일 | NuGet 패키지를 통해 125개 이상 |
| 다국어 동시 | 예 (문자열 연결) | 예 (강력한 형식의 OcrLanguage 열거형) |
| 영역 기반 OCR | 아니요 | 예 (CropRectangle) |
| 바코드 판독 | 아니요 | 예 |
| 구조화된 출력 | 플랫 스트링만 | 페이지, 단락, 줄, 단어, 문자의 좌표 |
| 단어별 신뢰도 점수 | 아니요 | 예 |
| 페이지 분할 설정 | 원시 SetVariable 문자열 호출 | 강력한 형식의 Configuration.PageSegmentationMode |
| System.Drawing 종속성 | 필요함 | 선택적 |
| 스레드 안전성 | 표준 테서랙트 한계 | 전체 (스레드당 IronTesseract 생성) |
| 상업적 지원 | 예 | 예 |
| NuGet 다운로드 | 제한적 | 530만+ |
빠른 시작: Patagames Tesseract .NET SDK에서IronOCR로 마이그레이션
1단계: NuGet 패키지 교체
Patagames Tesseract .NET SDK를 제거하세요:
dotnet remove package Tesseract.Net.SDK
NuGet 에서IronOCR설치하세요.
영어가 아닌 다른 언어를 지원하려면 해당 언어 패키지를 설치하십시오.
단계 2: 네임스페이스 업데이트
Patagames 네임스페이스를IronOCR네임스페이스로 교체하십시오.
// Before (Patagames)
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing;
// After (IronOCR)
using IronOcr;
단계 3: 라이선스 초기화
애플리케이션 시작 시 라이선스 초기화 추가 (첫 번째 IronTesseract 호출 전에):
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"구매 없이 마이그레이션 테스트를 시작하기 위해 ironsoftware.com/C#/ocr/에서 무료 체험 라이선스를 사용할 수 있습니다.
코드 마이그레이션 예제
일괄 폴더 처리
1단계에서는 단일 이미지 추출을 시연했습니다. 프로덕션 Patagames 배포는 일반적으로 루프 내부에서 OcrApi를 초기화하고, 각 반복마다 api.Init()을 호출하여 tessdata를 다시 로드하고 각 파일마다 Tesseract 엔진을 재초기화합니다. 이 패턴은 수백 건의 문서에서 초기화 비용을 복합화합니다.
파타가메스 접근법:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
using System.IO;
public class PatagamesBatchProcessor
{
private const string TessDataPath = @"./tessdata";
public Dictionary<string, string> ProcessFolder(string folderPath)
{
var results = new Dictionary<string, string>();
foreach (var file in Directory.GetFiles(folderPath, "*.jpg"))
{
// OcrApi re-initialized per file — tessdata loaded each time
using var api = OcrApi.Create();
api.Init(TessDataPath, "eng");
using var bitmap = new Bitmap(file);
var text = api.GetTextFromImage(bitmap);
results[Path.GetFileName(file)] = text;
}
return results;
}
}
IronOCR 접근 방식:
// NuGet: IronOcr
using IronOcr;
using System.IO;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public class IronOcrBatchProcessor
{
public Dictionary<string, string> ProcessFolder(string folderPath)
{
var results = new Dictionary<string, string>();
// Single engine instance — initialized once, reused across all files
var ocr = new IronTesseract();
foreach (var file in Directory.GetFiles(folderPath, "*.jpg"))
{
var result = ocr.Read(file);
results[Path.GetFileName(file)] = result.Text;
}
return results;
}
}
IronOCR의 IronTesseract 인스턴스는 호출 간에 엔진 상태를 유지합니다. 전체 배치에 대해 하나의 인스턴스를 재사용하면 파일별 초기화 오버헤드가 없어지고 tessdata 경로 종속성이 완전히 제거됩니다. 여러 CPU 코어에서 병렬 배치 처리를 위해, 각 스레드마다 단일 인스턴스를 공유하는 대신 멀티스레딩 예제를 참조하십시오.
페이지 분할 모드 마이그레이션
Patagames는 문자열 키와 정수 값을 문자열로 캐스트하여 원시 SetVariable 호출을 통해 페이지 세분화 모드를 노출합니다. 인텔리센스도 없고, 열거형 유효성 검사도 없고, 호출 위치에 문서 힌트도 없습니다. 단 한 자리 숫자로 테서랙트가 입력을 단일 텍스트 블록, 열, 단어 또는 단일 문자로 처리할지 결정하며, 변수 이름을 잘못 입력해도 아무런 피드백이 없습니다.
파타가메스 접근법:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using Patagames.Ocr.Enums;
using System.Drawing;
public string OcrSingleLineField(string imagePath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
// Raw variable string — no IntelliSense, no validation
// PageSegmentationMode.SingleLine == 7
api.SetVariable("tessedit_pageseg_mode", "7");
// Additional variable to suppress dictionary output
api.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz -.:/");
using var bitmap = new Bitmap(imagePath);
return api.GetTextFromImage(bitmap);
}
IronOCR 접근 방식:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string OcrSingleLineField(string imagePath)
{
var ocr = new IronTesseract();
// Strongly typed enum — discoverable through IntelliSense
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine;
var result = ocr.Read(imagePath);
return result.Text;
}
Patagames가 SetVariable을 통해 노출하는 모든 Tesseract 구성 옵션은 IronTesseract.Configuration에서 직접 강력한 형식의 동일한 것이 있습니다. 이 마이그레이션은 명명된 열거형 값을 문자열 리터럴로 기계적으로 대체하는 작업입니다. 전체 구성 화면은 IronTesseract API 참조를 확인하세요. 특정 문서 읽기 가이드에서는 다양한 문서 유형에 각 페이지 분할 모드를 적용하는 시점을 설명합니다.
결과 반복자 패턴 교체
Patagames는 GetTextFromImage에서 평면 문자열을 반환합니다. Patagames 출력에서 개별 단어, 해당 단어의 경계 상자 또는 신뢰도 점수를 추출하려면 반환된 문자열 위에 파서를 작성하거나 상호 운용성을 통해 기본 Tesseract 결과 반복자 API에 직접 액세스해야 합니다. 두 접근 방식 모두 신뢰할 수 없고 유지 관리가 용이하지 않습니다. IronOCR는 문서 계층 구조의 모든 수준에 대한 네이티브 액세스가 있는 완전한 구조화된 OcrResult을 노출합니다.
파타가메스 접근법:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
public void ExtractWordsWithPositions(string imagePath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
using var bitmap = new Bitmap(imagePath);
// Flat string only — no word positions, no confidence, no line grouping
var text = api.GetTextFromImage(bitmap);
// Only option: split on whitespace and hope line breaks survive
var words = text.Split(new[] { ' ', '\n', '\r' },
StringSplitOptions.RemoveEmptyEntries);
foreach (var word in words)
{
// No X, Y, Width, Height — position information is lost
Console.WriteLine(word);
}
}
IronOCR 접근 방식:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public void ExtractWordsWithPositions(string imagePath)
{
var result = new IronTesseract().Read(imagePath);
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Width}x{page.Height}px");
foreach (var paragraph in page.Paragraphs)
{
Console.WriteLine($" Paragraph at ({paragraph.X}, {paragraph.Y})");
Console.WriteLine($" Text: {paragraph.Text}");
}
foreach (var word in page.Words)
{
// Bounding box, confidence, and text for every word
Console.WriteLine($" Word: '{word.Text}' at ({word.X},{word.Y}) " +
$"size {word.Width}x{word.Height} " +
$"confidence {word.Confidence:F1}%");
}
}
Console.WriteLine($"Overall confidence: {result.Confidence:F1}%");
}
완전한 OcrResult 구조 — 페이지, 단락, 줄, 단어 및 문자 —는 모든 후처리 구문 분석기가 필요하지 않습니다. 단어 좌표를 사용하면 위치를 기준으로 필드를 추출할 수 있으며, 이는 송장 처리, 양식 OCR 및 표 추출의 기초가 됩니다. 전체 계층 구조는 구조화된 결과 가이드를 참조하고, 신뢰도가 낮은 단어를 필터링하는 방법은 신뢰도 점수 가이드를 참조하세요.
다중 페이지 TIFF 처리
Patagames는 System.Drawing.Bitmap을 수용합니다. 다중 프레임 TIFF는 여러 개의 삽입된 이미지를 포함하지만 System.Drawing.Bitmap은 프레임을 자동으로 열거하지 않으므로 Image.SelectActiveFrame()을 사용하여 수동으로 단계를 진행해야 하며 각 프레임 비트맵을 루프에서 GetTextFromImage에 전달해야 합니다. 프레임 열거 API는 명확하지 않으며 실패 시 오류 메시지는 설명적이지 않습니다.
파타가메스 접근법:
// NuGet: Tesseract.Net.SDK
using Patagames.Ocr;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
public string ProcessMultiPageTiff(string tiffPath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
var sb = new StringBuilder();
using var tiffImage = Image.FromFile(tiffPath);
var frameCount = tiffImage.GetFrameCount(FrameDimension.Page);
for (int i = 0; i < frameCount; i++)
{
// Manual frame selection — FrameDimension.Page required
tiffImage.SelectActiveFrame(FrameDimension.Page, i);
using var frameBitmap = new Bitmap(tiffImage);
var pageText = api.GetTextFromImage(frameBitmap);
sb.AppendLine(pageText);
}
return sb.ToString();
}
IronOCR 접근 방식:
// NuGet: IronOcr
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string ProcessMultiPageTiff(string tiffPath)
{
using var input = new OcrInput();
// LoadImageFrames handles all frames automatically
input.LoadImageFrames(tiffPath);
// Optional: apply preprocessing to all frames at once
input.Deskew();
input.DeNoise();
var result = new IronTesseract().Read(input);
// Per-page access if needed
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Words.Length} words");
}
return result.Text;
}
OcrInput.LoadImageFrames()은 프레임 열거를 내부에서 처리하고 파이프라인에서 각 프레임에 전처리를 적용합니다. System.Drawing 프레임 선택 세레모니는 완전히 사라집니다. 특정 페이지만 필요한 경우 단일 프레임 선택을 포함한 추가 옵션은 TIFF 및 GIF 입력 가이드를 참조하십시오.
외부 렌더러 없이 PDF 입력
Patagames는 PDF를 기본적으로 지원하지 않습니다. Patagames 기반의 PDF OCR 파이프라인은 각 페이지를 Bitmap으로 변환한 후 GetTextFromImage에 전달하기 위해 외부 PDF 렌더링 라이브러리가 필요합니다 — PdfiumViewer, iText 또는 PDFSharp. 그러한 외부 종속성은 패키지 관리 오버헤드, 별도의 라이선스 고려 사항 및 2차 오류 발생 지점을 추가합니다. 라이브러리별로 렌더링 품질이 다르기 때문에 Tesseract 엔진과는 별개로 OCR 정확도에 영향을 미칩니다.
파타가메스 접근법:
// NuGet: Tesseract.Net.SDK + PdfiumViewer (external dependency)
using Patagames.Ocr;
using PdfiumViewer; // separate NuGet package required
using System.Drawing;
using System.Text;
public string OcrPdfDocument(string pdfPath)
{
using var api = OcrApi.Create();
api.Init(@"./tessdata", "eng");
var sb = new StringBuilder();
// External renderer required — Patagames has no PDF support
using var pdfDoc = PdfDocument.Load(pdfPath);
for (int page = 0; page < pdfDoc.PageCount; page++)
{
// Render at 300 DPI for acceptable OCR accuracy
using var img = pdfDoc.Render(page, 300, 300, false);
using var bitmap = new Bitmap(img);
var pageText = api.GetTextFromImage(bitmap);
sb.AppendLine(pageText);
}
return sb.ToString();
}
IronOCR 접근 방식:
// NuGet: IronOcr only — no external PDF renderer
using IronOcr;
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
public string OcrPdfDocument(string pdfPath)
{
using var input = new OcrInput();
input.LoadPdf(pdfPath);
// Preprocessing applies to every page in one call
input.Deskew();
var ocr = new IronTesseract();
var result = ocr.Read(input);
// Full per-page structured access
foreach (var page in result.Pages)
{
Console.WriteLine($"Page {page.PageNumber}: {page.Paragraphs.Length} paragraphs");
}
return result.Text;
}
하나의 NuGet 패키지로 두 개의 패키지를 대체할 수 있습니다. 렌더링 단계가 사라집니다. PDF 입력 가이드는 단일 페이지, 여러 페이지 및 암호로 보호된 PDF에 대한 내용을 다룹니다. 스캔한 PDF 파일에서 Ctrl+F로 검색 가능한 문서를 생성하는 검색 가능한 PDF 출력 워크플로의 경우, 검색 가능한 PDF 가이드 와 검색 가능한 PDF 예제에서 전체 파이프라인을 단 다섯 줄로 보여줍니다.
Patagames Tesseract .NET SDK API에서IronOCR매핑 참조로
| Patagames Tesseract .NET SDK | IronOCR에 상응하는 |
|---|---|
Tesseract.Net.SDK (NuGet 패키지) | IronOcr (NuGet 패키지) |
Patagames.Ocr (namespace) | IronOcr (namespace) |
Patagames.Ocr.Enums (namespace) | IronOcr (namespace) |
OcrApi.Create() | new IronTesseract() |
api.Init(tessDataPath, "eng") | ocr.Language = OcrLanguage.English (경로 없음) |
api.Init(path, "eng+fra+deu") | ocr.Language = OcrLanguage.English + OcrLanguage.French + OcrLanguage.German |
api.GetTextFromImage(bitmap) | ocr.Read(imagePath).Text |
api.SetVariable("tessedit_pageseg_mode", "7") | ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleLine |
api.SetVariable(key, value) (원시 변수) | ocr.Configuration.[TypedProperty] |
new Bitmap(imagePath) (입력 준비) | input.LoadImage(imagePath) |
OcrBitmap.FromFile(path) | input.LoadImage(path) |
| 멀티프레임 TIFF는 지원하지 않습니다. | input.LoadImageFrames(tiffPath) |
| PDF 입력 없음 | input.LoadPdf(pdfPath) 또는 ocr.Read(pdfPath) |
| 검색 가능한 PDF 없음 | result.SaveAsSearchablePdf("output.pdf") |
| 전처리 없음 | input.Deskew(), input.DeNoise(), input.Contrast(), input.Binarize() |
| 지역 OCR 없음 | input.LoadImage(path, new CropRectangle(x, y, w, h)) |
| 바코드 인식 불가 | ocr.Configuration.ReadBarCodes = true |
| 플랫 스트링 결과만 | result.Pages, result.Lines, result.Words, result.Paragraphs |
| 단어별 신뢰도 없음 | result.Words[i].Confidence, result.Confidence |
PageSegmentationMode 열거형 | TesseractPageSegmentationMode 열거형 |
| hOCR 내보내기 없음 | 결과 .ToHOcrString() 출력 |
| Windows x64/x86 전용 | 윈도우, 리눅스, macOS, Docker, Azure, AWS |
일반적인 마이그레이션 문제와 해결책
문제 1: 새 환경에서 Tessdata 디렉터리가 누락됨
Patagames: api.Init(@"./tessdata", "eng") 호출은 tessdata 디렉토리가 없거나 eng.traineddata 파일이 없으면 런타임에 실패합니다. 컨테이너 환경에서는 이는 빌드 시 경고 없이 배포 시에 발생하는 오류입니다. Docker에 배포하는 팀은 이미지를 이미 푸시한 후에야 이 문제를 발견하는 경우가 많습니다.
**해결책:**IronOCR tessdata 디렉터리 개념을 완전히 제거합니다. 언어 데이터를 NuGet 패키지로 설치합니다.
언어 데이터는 빌드 시 해결되어 dotnet publish 출력에 자동으로 포함됩니다. 잘못될 수 있는 경로가 없으며, 언어 파일에 대한 배포 체크리스트 항목도 없습니다.
문제 2: Linux에서 System.Drawing.Bitmap이 작동하지 않음
Patagames: System.Drawing.Bitmap 생성자는 Linux에서 libgdiplus이 시스템 패키지로 설치되지 않으면 TypeInitializationException 또는 PlatformNotSupportedException를 던집니다. libgdiplus이 존재하더라도, 배포간의 동작은 일관되지 않습니다. Microsoft는 새 개발에서 Windows가 아닌 플랫폼에서 System.Drawing을 사용하지 않도록 명시적으로 권장합니다.
**해결책:**IronOCR파일 경로, 바이트 배열 및 스트림을 직접 허용합니다. System.Drawing 종속성은 필요하지 않습니다:
// Replace this pattern:
using var bitmap = new Bitmap(imagePath); // fails without libgdiplus on Linux
api.GetTextFromImage(bitmap);
// With:
var result = new IronTesseract().Read(imagePath); // no System.Drawing required
바이트 배열 및 스트림을 포함한 모든 지원되는 입력 유형에 대한 자세한 내용은 이미지 입력 가이드를 참조하십시오.
문제 3: SetVariable 함수 실행 시 발생하는 오류(사일런트 오류)
Patagames: api.SetVariable("tessedit_pageseg_mode", someValue) 호출이 bool을 반환하지만 대부분의 호출자는 반환 값을 버립니다. 변수 이름이 잘못 입력되었거나 지원되지 않는 값이 전달될 경우, Tesseract는 아무런 경고 없이 기본값을 적용하고 계속 진행합니다. 결과적으로 발생하는 정확도 저하는 구성 호출과의 연관성을 추적하기 어렵습니다.
**해결책:**IronOCR구성 속성은 강력한 형식 지정을 지원합니다. 잘못된 할당은 런타임 기본값이 조용히 적용되는 것이 아니라 컴파일 오류를 발생시킵니다.
// Compile-time safety — no silent failures
var ocr = new IronTesseract();
ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.SingleBlock;
ocr.Configuration.TesseractVersion = TesseractVersion.Tesseract5; // also strongly typed
문제 4: 루프 내에서 OcrApi 초기화
Patagames: 처리 루프 내부에 OcrApi을 초기화하는 팀은 각 반복마다 tessdata 로딩 오버헤드를 초래합니다. 일반 패턴 — OcrApi.Create() 및 api.Init()이 foreach 내부 —는 스레드 격리 관점에서 올바르지만 수백 건의 문서를 처리할 때 비용이 많이 듭니다.
솔루션: 스레드당 하나의 IronTesseract를 생성하고 해당 스레드에 할당된 모든 문서에 걸쳐 재사용합니다. 인스턴스는 .Read() 호출 간에 무상태입니다:
// One instance, many reads — engine initialized once
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.English;
foreach (var file in imageFiles)
{
var text = ocr.Read(file).Text;
ProcessText(text);
}
병렬 배치 워크로드의 경우 작업당 하나의 인스턴스를 생성하십시오. 통과 조정 옵션으로 IronTesseract.Configuration.TesseractVersion를 포함한 몇 가지 스펙드 튜닝 옵션이 포함된 속도 최적화 가이드를 참조하십시오.
문제 5: Linux Docker 기본 이미지가 작동하지 않음
Patagames: Linux 호환 Patagames 바이너리가 없습니다. Linux Docker 컨테이너에서 Patagames 기반 애플리케이션을 실행하려는 모든 시도는 실패합니다. 유일한 해결 방법은 Windows 기반 컨테이너(FROM mcr.microsoft.com/windows/servercore)로, 이는 훨씬 크고, 다운로드 속도가 느리며, Linux 노드 풀을 사용하는 대부분의 Kubernetes 구성과 호환되지 않기 때문입니다.
**해결책:**IronOCR표준 Linux 기본 이미지를 지원합니다. Docker 배포 가이드에는 Dockerfile 구성 방법이 자세히 설명되어 있습니다.
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/publish .
# IronOCR resolves the Linux native runtime from NuGet automatically
ENTRYPOINT ["dotnet", "MyApp.dll"]
Windows 컨테이너는 필요하지 않습니다. 별도의 바이너리 배포판은 없습니다. 동일한 Docker 이미지가 모든 Linux 기반 컨테이너 호스트에서 실행됩니다.
문제 6: PDF OCR에는 두 개의 NuGet 패키지가 필요합니다.
Patagames: Patagames 애플리케이션에 PDF OCR 기능을 추가하려면 PDF 렌더링을 위한 두 번째 NuGet 패키지(PdfiumViewer, iTextSharp.LGPLv2.Core 또는 이와 유사한 패키지)가 필요합니다. 각 플랫폼은 고유한 라이선스 조건, 업데이트 주기 및 잠재적인 호환성 문제를 가지고 있습니다. PDF 렌더러 버전과 Patagames 버전이 충돌하는 경우, 두 팀 모두 협력하여 문제를 해결해야 합니다.
**해결책:**IronOCR별도의 패키지 없이 PDF 입력을 기본적으로 처리합니다. PDF 렌더러 종속성을 완전히 제거하십시오.
# Remove the PDF rendering shim
dotnet remove package PdfiumViewer
# IronOCR handles PDF natively
var result = new IronTesseract().Read("document.pdf");
Patagames Tesseract .NET SDK 마이그레이션 체크리스트
사전 마이그레이션
시작하기 전에 코드베이스를 검토하여 Patagames 관련 참조를 모두 확인하십시오.
# Find all files using Patagames namespaces
grep -r "Patagames.Ocr" --include="*.cs" . -l
# Find all OcrApi usage patterns
grep -r "OcrApi\|GetTextFromImage\|api\.Init\|SetVariable" --include="*.cs" .
# Find tessdata path references
grep -r "tessdata\|TessDataPath\|traineddata" --include="*.cs" .
# Find System.Drawing.Bitmap usage tied to OCR
grep -r "new Bitmap\|System\.Drawing" --include="*.cs" . -l
# Find any PDF rendering libraries used to feed Patagames
grep -r "PdfiumViewer\|iTextSharp\|PdfSharp" --include="*.csproj" .
문서: OcrApi.Create() 호출 사이트의 총 수, 서로 다른 api.Init() 언어 구성을 사용한 언어 구성을 기록한 각 배포 환경에 있는 tessdata 디렉토리 위치 및 Patagames 호출을 래핑한 System.Drawing 또는 ImageSharp에서 작성된 전처리 코드를 기록합니다.
코드 마이그레이션
- 모든 프로젝트에서
Tesseract.Net.SDKNuGet 패키지 참조를 제거하십시오. - Patagames에만 사용되던 모든 PDF 렌더링 NuGet 패키지(PdfiumViewer, iText 등) 제거.
IronOcrNuGet 패키지를 설치하십시오.IronOcr.Languages.English및 필요에 따라 다른 언어 패키지를 설치하십시오.- 애플리케이션 시작 시
IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"를 추가하십시오. using Patagames.Ocr;및using Patagames.Ocr.Enums;을using IronOcr;으로 교체하십시오.- 각
OcrApi.Create()+api.Init(path, lang)블록을new IronTesseract()+ocr.Language = OcrLanguage.[Language]로 교체하십시오. - 각
api.GetTextFromImage(bitmap)호출을ocr.Read(imagePath).Text로 교체하십시오(이전의Bitmap생성자를 제거). - 각
api.SetVariable("tessedit_pageseg_mode", value)호출을ocr.Configuration.PageSegmentationMode = TesseractPageSegmentationMode.[Value]으로 교체하십시오. - Patagames에 이미지를 전달하기 위해 존재하던 모든
System.Drawing.Bitmap인스턴스를 제거하십시오. - PDF 렌더링 루프를(있는 경우)
input.LoadPdf(pdfPath)로 교체하십시오. Image.SelectActiveFrame()을 사용하는 다중 프레임 TIFF 루프를input.LoadImageFrames(tiffPath)로 교체하십시오.- 사용자 맞춤형 전처리 코드(System.Drawing 리사이즈, 대비, 임계값)를 해당
OcrInput필터 호출로 교체하십시오. - 모든 배포 매니페스트, Dockerfile 및 CI 복사 단계에서 tessdata 디렉터리를 제거하십시오.
- 크로스 플랫폼 동작을 검증하기 위해 Linux CI 러너(GitHub Actions ubuntu-latest 등)에서 실행되도록 통합 테스트를 업데이트합니다.
마이그레이션 이후
- 크로스 플랫폼 배포 기능이 정상적으로 작동하는지 확인하기 위해 Windows뿐만 아니라 Linux에서도 전체 Suite를 실행하십시오.
- 동일한 테스트 이미지 세트를 사용하여 OCR 정확도가 Patagames 기준치와 같거나 더 높은지 확인하십시오.
- 다국어 문서가 올바른 출력을 생성하는지
OcrLanguage열거형 접근 방식을 사용하여 확인하십시오. - 외부 렌더링 라이브러리 없이 PDF 입력을 직접 테스트하고, 출력 정확도를 기존의 렌더링된 비트맵 방식과 비교하십시오.
- 다중 프레임 TIFF 처리 결과가 이전 프레임 열거 루프와 동일한 페이지 수 및 텍스트 내용을 생성하는지 확인하십시오.
- 배포 아티팩트에 tessdata 디렉터리가 포함되어 있지 않은지 확인하고, 런타임 경로 오류가 발생하지 않는지 확인하십시오.
linux/amd64을 대상으로 하는 Docker 빌드를 실행하고 컨테이너 내에서 최소한 하나의 OCR 호출을 수행하십시오.- CI 파이프라인(GitHub Actions, GitLab CI, Azure DevOps)이 기본 Linux 러너에서 성공적으로 완료되는지 확인하십시오.
- 결과에 신뢰도 점수가 표시되는지, 그리고 신뢰도 기반 필터링 로직이 예상대로 작동하는지 확인하십시오.
- 초기화 라이선스 키가 프로덕션 시작 코드에서 첫 번째
IronTesseract인스턴스가 생성되기 전에 실행되는지 확인하십시오.
IronOCR로 마이그레이션할 때의 주요 이점
코드 변경 없이 크로스 플랫폼 배포. 마이그레이션 후에는 동일한 바이너리가 Windows Server, Ubuntu Docker 컨테이너, macOS 개발자 머신, Linux 기반 Azure App Service, AWS Lambda에서 모두 실행됩니다. 플랫폼 조건문, 런타임 식별자 플래그, 운영 체제별 별도의 배포 아티팩트는 없습니다. 이전에 Windows 전용 OCR 라이브러리로 인해 차단되었던 클라우드 마이그레이션이 표준 컨테이너 배포로 전환됩니다. Linux, Docker, Azure 및 AWS 배포 가이드는 각 대상 환경에 대한 프로덕션 구성을 다룹니다.
Tessdata 관리가 운영 과정에서 사라집니다. tessdata 디렉터리(위치, 내용, 모든 환경에서의 존재 여부)는 더 이상 운영상의 고려 사항이 아닙니다. 언어 데이터는 NuGet 종속성으로 빌드 시 해결됩니다. dotnet publish 출력에 자동으로 포함됩니다. 새로운 언어를 추가할 때 업데이트해야 할 배포 런북이 없으며, tessdata 파일이 변경될 때 무효화해야 할 Docker 레이어도 없고, tessdata 누락으로 인한 프로덕션 사고를 조사할 필요도 없습니다.
구조화된 출력이 문자열 파싱을 대체합니다. 이전에 GetTextFromImage에서 평면 문자열을 구문 분석하여 필드를 추출하고, 내용을 확인하거나 신뢰도를 계산했던 응용 프로그램은 이제 OcrResult에서 직접 데이터에 액세스할 수 있습니다. WORD 좌표, 줄 경계, 단락 그룹화 및 WORD별 신뢰도 점수는 1급 속성입니다. 인보이스 처리 및 폼 OCR의 기초가 되는 경계 상자에 의한 필드 추출은 깨지기 쉬운 하위 문자열 검색이 아닌 직접 CropRectangle 호출입니다.
내장 전처리가 사용자 맞춤형 이미지 파이프라인을 대체합니다. Patagames의 내장 필터 부족을 보상하기 위해 작성된 전처리 코드는 OcrInput 메소드 호출로 대체될 수 있습니다. 기울기 보정, 노이즈 제거, 대비 강화, 이진화 및 해상도 정규화는 한 줄로 수행되는 작업입니다. 20-40시간 동안 System.Drawing 전처리 파이프라인을 구축하고 조정하는 데 시간을 보냈던 팀은 다섯 가지 메소드 호출과 함께 그 유지보수를 다른 곳으로 전환할 수 있습니다. 전체 필터 목록은 전처리 기능 개요를 참조하십시오.
기본 PDF 지원으로 의존성 클래스가 제거됩니다. Patagames의 PDF 기능 부족을 보완하기 위해 추가되었던 PDF 렌더링 라이브러리가 제거됩니다. 이전에는 Tesseract.Net.SDK, PDF 렌더러 및 공유되는 System.Drawing 종속성 간에 업데이트를 조정해야 했던 프로덕션 OCR 시스템은 이제 브리지 종속성이 없는 하나의 OCR 패키지를 가집니다. 암호로 보호된 문서와 다중 페이지 문서를 포함한 PDF 입력은 주요 입력 유형입니다. 컴플라이언스 및 기록 관리 용도를 위해, result.SaveAsSearchablePdf()은 추가 라이브러리 없이 한 번의 호출로 텍스트 레이어 PDF 출력을 생성합니다.
투명한 가격 책정 및 상업적 지원. IronOCR의 $999 영구 Lite 라이선스는 개발자 한 명과 배포 위치 한 곳을 포함하며 1년간의 업데이트가 포함됩니다. 가격은 공개되어 있으며, 요금제 구조가 명확하고, Enterprise 계약 없이도 상업적 지원을 이용할 수 있습니다. Windows 전용 Tesseract 래핑 서비스에 대해 Patagames의 요금을 지불하던 팀들은 이제 크로스 플랫폼 배포, 전처리, PDF 지원 및 125개 이상의 언어를 이용할 수 있게 되었으며, 평가가 완료되기 전에 비용을 미리 알 수 있는 가격 모델로 전환하게 됩니다. 전체 라이선스 등급에 대한 자세한 내용은 IronOCR 라이선싱을 참조하시고, 체험판 라이선스는 IronOCR 제품 페이지에서 확인하실 수 있습니다.
