푸터 콘텐츠로 바로가기
다른 구성 요소와 비교

IronOCR 과 Iris OCR 중 어떤 OCR 솔루션을 선택해야 할까요?

Azure Computer Vision의 Read API는 1,000 트랜잭션당 $1.00의 비용이 들고, 인지 서비스 리소스를 프로비저닝하기 위해 Azure 구독이 필요하며, 모든 OCR 호출을 세 단계의 비동기 작업 과정을 통해 수행해야 합니다: 문서를 BinaryData로 직렬화, AnalyzeAsync 호출, 그리고 텍스트를 재구성하기 위해 중첩된 블록과 라인을 이동. 이것이 최소한의 실행 가능한 경로이며, 여러 페이지로 구성된 PDF 파일의 각 페이지는 별도의 거래로 간주됩니다. IronOCR 이 모든 것을 하나의 동기 메서드 호출로 통합하고, 완전히 사용자 인프라 내에서 실행되며, 트랜잭션별 사용량 측정 기능이 없습니다.

Azure 컴퓨터 비전 이해하기

Azure Computer Vision은 Microsoft의 클라우드 기반 인지 서비스로, 두 개의 주요 API를 통해 OCR을 제공합니다: 이미지를 위한 Image Analysis API (ImageAnalysisClientVisualFeatures.Read 사용)와 PDF를 위한 Azure Form Recognizer의 DocumentAnalysisClient. 둘 다 Azure 데이터 센터에 호스팅되는 REST 기반 서비스이며, 각각 Azure.AI.Vision.ImageAnalysisAzure.AI.FormRecognizer.DocumentAnalysis NuGet 패키지를 통해 액세스됩니다.

주요 건축적 특징:

  • 클라우드 우선, 항상 : 모든 OCR 작업은 HTTPS를 통해 문서 데이터를 Microsoft에서 관리하는 서버로 전송합니다. 로컬 처리 모드는 없습니다.
  • 구독 필수 조건 : Teams는 OCR 코드를 한 줄이라도 작성하기 전에 Azure 계정을 생성하고, Cognitive Services 리소스를 프로비저닝하고, 엔드포인트 URL을 확보하고, API 키를 생성해야 합니다.
  • 페이지별 거래 요금 부과 : Read API는 이미지 또는 PDF 페이지당 요금을 부과합니다. 50페이지짜리 PDF 파일은 50건의 거래를 의미합니다. 가격은 최초 100만 건의 거래에 대해 1,000건당 1달러부터 시작하며, 거래량이 증가함에 따라 0.6달러, 그리고 0.4달러로 낮아집니다.
  • 무료 티어 사용량 제한 : 무료 티어에서는 월 5,000건의 거래가 허용됩니다. 이는 프로토타입 제작에는 충분하지만, 실제 운영 환경에는 적합하지 않습니다.
  • PDF용 분할 서비스: 기본 이미지 OCR은 ImageAnalysisClient을 사용합니다. 전체 PDF 처리는 별도의 서비스 — Form Recognizer의 DocumentAnalysisClient — 를 필요로 하며, 자체 엔드포인트 및 구성이 필요합니다.
  • 비동기 전용 설계 : 모든 읽기 API 호출은 비동기적으로 처리됩니다. 로컬 OCR은 결과를 동기적으로 반환할 수 있습니다. 클라우드 왕복은 불가능합니다. 체인의 모든 호출 방법은 async이어야 합니다.
  • 처리량 제한 : S1 등급은 초당 10건의 거래로 제한됩니다. 대용량 배치 처리를 위해서는 큐잉 로직을 사용하거나 계층 구조를 업그레이드해야 합니다.
  • 오류 발생 가능 영역 : 프로덕션 코드는 HTTP 429 속도 제한 응답, 5xx Azure 서비스 오류, 네트워크 시간 초과, 인증 실패 및 엔드포인트 가용성 문제를 처리해야 하며, 각 문제에는 별도의 재시도 로직이 필요합니다.

비동기 폴링 패턴

읽기 API의 비동기 요구 사항은 구조적인 코드 문제를 야기합니다. AnalyzeAsync를 사용한 이미지 분석은 즉시 반환되지만, await이 필요합니다; Form Recognizer를 통한 PDF 처리는 작업이 완료될 때까지 차단하기 위해 WaitUntil.Completed 또는 진정한 비동기 동작을 위해 UpdateStatusAsync를 사용한 사용자 정의 풀링이 필요합니다. 결과 계층 구조에서는 중첩된 루프를 통해 블록, 줄, 단어를 순회해야 합니다.

// Azure Computer Vision: image OCR
// Requires: Azure subscription + Cognitive Services resource + endpoint + API key
using Azure;
using Azure.AI.Vision.ImageAnalysis;

public class AzureOcrService
{
    private readonly ImageAnalysisClient _client;

    public AzureOcrService(string endpoint, string apiKey)
    {
        // Endpoint and key provisioned in Azure portal
        _client = new ImageAnalysisClient(
            new Uri(endpoint),
            new AzureKeyCredential(apiKey));
    }

    public async Task<string> ExtractTextAsync(string imagePath)
    {
        // Document is uploaded to Microsoft Azure
        using var stream = File.OpenRead(imagePath);
        var imageData = BinaryData.FromStream(stream);

        var result = await _client.AnalyzeAsync(
            imageData,
            VisualFeatures.Read);

        var text = new StringBuilder();
        foreach (var block in result.Value.Read.Blocks)
        {
            foreach (var line in block.Lines)
            {
                text.AppendLine(line.Text);
            }
        }

        return text.ToString();
    }
}
// Azure Computer Vision: image OCR
// Requires: Azure subscription + Cognitive Services resource + endpoint + API key
using Azure;
using Azure.AI.Vision.ImageAnalysis;

public class AzureOcrService
{
    private readonly ImageAnalysisClient _client;

    public AzureOcrService(string endpoint, string apiKey)
    {
        // Endpoint and key provisioned in Azure portal
        _client = new ImageAnalysisClient(
            new Uri(endpoint),
            new AzureKeyCredential(apiKey));
    }

    public async Task<string> ExtractTextAsync(string imagePath)
    {
        // Document is uploaded to Microsoft Azure
        using var stream = File.OpenRead(imagePath);
        var imageData = BinaryData.FromStream(stream);

        var result = await _client.AnalyzeAsync(
            imageData,
            VisualFeatures.Read);

        var text = new StringBuilder();
        foreach (var block in result.Value.Read.Blocks)
        {
            foreach (var line in block.Lines)
            {
                text.AppendLine(line.Text);
            }
        }

        return text.ToString();
    }
}
Imports Azure
Imports Azure.AI.Vision.ImageAnalysis
Imports System.IO
Imports System.Text
Imports System.Threading.Tasks

Public Class AzureOcrService
    Private ReadOnly _client As ImageAnalysisClient

    Public Sub New(endpoint As String, apiKey As String)
        ' Endpoint and key provisioned in Azure portal
        _client = New ImageAnalysisClient(
            New Uri(endpoint),
            New AzureKeyCredential(apiKey))
    End Sub

    Public Async Function ExtractTextAsync(imagePath As String) As Task(Of String)
        ' Document is uploaded to Microsoft Azure
        Using stream = File.OpenRead(imagePath)
            Dim imageData = BinaryData.FromStream(stream)

            Dim result = Await _client.AnalyzeAsync(
                imageData,
                VisualFeatures.Read)

            Dim text = New StringBuilder()
            For Each block In result.Value.Read.Blocks
                For Each line In block.Lines
                    text.AppendLine(line.Text)
                Next
            Next

            Return text.ToString()
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

PDF 처리는 복잡성을 더 escalates — 자체 엔드포인트가 있는 별도의 DocumentAnalysisClient, AnalyzeDocumentAsyncWaitUntil.Completed, 그리고 result.Pagespage.Lines을 사용해 .Text 대신 .Content에 접근하는 다른 결과 모양.

IronOCR이해하기

IronOCR 은 .NET 용 상용 온프레미스 OCR 라이브러리로, 단일 NuGet 패키지로 제공됩니다. 이 라이브러리는 최적화된 Tesseract 5 엔진을 기반으로 자동 전처리, 네이티브 PDF 지원, 클라우드 자격 증명이나 엔드포인트 구성, 비동기 처리가 필요 없는 동기 API를 제공합니다.

주요 특징:

  • 단일 NuGet 배포: dotnet add package IronOcr은 모든 것을 설치합니다 — OCR 엔진, 네이티브 바이너리 및 영어용 언어 데이터. tessdata 폴더도 없고, 별도의 네이티브 라이브러리 다운로드도 필요 없습니다.
  • 영구 라이선스: $999 라이트 / $1,499 플러스 / $2,999 프로페셔널 / $5,999 무제한 — 일회성 구매, 구독 아님. 문서 수에 관계없이 문서당 수수료는 없습니다.
  • 로컬 처리 : 모든 OCR 실행은 사용자 프로세스 내에서 이루어집니다. 문서는 절대 귀사의 인프라를 벗어나지 않습니다.
  • 자동 전처리: 기울기 보정, 노이즈 제거, 대비 조정, 이진화 및 해상도 향상이 OcrInput에 대한 명시적 필터 호출을 통해 자동 또는 적용됩니다.
  • 네이티브 PDF 지원: IronTesseract.Read("document.pdf")은 별도의 서비스 또는 추가 NuGet 패키지 없이 PDF를 직접 처리하며, 비밀번호로 보호된 파일도 포함합니다.
  • 125개 이상의 언어: 별도 언어 NuGet 패키지를 통해 설치됨 — IronOcr.Languages.French, IronOcr.Languages.ChineseSimplified 등 — 수동으로 tessdata 관리 필요 없음.
  • 스레드 안전성: IronTesseract은 동시에 사용하기에 안전합니다. 배치 작업은 추가 동기화 없이 Parallel.ForEach을 사용할 수 있습니다.
  • 구조적 출력: OcrResult.Pages, .Paragraphs, .Lines, .Words, 그리고 .Barcodes 컬렉션을 노출하며, 각 요소 좌표, 신뢰 점수 및 경계 사각형을 갖추고 있습니다.

기능 비교

기능 Azure 컴퓨터 비전 IronOCR
처리 위치 마이크로소프트 Azure 클라우드 현지, 현장
가격 모델 거래당 (현재 가격에 대해 Microsoft에 문의) 영구 라이선스 ($999+)
인터넷 연결 필요 항상 필요 아니요
PDF 지원 폼 인식기(별도)를 통해 내장형, 네이티브
설정 복잡성 Azure 계정 + 리소스 + 키 NuGet 설치
API 패턴 비동기(클라우드 I/O) 동기식(로컬)
요금 제한 10 TPS(S1) 하드웨어 제약 전용

상세 기능 비교

기능 Azure 컴퓨터 비전 IronOCR
설정 및 배포
NuGet 설치 다중 패키지 dotnet add package IronOcr
자격 증명 구성 엔드포인트 URL + API 키 라이선스 키 문자열
Azure 구독이 필요합니다. 아니요
인터넷 연결 필요 네, 모든 요청 아니요
에어갭 배포 불가능 완전히 지원
Docker 배포 아웃바운드 네트워크가 필요합니다. 자급자족
OCR 기능
이미지 OCR 네 (AnalyzeAsync) 네 (Read())
PDF OCR 폼 인식기(추가 서비스)를 통해 네이티브, 내장형
비밀번호로 보호된 PDF 형태 인식기를 통해 단일 Password: 매개변수
여러 페이지로 구성된 PDF 파일 (페이지별 청구) 네, 페이지당 하나의 거래가 성립됩니다. 페이지당 비용 없음
검색 가능한 PDF 출력 수동 제작 SaveAsSearchablePdf()
자동 전처리 제한된 서버 측 기울기 보정, 노이즈 제거, 대비 조정, 이진화
OCR 중 바코드 판독 제한적 ReadBarCodes = true
영역 기반 OCR 직접 자르지 마세요 (수동으로 자르기) CropRectangle on OcrInput
언어 지원
언어 개수 164+ 125+
언어 설치 서비스 수준 (클라우드에서 처리) NuGet 언어 팩
여러 언어를 동시에 사용 네 (AddSecondaryLanguage)
출력 및 구조
일반 텍스트
단어별 경계 상자 다각형 기반 직사각형 기반
단어별 신뢰도 점수 예 (0-100 척도)
구조화된 계층 블록 / 선 / 단어 페이지/단락/줄/단어
hOCR 내보내기 아니요 네 (SaveAsHocrFile)
비용 및 규정 준수
문서당 비용 페이지당 0.001달러 (양식 인식기) None
HIPAA를 준수하는 배포 복합(BAA + 클라우드) 간단함 (현지에서만 가능)
ITAR 적합성 통제된 데이터에는 사용하지 마십시오. 완전 온프레미스
FedRAMP 에어갭 아니요
신뢰할 수 있음
네트워크 장애 모드 None
속도 제한 오류 예 (초당 10건의 TPS에서 429건) None
서비스 가용성 SLA 99.9%(Azure) 귀사의 인프라

비용 모델

Azure Computer Vision과IronOCR간의 거래 가격 차이는 대량 생산 단계에서 결정적인 요소가 됩니다. Azure 소스 파일의 비용 계산기는 계산 과정을 정확하게 보여줍니다.

Azure 컴퓨터 비전 접근 방식

Azure는 볼륨에 기반한 계층적 가격으로 거래당 청구합니다. Azure Computer Vision 요금 페이지에서 현재 요금을 확인하세요. PDF 페이지 하나하나가 하나의 거래를 나타냅니다. 10페이지짜리 PDF 파일은 10건의 유료 통화에 해당합니다. 무료 티어로 월 5,000건의 거래가 제공됩니다.

// Azure bills per transaction — costs grow with every document processed
// Free tier: 5,000 transactions/month
// Volume tiers apply at higher usage levels
// (Every PDF page multiplies the bill)
// Azure bills per transaction — costs grow with every document processed
// Free tier: 5,000 transactions/month
// Volume tiers apply at higher usage levels
// (Every PDF page multiplies the bill)
' Azure bills per transaction — costs grow with every document processed
' Free tier: 5,000 transactions/month
' Volume tiers apply at higher usage levels
' (Every PDF page multiplies the bill)
$vbLabelText   $csharpLabel

중간에서 높은 문서 볼륨에서IronOCR영구 라이선스는 지속적인 Azure 거래 비용과 비교하여 빠르게 비용을 회수하며, 그 이후의 추가 문서는 모두 절약입니다.

IronOCR접근법

IronOCR의 가격 모델 은 단일 숫자입니다. NuGet 패키지를 설치하고 라이선스 키를 설정하면 카운터 기록 없이 모든 볼륨을 처리할 수 있습니다.

// Install: dotnet add package IronOcr
// License: one-time, perpetual

IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

var ocr = new IronTesseract();

// Process 1 document or 1 million — same cost
foreach (var path in documentPaths)
{
    var result = ocr.Read(path);
    Console.WriteLine($"Processed: {path}");
}

// Multi-page PDFs — no per-page billing
foreach (var path in pdfPaths)
{
    // 1 page or 100 pages, still no extra cost
    var result = ocr.Read(path);
    Console.WriteLine($"{path}: {result.Pages.Length} pages processed");
}
// Install: dotnet add package IronOcr
// License: one-time, perpetual

IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

var ocr = new IronTesseract();

// Process 1 document or 1 million — same cost
foreach (var path in documentPaths)
{
    var result = ocr.Read(path);
    Console.WriteLine($"Processed: {path}");
}

// Multi-page PDFs — no per-page billing
foreach (var path in pdfPaths)
{
    // 1 page or 100 pages, still no extra cost
    var result = ocr.Read(path);
    Console.WriteLine($"{path}: {result.Pages.Length} pages processed");
}
' Install: dotnet add package IronOcr
' License: one-time, perpetual

IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")

Dim ocr As New IronTesseract()

' Process 1 document or 1 million — same cost
For Each path In documentPaths
    Dim result = ocr.Read(path)
    Console.WriteLine($"Processed: {path}")
Next

' Multi-page PDFs — no per-page billing
For Each path In pdfPaths
    ' 1 page or 100 pages, still no extra cost
    Dim result = ocr.Read(path)
    Console.WriteLine($"{path}: {result.Pages.Length} pages processed")
Next
$vbLabelText   $csharpLabel

계량도 필요 없고, 사용량 추적도 필요 없고, 예산 알림도 필요 없습니다. 첫날부터 예측 가능한 비용. 이미지에서 텍스트를 읽는 방법에 대한 자세한 시작 가이드는 해당 튜토리얼 을 참조하세요.

데이터 주권 및 오프라인 기능

클라우드 OCR의 규정 준수 관련 문제는 이론적인 것이 아닙니다. Azure Computer Vision에서 처리하는 모든 문서는 조직 경계를 넘나듭니다. Azure README 문서에는 영향을 받는 특정 규제 프레임워크가 명시되어 있습니다. 여기에는 HIPAA 적용 대상 기관, ITAR 방위 계약업체, CMMC 인증 조직, GDPR 규제를 받는 유럽 기업 및 에어갭 네트워크에서의 모든 운영이 포함됩니다.

Azure 컴퓨터 비전 접근 방식

지역별 엔드포인트 선택 및 비즈니스 파트너 계약 체결이 이루어졌더라도 데이터 흐름은 고정되어 있습니다.

// Azure: data flow for every OCR call
// 1. Your application reads the file
// 2. File is serialized to BinaryData
// 3. HTTPS transmission to Azure data center
// 4. Microsoft infrastructure processes the document
// 5. Result returned over HTTPS
// 6. You parse the result

using var stream = File.OpenRead(imagePath);
var imageData = BinaryData.FromStream(stream);  // Document in memory

// This call transmits your document to Azure
var result = await _client.AnalyzeAsync(
    imageData,           // Document leaves your network here
    VisualFeatures.Read);
// Azure: data flow for every OCR call
// 1. Your application reads the file
// 2. File is serialized to BinaryData
// 3. HTTPS transmission to Azure data center
// 4. Microsoft infrastructure processes the document
// 5. Result returned over HTTPS
// 6. You parse the result

using var stream = File.OpenRead(imagePath);
var imageData = BinaryData.FromStream(stream);  // Document in memory

// This call transmits your document to Azure
var result = await _client.AnalyzeAsync(
    imageData,           // Document leaves your network here
    VisualFeatures.Read);
Imports System.IO
Imports Azure.AI.FormRecognizer.DocumentAnalysis

' Azure: data flow for every OCR call
' 1. Your application reads the file
' 2. File is serialized to BinaryData
' 3. HTTPS transmission to Azure data center
' 4. Microsoft infrastructure processes the document
' 5. Result returned over HTTPS
' 6. You parse the result

Using stream As FileStream = File.OpenRead(imagePath)
    Dim imageData As BinaryData = BinaryData.FromStream(stream) ' Document in memory

    ' This call transmits your document to Azure
    Dim result = Await _client.AnalyzeAsync(
        imageData,           ' Document leaves your network here
        VisualFeatures.Read)
End Using
$vbLabelText   $csharpLabel

네트워크가 완전히 분리된 경우 엔드포인트 URL에 전혀 접근할 수 없습니다. Azure Computer Vision에는 오프라인 모드가 없기 때문입니다. 기밀정보보호시설(SCIF), 군사시설 또는 격리된 처리 환경을 운영하는 조직의 경우, 가격과 관계없이 해당 서비스는 아키텍처적으로 호환되지 않습니다.

IronOCR접근법

IronOCR 통화 프로세스 내에서 문서를 처리합니다. 외부 연결이 없습니다.

// IronOCR: data never leaves your infrastructure
using IronOcr;

public class OnPremiseOcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string imagePath)
    {
        // Runs entirely in-process
        // 아니요 network call, no serialization to external endpoint
        var result = _ocr.Read(imagePath);
        return result.Text;
    }

    public string ExtractFromPdf(string pdfPath)
    {
        // PDF processed entirely on-premise, native support
        using var input = new OcrInput();
        input.LoadPdf(pdfPath);
        return _ocr.Read(input).Text;
    }

    public string ExtractFromEncryptedPdf(string pdfPath, string password)
    {
        // Encrypted PDFs also stay local
        using var input = new OcrInput();
        input.LoadPdf(pdfPath, Password: password);
        return _ocr.Read(input).Text;
    }
}
// IronOCR: data never leaves your infrastructure
using IronOcr;

public class OnPremiseOcrService
{
    private readonly IronTesseract _ocr = new IronTesseract();

    public string ExtractText(string imagePath)
    {
        // Runs entirely in-process
        // 아니요 network call, no serialization to external endpoint
        var result = _ocr.Read(imagePath);
        return result.Text;
    }

    public string ExtractFromPdf(string pdfPath)
    {
        // PDF processed entirely on-premise, native support
        using var input = new OcrInput();
        input.LoadPdf(pdfPath);
        return _ocr.Read(input).Text;
    }

    public string ExtractFromEncryptedPdf(string pdfPath, string password)
    {
        // Encrypted PDFs also stay local
        using var input = new OcrInput();
        input.LoadPdf(pdfPath, Password: password);
        return _ocr.Read(input).Text;
    }
}
Imports IronOcr

Public Class OnPremiseOcrService
    Private ReadOnly _ocr As New IronTesseract()

    Public Function ExtractText(imagePath As String) As String
        ' Runs entirely in-process
        ' 아니요 network call, no serialization to external endpoint
        Dim result = _ocr.Read(imagePath)
        Return result.Text
    End Function

    Public Function ExtractFromPdf(pdfPath As String) As String
        ' PDF processed entirely on-premise, native support
        Using input As New OcrInput()
            input.LoadPdf(pdfPath)
            Return _ocr.Read(input).Text
        End Using
    End Function

    Public Function ExtractFromEncryptedPdf(pdfPath As String, password As String) As String
        ' Encrypted PDFs also stay local
        Using input As New OcrInput()
            input.LoadPdf(pdfPath, Password:=password)
            Return _ocr.Read(input).Text
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

Docker 배포를 사용하면 외부 네트워크 요구 사항이 완전히 제거됩니다.

FROM mcr.microsoft.com/dotnet/aspnet:8.0
RUN apt-get update && apt-get install -y libgdiplus
WORKDIR /app
COPY --from=build /app/publish .
ENV IRONOCR_LICENSE=your-key
# 아니요 Azure endpoint, no API key, no outbound network rules needed
ENTRYPOINT ["dotnet", "YourApp.dll"]

HIPAA 적용 대상 기관, ITAR 규정 준수 또는 FedRAMP 에어갭 시나리오의 경우,IronOCR제3자 데이터 처리자 위험이라는 범주 전체를 제거합니다. 문서를 컴퓨팅 인스턴스에 로컬로 유지하면서 Azure 인프라 내에서IronOCR실행하는 방법에 대한 Azure 배포 가이드를 참조하고, 컨테이너 구성에 대한 Docker 배포 가이드를 참조하십시오.

동기식 API 설계와 비동기식 API 설계 비교

Azure 읽기 API는 동기식으로 작동할 수 없기 때문에 비동기식으로 작동합니다. 클라우드 I/O에는 네트워크 지연 시간이 발생하기 때문입니다. IronOCR은 로컬에서 처리되며 동기적으로 반환될 수 있어 호출 코드를 단순화하고, 호출 스택을 통한 async 전파를 제거하며, 네트워크 I/O에 고유한 실패 모드를 제거합니다.

Azure 컴퓨터 비전 접근 방식

모든 Azure OCR 호출에는 await이 필요합니다. 운영 코드에 429 속도 제한 오류 및 5xx 서비스 오류에 대한 재시도 로직이 추가되었습니다. 최소한의 실제 운영 구현은 다음과 같습니다.

public async Task<string> RobustExtractAsync(string imagePath)
{
    const int maxRetries = 3;
    int attempt = 0;

    while (attempt < maxRetries)
    {
        try
        {
            using var stream = File.OpenRead(imagePath);
            var imageData = BinaryData.FromStream(stream);

            var result = await _client.AnalyzeAsync(
                imageData,
                VisualFeatures.Read);

            return string.Join("\n",
                result.Value.Read.Blocks
                    .SelectMany(b => b.Lines)
                    .Select(l => l.Text));
        }
        catch (RequestFailedException ex) when (ex.Status == 429)
        {
            // Rate limited — Azure caps S1 at 10 TPS
            attempt++;
            await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
        }
        catch (RequestFailedException ex) when (ex.Status >= 500)
        {
            // Azure service error
            attempt++;
            await Task.Delay(TimeSpan.FromSeconds(1));
        }
        catch (RequestFailedException ex)
        {
            // Client error — bad credential, invalid endpoint
            throw new Exception($"Azure OCR failed: {ex.Message}", ex);
        }
    }

    throw new Exception("Max retries exceeded for Azure OCR");
}
public async Task<string> RobustExtractAsync(string imagePath)
{
    const int maxRetries = 3;
    int attempt = 0;

    while (attempt < maxRetries)
    {
        try
        {
            using var stream = File.OpenRead(imagePath);
            var imageData = BinaryData.FromStream(stream);

            var result = await _client.AnalyzeAsync(
                imageData,
                VisualFeatures.Read);

            return string.Join("\n",
                result.Value.Read.Blocks
                    .SelectMany(b => b.Lines)
                    .Select(l => l.Text));
        }
        catch (RequestFailedException ex) when (ex.Status == 429)
        {
            // Rate limited — Azure caps S1 at 10 TPS
            attempt++;
            await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)));
        }
        catch (RequestFailedException ex) when (ex.Status >= 500)
        {
            // Azure service error
            attempt++;
            await Task.Delay(TimeSpan.FromSeconds(1));
        }
        catch (RequestFailedException ex)
        {
            // Client error — bad credential, invalid endpoint
            throw new Exception($"Azure OCR failed: {ex.Message}", ex);
        }
    }

    throw new Exception("Max retries exceeded for Azure OCR");
}
Imports System.IO
Imports System.Threading.Tasks

Public Async Function RobustExtractAsync(imagePath As String) As Task(Of String)
    Const maxRetries As Integer = 3
    Dim attempt As Integer = 0

    While attempt < maxRetries
        Try
            Using stream = File.OpenRead(imagePath)
                Dim imageData = BinaryData.FromStream(stream)

                Dim result = Await _client.AnalyzeAsync(
                    imageData,
                    VisualFeatures.Read)

                Return String.Join(vbCrLf,
                    result.Value.Read.Blocks _
                        .SelectMany(Function(b) b.Lines) _
                        .Select(Function(l) l.Text))
            End Using
        Catch ex As RequestFailedException When ex.Status = 429
            ' Rate limited — Azure caps S1 at 10 TPS
            attempt += 1
            Await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, attempt)))
        Catch ex As RequestFailedException When ex.Status >= 500
            ' Azure service error
            attempt += 1
            Await Task.Delay(TimeSpan.FromSeconds(1))
        Catch ex As RequestFailedException
            ' Client error — bad credential, invalid endpoint
            Throw New Exception($"Azure OCR failed: {ex.Message}", ex)
        End Try
    End While

    Throw New Exception("Max retries exceeded for Azure OCR")
End Function
$vbLabelText   $csharpLabel

이는 과도한 방어적 설계가 아니라, 프로덕션 환경에서 Azure API 호출에 필요한 최소 요구 사항입니다. 사용량 제한, 서비스 중단 및 일시적인 오류는 모든 Azure 사용자가 실제로 겪게 될 상황입니다.

IronOCR접근법

로컬 처리는 네트워크 장애 발생 가능성을 제거합니다. 오류 처리 범위는 파일 시스템 및 입력 유효성 검사로 좁혀집니다.

// 아니요 async required — local processing returns synchronously
public string ExtractText(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);
    return result.Text;
}

// One line for simple cases
public string OneLineOcr(string imagePath)
{
    return new IronTesseract().Read(imagePath).Text;
}

// Confidence-aware extraction
public (string Text, double Confidence) ExtractWithConfidence(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);
    return (result.Text, result.Confidence);
}
// 아니요 async required — local processing returns synchronously
public string ExtractText(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);
    return result.Text;
}

// One line for simple cases
public string OneLineOcr(string imagePath)
{
    return new IronTesseract().Read(imagePath).Text;
}

// Confidence-aware extraction
public (string Text, double Confidence) ExtractWithConfidence(string imagePath)
{
    var result = new IronTesseract().Read(imagePath);
    return (result.Text, result.Confidence);
}
' 아니요 async required — local processing returns synchronously
Public Function ExtractText(imagePath As String) As String
    Dim result = New IronTesseract().Read(imagePath)
    Return result.Text
End Function

' One line for simple cases
Public Function OneLineOcr(imagePath As String) As String
    Return New IronTesseract().Read(imagePath).Text
End Function

' Confidence-aware extraction
Public Function ExtractWithConfidence(imagePath As String) As (Text As String, Confidence As Double)
    Dim result = New IronTesseract().Read(imagePath)
    Return (result.Text, result.Confidence)
End Function
$vbLabelText   $csharpLabel

아이템 없음 — 반복 시도 루프 없음, 배치 작업을 위한 Task.WhenAll 조정 없음. 비동기 컨트롤러 파이프라인과의 통합을 위해 비동기가 필요하면 Task.Run(() => ocr.Read(path))가 OCR 논리 자체에 구조적 변경 없이 동기 호출을 래핑합니다. IronTesseract API 참조 문서 에는 전체 동기 인터페이스가 설명되어 있습니다. 비동기 패턴이 진정으로 필요한 워크로드의 경우,IronOCR전용 비동기 OCR 가이드 도 제공합니다.

자격 증명 및 엔드포인트 구성

Azure Computer Vision은 첫 번째 테스트 전에 프로비저닝 인프라가 필요합니다.IronOCR NuGet 설치가 필요하며 선택적으로 라이선스 키 문자열이 필요합니다.

Azure 컴퓨터 비전 접근 방식

OCR 코드를 작성하기 전 Azure 설정 순서:

  1. Azure 계정이 없으면 계정을 생성합니다.
  2. Azure 포털로 이동하여 Cognitive Services 리소스(또는 Azure AI Services 리소스)를 생성합니다.
  3. 가격 등급과 지역을 선택하세요.
  4. 엔드포인트 URL을 복사합니다 (형식: https://your-resource.cognitiveservices.azure.com/).
  5. 두 개의 API 키 중 하나를 복사합니다.
  6. 두 값을 안전하게 저장하세요 — 환경 변수, Azure Key Vault, 또는 appsettings.json (비생산 용도에 한함).
  7. Azure.AI.Vision.ImageAnalysis을 NuGet을 통해 설치합니다.
  8. 엔드포인트 및 자격 증명을 사용하여 ImageAnalysisClient를 초기화합니다.

PDF 처리를 위해, 다른 NuGet 패키지(Azure.AI.FormRecognizer)와 다른 클라이언트 클래스(DocumentAnalysisClient)와 함께 Form Recognizer 리소스에 대해 단계 2-8을 반복합니다.

appsettings.json는 엔드포인트와 키를 저장합니다:

{
  "Azure": {
    "ComputerVision": {
      "Endpoint": "https://your-resource.cognitiveservices.azure.com/",
      "ApiKey": "your-api-key"
    }
  }
}

API 키 순환, 자격 증명 만료 처리, 그리고 개발, 스테이징, 프로덕션 환경 전반에 걸친 엔드포인트 URL 관리는 로컬 처리로는 불가능한 지속적인 운영 작업입니다.

IronOCR접근법

IronTesseract 설치 가이드는 설치 과정을 단 두 단계로 간소화합니다.

dotnet add package IronOcr
// Set once at application startup — environment variable recommended
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

// Then use immediately — no endpoint, no credential rotation, no portal setup
var text = new IronTesseract().Read("document.jpg").Text;
// Set once at application startup — environment variable recommended
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE");

// Then use immediately — no endpoint, no credential rotation, no portal setup
var text = new IronTesseract().Read("document.jpg").Text;
Imports System

' Set once at application startup — environment variable recommended
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")

' Then use immediately — no endpoint, no credential rotation, no portal setup
Dim text As String = (New IronTesseract()).Read("document.jpg").Text
$vbLabelText   $csharpLabel

라이선스 키는 고정된 문자열입니다. 요청별로 만료되지 않으며, 순환이 필요하지 않고, 활성화 후 유효성 검사를 위해 서버에 호출하지도 않습니다. OCR 기능을 구현하기 위해 배포 환경에는 아웃바운드 방화벽 규칙이 필요하지 않습니다.

API 매핑 참조

Azure 컴퓨터 비전 IronOCR에 상응하는
ImageAnalysisClient IronTesseract
new AzureKeyCredential(apiKey) IronOcr.License.LicenseKey = key
client.AnalyzeAsync(data, VisualFeatures.Read) ocr.Read(imagePath)
BinaryData.FromStream(stream) input.LoadImage(stream)
result.Value.Read.Blocks result.Paragraphs
block.Lines result.Lines
line.Text line.Text
line.Words result.Words
word.Confidence word.Confidence (0-100 척도 vs Azure의 0-1)
word.BoundingPolygon word.X, word.Y, word.Width, word.Height
DocumentAnalysisClient IronTesseract + OcrInput
AnalyzeDocumentAsync(WaitUntil.Completed, "prebuilt-read", stream) ocr.Read(input)input.LoadPdf(path)
operation.Value.Pages result.Pages
page.Lines / line.Content result.Lines / line.Text
RequestFailedException (429 반복 시도) 해당 사항 없음 - 요금 제한 없음
RequestFailedException (500 반복 시도) 해당 사항 없음 - 서비스 오류 없음

팀이 Azure Computer Vision에서IronOCR로 마이그레이션을 고려할 때

클라우드 프로세싱 차단 관련 규정 준수 요구 사항

의료 분야 ISV가 문서 관리 시스템을 구축할 때 Azure Computer Vision을 선택하는 이유는 통합 속도가 빠르기 때문입니다. 그러던 중 첫 번째 Enterprise 고객인 병원 시스템이 등장합니다. 이 병원에는 HIPAA 보안 책임자가 있는데, 그는 두 가지 질문을 합니다. "저희 개인 건강 정보(PHI)는 어디로 가나요?" 그리고 "해당 제3자를 다루는 사업 제휴 계약(BAA)을 보여주시겠습니까?" Azure는 BAA를 보유하고 있지만, 첫 번째 질문에 대한 답변인 "Microsoft 데이터 센터" 때문에 장기간의 보안 검토가 진행되고, Microsoft의 감사 보고서 제출 요청이 들어오며, 계약 체결이 지연되는 규정 준수 일정이 세워집니다.IronOCR로 전환하면 이러한 질문은 완전히 사라집니다. 개인 건강 정보(PHI)는 고객 환경을 벗어나지 않습니다. 규정 준수 범위는 고객사 내부 조직에 한정됩니다.

거래량 증가로 인해 건당 가격 책정 방식이 더 이상 유지될 수 없게 되었습니다.

운영팀에서 월 5,000건의 문서를 처리하는 송장 처리 파이프라인을 구축했는데, 이는 Azure의 무료 등급 범위 내에 충분히 들어갑니다. 볼륨이 증가함에 따라 거래당 비용은 처리된 각 문서와 함께 축적됩니다.IronOCR Professional($2,999)은 일회성 구매로 문서당 비용이 없습니다. 팀들이 적당한 수준의 업무량 증가만 예상하더라도 손익분기점에 빠르게 도달하게 되며, 그 이후로는 추가되는 모든 문서가 비용 절감으로 이어집니다.

네트워크 지연 시간은 처리 SLA에 영향을 미칩니다.

문서 처리 서비스는 전체 서비스 수준 계약(SLA)에서 2초 이내 처리를 목표로 합니다. Azure Computer Vision은 OCR 연산 자체를 수행하기 전에 동일 지역 호출의 경우 200~800ms, 지역 간 배포의 경우 500~2000ms의 네트워크 지연 시간을 추가합니다. 부하가 걸리면 S1의 10 TPS 속도 제한으로 인해 큐잉이 발생하여 지연 시간이 더욱 늘어납니다.IronOCR큐 대기, 속도 제한, 네트워크 홉 없이 일반 서버 하드웨어에서 300 DPI 이미지 하나를 100~400ms 내에 처리합니다. 따라서 SLA는 Azure 서비스 상태나 네트워크 환경이 아닌 하드웨어에만 의존하므로 예측 가능합니다.

에어갭 인프라 요구 사항

방위산업체, 정보기관, 그리고 중요 기반 시설 운영업체들은 설계상 인터넷 연결이 없는 네트워크에서 작업 부하를 처리합니다. Azure Computer Vision은 이러한 환경과 기술적으로 호환되지 않습니다. 엔드포인트에 연결할 수 없습니다. 이러한 분야의 팀은 자체 포함 바이너리로 배포되고, 외부 연결 없이 작동하며, 클라우드 데이터 전송을 명시적으로 금지하는 보안 검토를 통과하는 라이브러리가 필요합니다. IronOCR은 Linux 배포 및 Docker 지원을 통해 수정 없이 제한된 환경에도 배포할 수 있습니다.

다중 환경 배포 간소화

SaaS 애플리케이션의 개발, 스테이징 및 프로덕션 환경을 관리하는 팀은 세 개의 Azure Cognitive Services 리소스, 세 세트의 API 키, 그리고 세 개의 엔드포인트 URL을 보유하게 되는데, 각각 안전한 저장소, 순환 정책 및 환경별 구성이 필요합니다. 모든 배포 환경에는 Azure에 대한 외부 네트워크 액세스가 필요합니다. IronOCR은 환경별 구성을 환경 변수 하나(IRONOCR_LICENSE)로 줄이며, 네트워크 접근 요건을 제거하고 환경 전반에서 자격 증명 관리의 운영 오버헤드를 제거합니다.

일반적인 마이그레이션 고려사항

비동기에서 동기 패턴으로

Azure 소비자 코드는 필수적으로 async입니다.IronOCR비동기 처리를 필요로 하지 않지만, 전환 과정은 기계적으로 이루어집니다. 반환 타입을 async Task<string>에서 string로 변경하고, awaitasync 키워드를 제거하며, 반복 시도 루프를 삭제하세요. 호출 메서드가 비동기로 유지되어야 하는 ASP.NET 컨트롤러 또는 서비스인 경우,IronOCR호출을 Task.Run으로 래핑하십시오:

// Before: Azure async chain
public async Task<string> ReadTextAsync(string imagePath)
{
    using var stream = File.OpenRead(imagePath);
    var data = BinaryData.FromStream(stream);
    var result = await _client.AnalyzeAsync(data, VisualFeatures.Read);
    return string.Join("\n", result.Value.Read.Blocks
        .SelectMany(b => b.Lines)
        .Select(l => l.Text));
}

// After:IronOCR synchronous
public string ReadText(string imagePath)
{
    return new IronTesseract().Read(imagePath).Text;
}

// If async signature must be preserved for interface compatibility
public Task<string> ReadTextAsync(string imagePath)
{
    return Task.Run(() => new IronTesseract().Read(imagePath).Text);
}
// Before: Azure async chain
public async Task<string> ReadTextAsync(string imagePath)
{
    using var stream = File.OpenRead(imagePath);
    var data = BinaryData.FromStream(stream);
    var result = await _client.AnalyzeAsync(data, VisualFeatures.Read);
    return string.Join("\n", result.Value.Read.Blocks
        .SelectMany(b => b.Lines)
        .Select(l => l.Text));
}

// After:IronOCR synchronous
public string ReadText(string imagePath)
{
    return new IronTesseract().Read(imagePath).Text;
}

// If async signature must be preserved for interface compatibility
public Task<string> ReadTextAsync(string imagePath)
{
    return Task.Run(() => new IronTesseract().Read(imagePath).Text);
}
Imports System.IO
Imports System.Threading.Tasks
Imports System.Linq

' Before: Azure async chain
Public Async Function ReadTextAsync(imagePath As String) As Task(Of String)
    Using stream = File.OpenRead(imagePath)
        Dim data = BinaryData.FromStream(stream)
        Dim result = Await _client.AnalyzeAsync(data, VisualFeatures.Read)
        Return String.Join(vbLf, result.Value.Read.Blocks _
            .SelectMany(Function(b) b.Lines) _
            .Select(Function(l) l.Text))
    End Using
End Function

' After: IronOCR synchronous
Public Function ReadText(imagePath As String) As String
    Return New IronTesseract().Read(imagePath).Text
End Function

' If async signature must be preserved for interface compatibility
Public Function ReadTextAsync(imagePath As String) As Task(Of String)
    Return Task.Run(Function() New IronTesseract().Read(imagePath).Text)
End Function
$vbLabelText   $csharpLabel

신뢰도 척도 정규화

Azure Computer Vision은 단어 신뢰도를 0과 1 사이의 float로 반환합니다. IronOCR은 신뢰도를 0-100 척도로 double로 반환합니다. Azure 신뢰도 값에 임계값을 설정하는 모든 코드는 조정이 필요합니다.

// Azure: confidence is 0.0 - 1.0
foreach (var word in line.Words)
{
    if (word.Confidence > 0.85f) { /* high confidence */ }
}

// IronOCR: confidence is 0 - 100
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
    if (word.Confidence > 85.0) { /* equivalent threshold */ }
}
Console.WriteLine($"Overall: {result.Confidence}%");
// Azure: confidence is 0.0 - 1.0
foreach (var word in line.Words)
{
    if (word.Confidence > 0.85f) { /* high confidence */ }
}

// IronOCR: confidence is 0 - 100
var result = new IronTesseract().Read(imagePath);
foreach (var word in result.Words)
{
    if (word.Confidence > 85.0) { /* equivalent threshold */ }
}
Console.WriteLine($"Overall: {result.Confidence}%");
Imports IronOcr

' Azure: confidence is 0.0 - 1.0
For Each word In line.Words
    If word.Confidence > 0.85F Then
        ' high confidence
    End If
Next

' IronOCR: confidence is 0 - 100
Dim result = New IronTesseract().Read(imagePath)
For Each word In result.Words
    If word.Confidence > 85.0 Then
        ' equivalent threshold
    End If
Next
Console.WriteLine($"Overall: {result.Confidence}%")
$vbLabelText   $csharpLabel

OcrResult API 참조 문서에는 신뢰도 척도를 포함한 모든 결과 속성이 설명되어 있습니다. 신뢰도 점수 활용 가이드는 임계값 선택 및 요소별 해석에 대해 다룹니다 .

PDF 처리 서비스 통합

Azure는 이미지 OCR과 PDF OCR을 별도의 클라이언트, NuGet 패키지 및 엔드포인트 구성을 사용하는 두 개의 개별 서비스로 분리합니다. 마이그레이션은 두 경로를 단일 IronTesseract 인스턴스로 통합하는 것을 의미합니다. OcrInput.LoadPdf 메서드는 파일 경로, 스트림 또는 바이트 배열을 허용하며, 암호화된 파일의 경우 선택적 Password 매개변수가 필요합니다 — 두 번째 클라이언트가 필요하지 않습니다:

// Before: Two separate Azure clients for images vs PDFs
// Image: ImageAnalysisClient + AnalyzeAsync
// PDF:   DocumentAnalysisClient + AnalyzeDocumentAsync(WaitUntil.Completed, ...)

// After: One IronTesseract instance handles both
var ocr = new IronTesseract();

// Image
var imageResult = ocr.Read("document.jpg");

// PDF (same client, same Read method)
using var pdfInput = new OcrInput();
pdfInput.LoadPdf("document.pdf");
var pdfResult = ocr.Read(pdfInput);

// Password-protected PDF
using var encInput = new OcrInput();
encInput.LoadPdf("secured.pdf", Password: "secret");
var encResult = ocr.Read(encInput);

// 검색 가능한 PDF 출력 — no manual construction
pdfResult.SaveAsSearchablePdf("searchable-output.pdf");
// Before: Two separate Azure clients for images vs PDFs
// Image: ImageAnalysisClient + AnalyzeAsync
// PDF:   DocumentAnalysisClient + AnalyzeDocumentAsync(WaitUntil.Completed, ...)

// After: One IronTesseract instance handles both
var ocr = new IronTesseract();

// Image
var imageResult = ocr.Read("document.jpg");

// PDF (same client, same Read method)
using var pdfInput = new OcrInput();
pdfInput.LoadPdf("document.pdf");
var pdfResult = ocr.Read(pdfInput);

// Password-protected PDF
using var encInput = new OcrInput();
encInput.LoadPdf("secured.pdf", Password: "secret");
var encResult = ocr.Read(encInput);

// 검색 가능한 PDF 출력 — no manual construction
pdfResult.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

' Before: Two separate Azure clients for images vs PDFs
' Image: ImageAnalysisClient + AnalyzeAsync
' PDF:   DocumentAnalysisClient + AnalyzeDocumentAsync(WaitUntil.Completed, ...)

' After: One IronTesseract instance handles both
Dim ocr As New IronTesseract()

' Image
Dim imageResult = ocr.Read("document.jpg")

' PDF (same client, same Read method)
Using pdfInput As New OcrInput()
    pdfInput.LoadPdf("document.pdf")
    Dim pdfResult = ocr.Read(pdfInput)

    ' Password-protected PDF
    Using encInput As New OcrInput()
        encInput.LoadPdf("secured.pdf", Password:="secret")
        Dim encResult = ocr.Read(encInput)
    End Using

    ' 검색 가능한 PDF 출력 — no manual construction
    pdfResult.SaveAsSearchablePdf("searchable-output.pdf")
End Using
$vbLabelText   $csharpLabel

PDF 입력 가이드 에서는 페이지 범위 선택, 스트림 입력 및 기본 PDF 렌더링 파이프라인에 대해 설명합니다. 이미지 입력에 대해서는 이미지 입력 ​​가이드를 참조하십시오.

형태 인식기 없이 구조화된 데이터 추출

필드 추출을 위해 Form Recognizer의 사전 빌드된 모델(송장, 영수증, 신분증 문서)을 사용하는 팀은 IronOCR을 사용한 영역 기반 OCR과 CropRectangle을 사용하여 그 추출 논리를 복제해야 합니다. 위치 추출은 모델 기반이 아닌 명시적 방식으로 이루어집니다.

// Form Recognizer extracted named fields automatically
// IronOCR: define extraction zones for known document layouts
var ocr = new IronTesseract();

// Define regions matching the document template
var vendorZone   = new CropRectangle(0,   0,   300, 100);
var invoiceDate  = new CropRectangle(400, 0,   200, 50);
var totalAmount  = new CropRectangle(400, 500, 200, 100);

string vendor, date, total;

using (var input = new OcrInput())
{
    input.LoadImage("invoice.jpg", vendorZone);
    vendor = ocr.Read(input).Text.Trim();
}

using (var input = new OcrInput())
{
    input.LoadImage("invoice.jpg", invoiceDate);
    date = ocr.Read(input).Text.Trim();
}

using (var input = new OcrInput())
{
    input.LoadImage("invoice.jpg", totalAmount);
    total = ocr.Read(input).Text.Trim();
}
// Form Recognizer extracted named fields automatically
// IronOCR: define extraction zones for known document layouts
var ocr = new IronTesseract();

// Define regions matching the document template
var vendorZone   = new CropRectangle(0,   0,   300, 100);
var invoiceDate  = new CropRectangle(400, 0,   200, 50);
var totalAmount  = new CropRectangle(400, 500, 200, 100);

string vendor, date, total;

using (var input = new OcrInput())
{
    input.LoadImage("invoice.jpg", vendorZone);
    vendor = ocr.Read(input).Text.Trim();
}

using (var input = new OcrInput())
{
    input.LoadImage("invoice.jpg", invoiceDate);
    date = ocr.Read(input).Text.Trim();
}

using (var input = new OcrInput())
{
    input.LoadImage("invoice.jpg", totalAmount);
    total = ocr.Read(input).Text.Trim();
}
Imports IronOcr

' Form Recognizer extracted named fields automatically
' IronOCR: define extraction zones for known document layouts
Dim ocr As New IronTesseract()

' Define regions matching the document template
Dim vendorZone As New CropRectangle(0, 0, 300, 100)
Dim invoiceDate As New CropRectangle(400, 0, 200, 50)
Dim totalAmount As New CropRectangle(400, 500, 200, 100)

Dim vendor As String
Dim [date] As String
Dim total As String

Using input As New OcrInput()
    input.LoadImage("invoice.jpg", vendorZone)
    vendor = ocr.Read(input).Text.Trim()
End Using

Using input As New OcrInput()
    input.LoadImage("invoice.jpg", invoiceDate)
    [date] = ocr.Read(input).Text.Trim()
End Using

Using input As New OcrInput()
    input.LoadImage("invoice.jpg", totalAmount)
    total = ocr.Read(input).Text.Trim()
End Using
$vbLabelText   $csharpLabel

영역 기반 OCR 가이드CropRectangle 사용법을 상세히 다룹니다. 송장별 워크플로의 경우, 송장 OCR 튜토리얼에서 전체 추출 패턴을 확인할 수 있습니다.

IronOCR의 추가 기능

위의 비교 사항 외에도IronOCR Azure Computer Vision이 표준 OCR API를 통해 제공하지 않는 기능을 제공합니다.

  • 스캔 문서 처리 : 기울기 보정, 노이즈 제거, 대비 조정, 이진화, 선명도 향상 등 전체 전처리 파이프라인이 OCR 엔진이 이미지를 인식하기 전에 적용되어 클라우드 API에서 결과가 없거나 신뢰도가 낮은 스캔 이미지의 정확도를 향상시킵니다.
  • 긴 문서 처리 진행 상황 추적 : 여러 페이지로 구성된 PDF 처리 중 진행 상황 이벤트를 구독할 수 있습니다. 이는 사용자 인터페이스 피드백이 필요한 장시간 일괄 처리 작업에 유용합니다.
  • 컴퓨터 비전 전처리 : 각도가 다르거나 조명이 일정하지 않은 사진과 같이 처리하기 어려운 문서에 대한 딥러닝 기반 전처리.

.NET 호환성 및 미래 준비

IronOCR 단일 NuGet 패키지를 통해 .NET 8, .NET 9, .NET Standard 2.0 및 .NET Framework 4.6.2부터 4.8까지를 대상으로 합니다. 이 제품은 Windows x64, Windows x86, Linux x64, macOS(Intel 및 Apple Silicon) 및 ARM64를 지원하며 Azure App Service, AWS Lambda, Docker 컨테이너 및 온프레미스 Linux 서버를 포함한 모든 최신 .NET 배포 대상을 포괄합니다. Azure Computer Vision의 .NET SDK(Azure.AI.Vision.ImageAnalysis)도 최신 .NET 호환성을 유지하지만, 클라우드 아키텍처는 SDK와 독립적으로 버전 관리되고 업데이트되며, 언어 런타임과의 호환성은 Azure 엔드포인트와의 호환성에 비해 부차적입니다.IronOCR NuGet 통해 언어 및 엔진 업데이트를 배포하여 .NET 생태계의 나머지 부분과 일관된 업데이트 모델을 유지합니다.

결론

Azure Computer Vision은 Azure 생태계 내에서 이미 운영 중인 팀에 적합한 강력한 OCR 서비스입니다. 해당 팀의 문서는 클라우드 전송에 대한 규제 제한이 없으며, 처리량이 무료 등급 또는 소량 유료 등급에 해당합니다. 비동기 API는 정상적으로 작동하며, 표준 문서에 대한 정확도는 신뢰할 수 있고, 양식 인식기의 사전 구축된 모델은 송장 및 영수증과 같은 구조화된 문서 유형에 대한 개발 노력을 줄여줍니다.

하지만 해당 비용 모델은 확장성이 떨어집니다.IronOCR Lite 월 5만 건의 문서를 처리할 경우, Azure 거래 수수료 절감액으로 두 달 이내에 투자 비용을 회수할 수 있습니다. 여러 페이지로 구성된 PDF 파일에 대한 페이지별 요금 청구 방식은 비용을 가중시킵니다. 손익분기점을 넘어서는 매년의 운영 비용은 마이크로소프트에 돌아가지 않는 돈입니다. 월 10,000건 이상의 문서를 처리할 것으로 예상되는 팀의 경우, 장기적인 경제성을 고려할 때 온프레미스 영구 라이선스가 유리합니다.

데이터 주권이라는 주장은 더욱 절대적입니다. 개인 건강 정보(PHI), ITAR 통제 데이터, 변호사-의뢰인 기밀 통신 또는 법적으로나 계약상 조직 경계를 넘을 수 없는 문서 범주가 OCR 파이프라인을 통과하는 경우 Azure Computer Vision은 설계에서 제외됩니다. 불이익을 받는다는 의미가 아니라, 제외된다는 뜻입니다. IronOCR의 로컬 처리 모델은 아키텍처를 손상시키지 않고 이러한 워크로드를 처리합니다.

비동기 폴링의 복잡성은 실질적인 오버헤드입니다. 반복 로직, 속도 제한 처리, 네트워크 실패 모드 및 이미지 대 PDF 사이의 ImageAnalysisClientDocumentAnalysisClient로의 분할은 모두 OCR 가치가 없는 코드를 추가합니다 — 이는 클라우드 통합 코드입니다. IronOCR의 동기 Read() 메서드는 동일한 코드로 이미지와 PDF를 처리하며, 비동기 전파가 필요 없고 반복 로직이 필요 없습니다. 클라우드 API 구축보다는 애플리케이션 개발에 엔지니어링 노력을 집중하려는 팀에게 이러한 단순함은 프로젝트 수명 주기 전반에 걸쳐 상당한 가치를 제공합니다.

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

자주 묻는 질문

Azure 컴퓨터 비전 OCR이란 무엇인가요?

Azure 컴퓨터 비전 OCR은 개발자와 기업에서 이미지와 문서에서 텍스트를 추출하는 데 사용하는 OCR 솔루션입니다. 이 솔루션은 .NET 애플리케이션 개발용 IronOCR과 함께 평가된 여러 OCR 옵션 중 하나입니다.

IronOCR은 .NET 개발자용 Azure 컴퓨터 비전 OCR과 어떻게 다른가요?

IronOCR은 IronTesseract를 핵심 엔진으로 사용하는 NuGet 네이티브 .NET OCR 라이브러리입니다. Azure Computer Vision OCR에 비해 배포가 더 간단하고(SDK 설치 프로그램 없음), 정액제 요금이 적용되며, COM 상호 운용 또는 클라우드 종속성이 없는 깔끔한 C# API를 제공합니다.

IronOCR이 Azure 컴퓨터 비전 OCR보다 설정하기가 더 쉬운가요?

IronOCR은 단일 NuGet 패키지를 통해 설치됩니다. SDK 설치 프로그램, 복사할 라이선스 파일, 등록할 COM 구성 요소 또는 관리해야 할 별도의 런타임 바이너리가 없습니다. 전체 OCR 엔진이 패키지에 번들로 제공됩니다.

Azure 컴퓨터 비전 OCR과 IronOCR 간에는 어떤 정확도 차이가 있나요?

IronOCR은 표준 비즈니스 문서, 송장, 영수증, 스캔 양식에 대해 높은 인식 정확도를 달성합니다. 품질이 많이 저하된 문서나 일반적이지 않은 스크립트의 경우 정확도는 소스 품질에 따라 달라집니다. IronOCR에는 이미지 전처리 필터가 포함되어 있어 저품질 입력에 대한 인식률을 향상시킵니다.

IronOCR은 PDF 텍스트 추출을 지원하나요?

예. IronOCR은 한 번의 호출로 원본 PDF와 스캔한 PDF 이미지 모두에서 텍스트를 추출합니다. 또한 여러 페이지의 TIFF 파일, 이미지, 스트림도 지원합니다. 스캔한 PDF의 경우 OCR은 페이지별 결과 개체를 사용하여 페이지별로 적용됩니다.

Azure 컴퓨터 비전 OCR 라이선싱은 IronOCR과 어떻게 다른가요?

IronOCR은 페이지당 또는 스캔당 요금이 없는 정액제 영구 라이선스를 사용합니다. 대량의 문서를 처리하는 조직은 문서 양에 관계없이 동일한 라이선스 비용을 지불합니다. 자세한 내용과 볼륨 가격은 IronOCR 라이선스 페이지에서 확인할 수 있습니다.

IronOCR 어떤 언어를 지원하나요?

IronOCR은 별도의 NuGet 언어 팩을 통해 127개 언어를 지원합니다. 언어를 추가하려면 '닷넷 추가 패키지 IronOcr.Languages.{Language}' 명령 하나만 있으면 됩니다. 수동으로 파일을 배치하거나 경로를 구성할 필요가 없습니다.

.NET 프로젝트에 IronOCR 설치하는 방법은 무엇인가요?

NuGet을 통해 설치합니다: 패키지 관리자 콘솔에서 '설치-패키지 IronOcr' 또는 CLI에서 '닷넷 추가 패키지 IronOcr'을 실행합니다. 추가 언어 팩도 같은 방법으로 설치됩니다. 기본 SDK 인스톨러가 필요하지 않습니다.

IronOCR은 Azure Computer Vision과 달리 Docker 및 컨테이너화된 배포에 적합한가요?

예. IronOCR은 NuGet 패키지를 통해 Docker 컨테이너에서 작동합니다. 라이선스 키는 환경 변수를 통해 설정됩니다. OCR 엔진 자체에는 라이선스 파일, SDK 경로 또는 볼륨 마운트가 필요하지 않습니다.

Azure Computer Vision과 비교하여 구매하기 전에 IronOCR을 사용해 볼 수 있나요?

예. IronOCR 평가판 모드는 문서를 처리하고 출력물에 워터마크 오버레이가 포함된 OCR 결과를 반환합니다. 라이선스를 구매하기 전에 자신의 문서에서 정확성을 확인할 수 있습니다.

IronOCR은 텍스트 추출과 함께 바코드 판독을 지원하나요?

IronOCR은 텍스트 추출과 OCR에 중점을 둡니다. 바코드 판독을 위해 Iron Software는 동반 라이브러리로 IronBarcode를 제공합니다. 두 가지 모두 개별적으로 또는 Iron Suite 번들의 일부로 사용할 수 있습니다.

Azure 컴퓨터 비전 OCR에서 IronOCR로 쉽게 마이그레이션할 수 있나요?

Azure Computer Vision OCR에서 IronOCR로의 마이그레이션에는 일반적으로 초기화 시퀀스를 IronTesseract 인스턴스화로 대체하고, COM 수명 주기 관리를 제거하며, API 호출을 업데이트하는 작업이 포함됩니다. 대부분의 마이그레이션은 코드 복잡성을 크게 줄여줍니다.

칸나오팟 우돈판트
소프트웨어 엔지니어
카나팟은 소프트웨어 엔지니어가 되기 전 일본 홋카이도 대학교에서 환경 자원학 박사 학위를 취득했습니다. 학위 과정 중에는 생물생산공학과 소속 차량 로봇 연구실에서 활동하기도 했습니다. 2022년에는 C# 기술을 활용하여 Iron Software의 엔지니어링 팀에 합류했고, 현재 IronPDF 개발에 집중하고 있습니다. 카나팟은 IronPDF에 사용되는 대부분의 코드를 직접 작성하는 개발자로부터 배울 수 있다는 점에 만족하며, 동료들과의 소통을 통해 배우는 것 외에도 Iron Software에서 일하는 즐거움을 누리고 있습니다. 코딩이나 문서 작업을 하지 않을 때는 주로 PS5로 게임을 하거나 The Last of Us를 다시 시청하는 것을 즐깁니다.

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해