Ir para o conteúdo do rodapé
COMPARAR COM OUTROS COMPONENTES

OCR no Azure vs. IronOCR: Qual solução de reconhecimento óptico de caracteres é a mais adequada para projetos .NET?

O Windows.Media.Ocr é distribuído gratuitamente com todas as instalações do Windows 10 e Windows 11, o que o torna atraente até você tentar implantar o mesmo aplicativo em um servidor Linux, um contêinerDockerou uma funçãoAWS Lambda— momento em que a API simplesmente não existe. A dependência de plataforma não é um caso isolado com esta biblioteca; É a restrição determinante. Todas as decisões arquitetônicas subsequentes à escolha do Windows.Media.Ocr são moldadas pela exigência de que o sistema operacional host seja um Windows 10 ou Windows 11 para desktop ou servidor de consumo. Sem Linux, sem macOS, sem Docker, sem Azure Functions no Linux, sem AWS Lambda. Para desenvolvedores que criam ferramentas internas para Windows sem nenhuma intenção de ultrapassar esse limite, o preço de US$ 0 é difícil de contestar. Para todos os outros, o custo oculto é a reescrita completa do OCR em um sistema totalmente diferente quando os requisitos de implementação evoluem.

Entendendo o Windows.Media.Ocr

Windows.Media.Ocr faz parte da superfície de API do Windows Runtime (WinRT) introduzida no Windows 8.1 e refinada para o Windows 10 e 11. Ele expõe uma classe OcrEngine no namespace Windows.Media.Ocr que aceita um SoftwareBitmap — em si um tipo WinRT de Windows.Graphics.Imaging — e retorna um OcrResult contendo texto reconhecido e geometria da linha.

A API é construída em torno do contrato async/await do WinRT. Cada operação flui através de chamadas async Task apoiadas por mecanismos WinRT IAsyncOperation: carregar um StorageFile, abrir um fluxo, criar um BitmapDecoder, obter um SoftwareBitmap, e só então invocar RecognizeAsync. A partir do .NET 6, consumir APIs WinRT requer um Target Framework Moniker (TFM) específico para Windows, como net8.0-windows10.0.19041.0. Um arquivo de projeto sem esse TFM não pode compilar código que referencia Windows.Media.Ocr de forma alguma — os tipos simplesmente não existem no gráfico de assembly.

Principais características arquitetônicas:

  • Somente Windows 10/11 — a API WinRT não está disponível no Servidor Windows sem a Experiência Desktop em todas as configurações e está completamente ausente noLinuxe macOS.
  • Modelo assíncrono do WinRT — todo o reconhecimento flui através de chamadas assíncronas apoiadas por IAsyncOperation; Não existe um caminho síncrono.
  • Pacotes de idioma do sistema operacionalOcrEngine.TryCreateFromLanguage e TryCreateFromUserProfileLanguages resolvem os idiomas disponíveis a partir dos pacotes de idioma do Windows instalados pelo usuário ou administrador de TI naquela máquina específica; não há um modelo de idioma incluído ou portátil.
  • Entrada somente de imagem — a API aceita SoftwareBitmap diretamente; Não existe nenhum caminho de entrada PDF em nenhuma camada da API.
  • Sem pipeline de pré-processamento — o bitmap bruto é passado para o reconhecedor; A correção de rotação, a remoção de ruído, o aprimoramento de contraste e o dimensionamento de resolução são de responsabilidade do desenvolvedor, que utiliza APIs de imagem do Windows separadas.
  • Sem saída em PDF pesquisável — o texto reconhecido é retornado como dados de string simples com geometria de linha; Não é possível exportar para PDF.
  • TFM específico para Windows necessário — os arquivos de projeto devem direcionar um TFM net*-windows*, o que impede que o mesmo projeto seja compilado em várias plataformas

A pilha assíncrona WinRT

Toda operação básica de OCR com Windows.Media.Ocr exige navegar por várias camadas da API WinRT antes que o reconhecimento possa começar:

// Windows.Media.Ocr: 6+ async steps before receiving any text
// Requires net8.0-windows10.0.19041.0 TFM — will not compile cross-platform

public async Task<string> ExtractTextAsync(string imagePath)
{
    // Step 1: WinRT file system access
    var file = await StorageFile.GetFileFromPathAsync(imagePath);

    // Step 2: Open WinRT stream
    using var stream = await file.OpenAsync(FileAccessMode.Read);

    // Step 3: Create bitmap decoder
    var decoder = await BitmapDecoder.CreateAsync(stream);

    // Step 4: Decode to SoftwareBitmap
    var bitmap = await decoder.GetSoftwareBitmapAsync();

    // Step 5: Check language availability — null if not installed on this machine
    var engine = OcrEngine.TryCreateFromLanguage(
        new Windows.Globalization.Language("en-US"));
    if (engine == null)
        throw new Exception("OCR engine not available for this language");

    // Step 6: Recognize
    var result = await engine.RecognizeAsync(bitmap);
    return result.Text;
}
// Windows.Media.Ocr: 6+ async steps before receiving any text
// Requires net8.0-windows10.0.19041.0 TFM — will not compile cross-platform

public async Task<string> ExtractTextAsync(string imagePath)
{
    // Step 1: WinRT file system access
    var file = await StorageFile.GetFileFromPathAsync(imagePath);

    // Step 2: Open WinRT stream
    using var stream = await file.OpenAsync(FileAccessMode.Read);

    // Step 3: Create bitmap decoder
    var decoder = await BitmapDecoder.CreateAsync(stream);

    // Step 4: Decode to SoftwareBitmap
    var bitmap = await decoder.GetSoftwareBitmapAsync();

    // Step 5: Check language availability — null if not installed on this machine
    var engine = OcrEngine.TryCreateFromLanguage(
        new Windows.Globalization.Language("en-US"));
    if (engine == null)
        throw new Exception("OCR engine not available for this language");

    // Step 6: Recognize
    var result = await engine.RecognizeAsync(bitmap);
    return result.Text;
}
Imports System.Threading.Tasks
Imports Windows.Media.Ocr
Imports Windows.Storage
Imports Windows.Graphics.Imaging
Imports Windows.Storage.Streams
Imports Windows.Globalization

Public Async Function ExtractTextAsync(imagePath As String) As Task(Of String)
    ' Step 1: WinRT file system access
    Dim file As StorageFile = Await StorageFile.GetFileFromPathAsync(imagePath)

    ' Step 2: Open WinRT stream
    Using stream As IRandomAccessStream = Await file.OpenAsync(FileAccessMode.Read)

        ' Step 3: Create bitmap decoder
        Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)

        ' Step 4: Decode to SoftwareBitmap
        Dim bitmap As SoftwareBitmap = Await decoder.GetSoftwareBitmapAsync()

        ' Step 5: Check language availability — Nothing if not installed on this machine
        Dim engine As OcrEngine = OcrEngine.TryCreateFromLanguage(New Language("en-US"))
        If engine Is Nothing Then
            Throw New Exception("OCR engine not available for this language")
        End If

        ' Step 6: Recognize
        Dim result As OcrResult = Await engine.RecognizeAsync(bitmap)
        Return result.Text
    End Using
End Function
$vbLabelText   $csharpLabel

A verificação de nulidade em engine não é opcional. Se o pacote de idioma alvo não estiver instalado na máquina que executa o código, TryCreateFromLanguage retorna nulo e o reconhecimento é impossível. Não há plano B; O aplicativo deve exibir um erro para o usuário ou falhar silenciosamente.

Entendendo o IronOCR

IronOCR é uma biblioteca OCR comercial para .NET, construída sobre um mecanismo Tesseract 5 otimizado, com uma camada de API gerenciada que lida com pré-processamento, leitura de PDF, resolução multilíngue e saída de dados estruturados. Ele é instalado como um único pacote NuGet , sem binários nativos externos para implantar separadamente, sem pastas tessdata para gerenciar e sem necessidade de TFMs específicos da plataforma.

Principais características:

  • Multiplataforma por natureza — funciona no Windows, Linux, macOS, Docker, Azure App Service (Windows ou Linux),AWS Lambdae GCP Cloud Run sem alterações de código.
  • Pré-processamento automático — correção de inclinação, redução de ruído, melhoria de contraste, binarização e escalonamento de resolução são aplicados automaticamente em entradas de baixa qualidade, com controle explícito disponível por meio dos métodos de filtro OcrInput
  • Entrada nativa de PDFIronTesseract.Read aceita caminhos de PDF diretamente; Sem etapa de conversão, sem biblioteca externa.
  • Mais de 125 idiomas incluídos — os pacotes de idiomas são pacotes NuGet que são implantados com o aplicativo; sem dependência de dados de idioma instalados no sistema operacional
  • Saída de PDF pesquisávelOcrResult.SaveAsSearchablePdf cria um PDF com camada de texto a partir de qualquer entrada digitalizada
  • Modelo de resultado estruturadoOcrResult expõe Pages, Paragraphs, Lines, Words, e pontuações de confiança por palavra e caixas delimitadoras
  • Thread-safe — instâncias de IronTesseract suportam cargas de trabalho paralelas sem sincronização adicional
  • Licenciamento perpétuo — $999 Lite até $5,999 Unlimited, compra única, processa documentos ilimitados

Comparação de recursos

Recurso Windows.Media.Ocr IronOCR
Plataforma Somente paraWindows 10/11 Windows, Linux, macOS, Docker, nuvem
Preço Livre $5,999 perpétuo
Entrada de PDF Não Nativo
Modelo de linguagem Pacotes instalados pelo sistema operacional Mais de 125 pacotes incluídos via NuGet
Pré-processamento None Filtros automáticos e explícitos
Saída em PDF pesquisável Não Sim
Modelo de API WinRT assíncrono .NET padrão

Comparação Detalhada de Recursos

Recurso Windows.Media.Ocr IronOCR
Suporte da plataforma
Windows 10/11 Sim Sim
Servidor Windows Limitado Sim
Linux Não Sim
macOS Não Sim
Docker Não Sim
Azure Functions (Linux) Não Sim
AWS Lambda Não Sim
Formatos de entrada
JPEG / PNG / BMP Sim (via pipeline WinRT) Sim
PDF (digitalizado) Não Sim
PDF (protegido por senha) Não Sim
TIFF / várias páginas Não Sim
Fluxo / matriz de bytes Não (somente para o StorageFile do WinRT) Sim
URL Não Sim
Suporte de Idiomas
Fonte linguística Pacotes de idiomas instalados pelo sistema operacional Mais de 125 pacotes NuGet incluídos
Instalar sem privilégios de administrador do sistema operacional Não Sim (NuGet)
Simultaneidade multilíngue Não Sim
Portabilidade de idioma entre máquinas Não Sim
Pré-processamento
Desvio Não Sim (input.Deskew())
Redução de ruído Não Sim (input.DeNoise())
Aprimoramento de contraste Não Sim (input.Contrast())
Binarização Não Sim (input.Binarize())
Dimensionamento de resolução Não Sim (input.EnhanceResolution(300))
Saída
Texto simples Sim Sim
PDF pesquisável Não Sim
hOCR / HTML Não Sim
caixas delimitadoras em nível de palavra Parcial (geometria de linha) Sim
Pontuações de confiança por palavra Não Sim
Design de API
Restrição TFM net*-windows* necessário None
Caminho síncrono Não Sim
Leitura de código de barras durante OCR Não Sim
OCR baseado em região Não Sim

Dependência de plataforma versus implantação multiplataforma

A diferença mais significativa entre essas duas bibliotecas não é a precisão, nem o pré-processamento, nem o suporte a PDF — é a topologia de implantação. O pacote Windows.Media.Ocr não existe fora do Windows 10/11. Isso não é um problema de configuração nem um pacote NuGet ausente; O ambiente de execução WinRT, que dá suporte à API, está ausente em todos os outros sistemas operacionais.

Abordagem Windows.Media.Ocr

A dependência do WinRT se manifesta no arquivo de projeto antes mesmo da execução de uma única linha de código. O TargetFramework deve especificar uma versão da plataforma Windows:


<PropertyGroup>
  <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup>

<PropertyGroup>
  <TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
</PropertyGroup>
XML

Com esse TFM, o projeto não pode ser usado a partir de um contêiner Linux. Uma imagemDockerbaseada em mcr.microsoft.com/dotnet/aspnet:8.0 — a imagem base padrão doLinuxpara implantações ASP.NET — não possui runtime WinRT. Tentar referenciar tipos Windows.Media.Ocr em um projeto que visa net8.0 (sem sufixo Windows) produz erros de compilação, não erros de tempo de execução. O bloqueio é imposto no momento da compilação.

Quando surgem requisitos de OCR em uma arquitetura de microsserviços onde o worker de OCR roda em Linux, ou em um pipeline de CI/CD que produz imagensDockermultiplataforma, o Windows.Media.Ocr não é uma opção a ser avaliada — ele é eliminado antes mesmo do primeiro teste.

Abordagem IronOCR

IronOCR direciona net6.0, net7.0, net8.0, e net9.0 sem TFMs específicos da plataforma. O mesmo pacote NuGet e o mesmo binário de aplicação funcionam no Windows,Linuxe macOS. Implantar IronOCR no Docker requer uma linha apt-get para libgdiplus na imagem base do Linux, nada mais:

FROM mcr.microsoft.com/dotnet/aspnet:8.0
#Linuxdependency for System.Drawing
RUN apt-get update && apt-get install -y libgdiplus

COPY --from=build /app/publish /app
WORKDIR /app
ENTRYPOINT ["dotnet", "YourApp.dll"]

O código da aplicação em si permanece inalterado entre as implementações para Windows e Linux:

// Same code — Windows, Linux, macOS, Docker, AWS Lambda
// Não platform TFM, no WinRT, no conditional compilation
using IronOcr;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
// Same code — Windows, Linux, macOS, Docker, AWS Lambda
// Não platform TFM, no WinRT, no conditional compilation
using IronOcr;

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY";
var text = new IronTesseract().Read("document.jpg").Text;
Imports IronOcr

IronOcr.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim text As String = New IronTesseract().Read("document.jpg").Text
$vbLabelText   $csharpLabel

O IronOCR funciona diretamente em servidores AWS Lambda , Azure Functions no Linux e em servidoresLinuxsem necessidade de modificação de código. O objetivo da implantação é uma questão de configuração, não uma restrição arquitetônica.

Suporte a idiomas: Dependência do sistema operacional versus pacotes incluídos

O Windows.Media.Ocr delega a disponibilidade de idiomas inteiramente à máquina host. O conjunto de idiomas que seu aplicativo pode reconhecer é determinado pelos pacotes de idiomas que o usuário — ou um administrador de TI — instalou nessa instalação específica do Windows. Isso cria uma classe de falha de produção que não tem nada a ver com o seu código.

Abordagem Windows.Media.Ocr

OcrEngine.TryCreateFromLanguage retorna nulo quando o idioma solicitado não está instalado. TryCreateFromUserProfileLanguages retorna nulo quando não existe nenhum pacote de linguagem com capacidade OCR. Ambos os caminhos exigem tratamento de valores nulos e nenhum deles oferece uma forma adequada de recuperação — não há como instalar uma linguagem a partir do código ou incluí-la no aplicativo:

// Windows.Media.Ocr: language availability is a runtime unknown
// Returns null if the language pack is not installed on this machine

var engine = OcrEngine.TryCreateFromLanguage(
    new Windows.Globalization.Language("fr-FR"));

if (engine == null)
{
    // French OCR is simply unavailable — no recovery path
    // User must go to Windows Settings > Language to install French
    throw new InvalidOperationException(
        "French OCR unavailable. Install the French language pack in Windows Settings.");
}

var result = await engine.RecognizeAsync(bitmap);
// Windows.Media.Ocr: language availability is a runtime unknown
// Returns null if the language pack is not installed on this machine

var engine = OcrEngine.TryCreateFromLanguage(
    new Windows.Globalization.Language("fr-FR"));

if (engine == null)
{
    // French OCR is simply unavailable — no recovery path
    // User must go to Windows Settings > Language to install French
    throw new InvalidOperationException(
        "French OCR unavailable. Install the French language pack in Windows Settings.");
}

var result = await engine.RecognizeAsync(bitmap);
Imports Windows.Globalization
Imports Windows.Media.Ocr

' Windows.Media.Ocr: language availability is a runtime unknown
' Returns Nothing if the language pack is not installed on this machine

Dim engine = OcrEngine.TryCreateFromLanguage(New Language("fr-FR"))

If engine Is Nothing Then
    ' French OCR is simply unavailable — no recovery path
    ' User must go to Windows Settings > Language to install French
    Throw New InvalidOperationException("French OCR unavailable. Install the French language pack in Windows Settings.")
End If

Dim result = Await engine.RecognizeAsync(bitmap)
$vbLabelText   $csharpLabel

A implantação de um aplicativo de processamento de documentos multilíngue com Windows.Media.Ocr exige a coordenação da instalação do pacote de idiomas do Windows em todas as máquinas no ambiente de destino da implantação. Em um servidor compartilhado ou em uma máquina de usuário gerenciada por Política de Grupo, isso não está sob o controle do desenvolvedor.

Abordagem IronOCR

O IronOCR fornece modelos de linguagem como pacotes NuGet dedicados que são implantados juntamente com o binário do aplicativo. Os dados de idioma são acompanhados pelo artefato de compilação, não pela configuração do sistema operacional. Suportar mais de 125 idiomas é uma operação dotnet add package:

dotnet add package IronOcr.Languages.French, IronOcr.Languages.German, IronOcr.Languages.Arabic, IronOcr.Languages.ChineseSimplified
// IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

// Works on any machine, any OS, zero OS configuration required
var result = ocr.Read("multilingual-document.jpg");
Console.WriteLine(result.Text);
// IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
var ocr = new IronTesseract();
ocr.Language = OcrLanguage.French;
ocr.AddSecondaryLanguage(OcrLanguage.German);

// Works on any machine, any OS, zero OS configuration required
var result = ocr.Read("multilingual-document.jpg");
Console.WriteLine(result.Text);
Imports IronOcr

' IronOCR: language availability is a deploy-time guarantee, not a runtime unknown
Dim ocr As New IronTesseract()
ocr.Language = OcrLanguage.French
ocr.AddSecondaryLanguage(OcrLanguage.German)

' Works on any machine, any OS, zero OS configuration required
Dim result = ocr.Read("multilingual-document.jpg")
Console.WriteLine(result.Text)
$vbLabelText   $csharpLabel

O catálogo completo de idiomas abrange latim, CJK, árabe, hebraico, devanágari, cirílico e conjuntos especializados, incluindo notação matemática. Cada pacote de idiomas é vinculado à versão do pacote IronOCR, de modo que o modelo de linguagem em produção corresponda ao testado localmente.

Pré-processamento de ausência

Digitalizações de baixa qualidade — páginas ligeiramente rotacionadas, texto fotocopiado com ruído, tinta desbotada em papel quase branco — produzem baixa precisão de OCR em qualquer mecanismo que as receba sem alterações. O pré-processamento corrige esses defeitos antes da execução do reconhecimento. O Windows.Media.Ocr não fornece nenhuma camada de pré-processamento.

Abordagem Windows.Media.Ocr

A API aceita um SoftwareBitmap e retorna o texto. O que acontece com a qualidade da imagem entre esses dois pontos não é configurável. Os desenvolvedores que precisam melhorar a precisão em entradas não ideais devem implementar o pré-processamento manualmente usando as APIs do Windows Imaging Component antes de construir o SoftwareBitmap. Trata-se de uma base de código separada, com sua própria carga de manutenção, e permanece específica para Windows pelo mesmo motivo que a própria API de OCR:

// Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
// Skewed, noisy, or low-resolution images degrade accuracy with no remedy
// Manual preprocessing via separate Windows Imaging APIs is the only option

var bitmap = await decoder.GetSoftwareBitmapAsync();
// bitmap goes directly to recognition with no quality improvement
var result = await engine.RecognizeAsync(bitmap);
// Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
// Skewed, noisy, or low-resolution images degrade accuracy with no remedy
// Manual preprocessing via separate Windows Imaging APIs is the only option

var bitmap = await decoder.GetSoftwareBitmapAsync();
// bitmap goes directly to recognition with no quality improvement
var result = await engine.RecognizeAsync(bitmap);
Imports System.Threading.Tasks

' Windows.Media.Ocr: no preprocessing — what you pass is what gets recognized
' Skewed, noisy, or low-resolution images degrade accuracy with no remedy
' Manual preprocessing via separate Windows Imaging APIs is the only option

Dim bitmap = Await decoder.GetSoftwareBitmapAsync()
' bitmap goes directly to recognition with no quality improvement
Dim result = Await engine.RecognizeAsync(bitmap)
$vbLabelText   $csharpLabel

Para digitalizações de documentos padrão e de boa qualidade (ambiente de digitalização controlado, iluminação consistente, resolução mínima de 300 DPI e orientação correta), essa limitação é administrável. Para fluxos de trabalho de processamento de documentos que recebem imagens de câmeras de celulares, scanners de mesa com desalinhamento automático de alimentação, documentos enviados por fax ou materiais fotocopiados, isso significa ou construir uma camada de pré-processamento do zero ou aceitar a degradação da precisão.

Abordagem IronOCR

A classe OcrInput do IronOCR fornece um pipeline de pré-processamento com métodos de filtro individuais que se aplicam em sequência. Os filtros de correção da qualidade da imagem abordam os principais fatores que comprometem a precisão no processamento de documentos de produção:

// IronOCR: explicit preprocessing pipeline
// Each filter targets a specific quality defect
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();              // Correct page rotation up to ~40 degrees
input.DeNoise();             // Remove scanner speckle and compression artifacts
input.Contrast();            // Boost contrast on faded or washed-out text
input.Binarize();            // Convert to black/white with optimal threshold
input.EnhanceResolution(300); // Scale image to 300 DPI for recognition

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
// IronOCR: explicit preprocessing pipeline
// Each filter targets a specific quality defect
using var input = new OcrInput();
input.LoadImage("low-quality-scan.jpg");

input.Deskew();              // Correct page rotation up to ~40 degrees
input.DeNoise();             // Remove scanner speckle and compression artifacts
input.Contrast();            // Boost contrast on faded or washed-out text
input.Binarize();            // Convert to black/white with optimal threshold
input.EnhanceResolution(300); // Scale image to 300 DPI for recognition

var result = new IronTesseract().Read(input);
Console.WriteLine($"Confidence: {result.Confidence}%");
Imports IronOcr

' IronOCR: explicit preprocessing pipeline
' Each filter targets a specific quality defect
Using input As New OcrInput()
    input.LoadImage("low-quality-scan.jpg")

    input.Deskew()              ' Correct page rotation up to ~40 degrees
    input.DeNoise()             ' Remove scanner speckle and compression artifacts
    input.Contrast()            ' Boost contrast on faded or washed-out text
    input.Binarize()            ' Convert to black/white with optimal threshold
    input.EnhanceResolution(300) ' Scale image to 300 DPI for recognition

    Dim result = New IronTesseract().Read(input)
    Console.WriteLine($"Confidence: {result.Confidence}%")
End Using
$vbLabelText   $csharpLabel

Para o caso comum, o IronOCR aplica pré-processamento automático ao chamar Read diretamente em um caminho de arquivo — o mecanismo detecta problemas de qualidade e os corrige sem configuração explícita de filtro. O tutorial de filtros de imagem cobre o conjunto completo de filtros, incluindo Sharpen, Dilate, Erode, Invert, e ToGrayScale para cenários especializados. Os filtros de correção de cor e a correção de orientação ampliam ainda mais o fluxo de trabalho para documentos com perfis de cores não padronizados ou rotação em vários ângulos.

Suporte em PDF para Ausências

O PDF é o formato de documento dominante em ambientes Enterprise . Contratos, faturas, arquivos digitalizados e formulários governamentais chegam em formato PDF. O Windows.Media.Ocr não tem conhecimento de PDF — ele aceita apenas dados de imagem. O reconhecimento óptico de caracteres (OCR) de um documento PDF requer uma biblioteca de renderização de PDF separada, rasterização página por página e montagem manual dos resultados.

Abordagem Windows.Media.Ocr

Não existe um caminho para PDF na API. Para fazer OCR em um PDF digitalizado com Windows.Media.Ocr, o desenvolvedor deve: renderizar cada página em um SoftwareBitmap usando uma biblioteca separada de renderização de PDF (nenhuma das quais está integrada ao Windows), iterar páginas, chamar RecognizeAsync por página e concatenar os resultados manualmente. Essa biblioteca de renderização em si acarreta considerações adicionais de licenciamento e implantação. O código Windows.Media.Ocr representa a menor parte da implementação total:

// Windows.Media.Ocr: no PDF support
// Requires external PDF renderer to rasterize pages before OCR
// Conceptual pattern — a PDF rendering library is not provided by Windows APIs

// Step 1: Use external PDF library to render page to bitmap (not shown)
// Step 2: Pass rendered bitmap to Windows OCR
// var bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex); // external library required

var engine = OcrEngine.TryCreateFromUserProfileLanguages();
if (engine == null)
    throw new Exception("No OCR language available");

// Step 3: Recognize the rasterized page
// var result = await engine.RecognizeAsync(bitmap);
// Step 4: Collect and concatenate results across all pages manually
// Windows.Media.Ocr: no PDF support
// Requires external PDF renderer to rasterize pages before OCR
// Conceptual pattern — a PDF rendering library is not provided by Windows APIs

// Step 1: Use external PDF library to render page to bitmap (not shown)
// Step 2: Pass rendered bitmap to Windows OCR
// var bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex); // external library required

var engine = OcrEngine.TryCreateFromUserProfileLanguages();
if (engine == null)
    throw new Exception("No OCR language available");

// Step 3: Recognize the rasterized page
// var result = await engine.RecognizeAsync(bitmap);
// Step 4: Collect and concatenate results across all pages manually
' Windows.Media.Ocr: no PDF support
' Requires external PDF renderer to rasterize pages before OCR
' Conceptual pattern — a PDF rendering library is not provided by Windows APIs

' Step 1: Use external PDF library to render page to bitmap (not shown)
' Step 2: Pass rendered bitmap to Windows OCR
' Dim bitmap = RenderPdfPageToBitmap(pdfPath, pageIndex) ' external library required

Dim engine = OcrEngine.TryCreateFromUserProfileLanguages()
If engine Is Nothing Then
    Throw New Exception("No OCR language available")
End If

' Step 3: Recognize the rasterized page
' Dim result = Await engine.RecognizeAsync(bitmap)
' Step 4: Collect and concatenate results across all pages manually
$vbLabelText   $csharpLabel

A etapa de renderização externa de PDF por si só adiciona uma dependência, uma curva de aprendizado separada e uma superfície de falha adicional ao que começou como uma solução "gratuita e integrada".

Abordagem IronOCR

O IronOCR lê PDFs nativamente. Sem renderizador externo, sem etapa de rasterização, sem montagem manual de páginas. O mesmo método IronTesseract.Read que aceita caminhos de imagem aceita caminhos de PDF. O OCR de PDF em .NET é feito em uma única linha:

// IronOCR: native PDF support — no external renderer needed
var text = new IronTesseract().Read("scanned-document.pdf").Text;

// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);

// PDF pesquisável output: make a scanned PDF text-searchable
var ocrResult = new IronTesseract().Read("scanned-archive.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
// IronOCR: native PDF support — no external renderer needed
var text = new IronTesseract().Read("scanned-document.pdf").Text;

// Password-protected PDFs
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
Console.WriteLine(result.Text);

// PDF pesquisável output: make a scanned PDF text-searchable
var ocrResult = new IronTesseract().Read("scanned-archive.pdf");
ocrResult.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr

' IronOCR: native PDF support — no external renderer needed
Dim text = New IronTesseract().Read("scanned-document.pdf").Text

' Password-protected PDFs
Using input As New OcrInput()
    input.LoadPdf("encrypted.pdf", Password:="secret")
    Dim result = New IronTesseract().Read(input)
    Console.WriteLine(result.Text)
End Using

' PDF pesquisável output: make a scanned PDF text-searchable
Dim ocrResult = New IronTesseract().Read("scanned-archive.pdf")
ocrResult.SaveAsSearchablePdf("searchable-output.pdf")
$vbLabelText   $csharpLabel

O recurso de PDF pesquisável incorpora uma camada de texto sobre a imagem digitalizada original, produzindo um PDF que preserva a fidelidade visual e permite a pesquisa de texto completo e o copiar e colar. Este é um requisito comum para sistemas de gestão documental e arquivos de conformidade. O Windows.Media.Ocr não consegue produzir essa saída em nenhuma camada de sua API.

Referência de Mapeamento de API

Windows.Media.Ocr Equivalente de IronOCR
OcrEngine.TryCreateFromLanguage(lang) new IronTesseract() com ocr.Language = OcrLanguage.X
OcrEngine.TryCreateFromUserProfileLanguages() new IronTesseract() (idioma padrão resolvido automaticamente)
engine.RecognizeAsync(softwareBitmap) ocr.Read("image.jpg") ou ocr.Read(ocrInput)
OcrResult.Text OcrResult.Text
OcrResult.Lines OcrResult.Lines (com metadados estendidos)
OcrLine.Text OcrResult.Lines[i].Text
OcrLine.Words OcrResult.Words (com caixas delimitadoras + confiança)
OcrWord.BoundingRect OcrResult.Words[i].X, .Y, .Width, .Height
BitmapDecoder.CreateAsync(stream) input.LoadImage(stream) via OcrInput
StorageFile.GetFileFromPathAsync(path) ocr.Read("path") diretamente
Não há equivalente (PDF não suportado) ocr.Read("document.pdf")
Não há equivalente (PDF não suportado) input.LoadPdf("file.pdf", Password: "x")
Não existe equivalente (nenhum PDF pesquisável) result.SaveAsSearchablePdf("output.pdf")
Não há equivalente (sem pré-processamento) input.Deskew(), input.DeNoise(), input.Contrast()
Não há equivalente (não há versão multilíngue) ocr.AddSecondaryLanguage(OcrLanguage.X)
Não há equivalente (nenhuma confiança) result.Confidence, word.Confidence

Quando as equipes consideram migrar do Windows.Media.Ocr para o IronOCR

O aplicativo ultrapassa os limites da área de trabalho do Windows.

O fator desencadeante mais comum é uma alteração nos requisitos que introduz um ambiente de implantação que não seja o Windows. Um utilitário de desktop que começa como uma ferramenta interna do Windows é promovido a um serviço web, um microsserviço baseado emDockerou uma função em nuvem. Não momento em que isso acontece, o Windows.Media.Ocr se torna um bloqueador. O componente OCR requer uma reescrita completa porque a API não existe na plataforma de destino — não há porta, nem shim de compatibilidade, nem flag de compilação condicional que corrija o problema. As equipes que se planejaram com antecedência usando o IronOCR não precisarão refazer essa reescrita.

Os requisitos de idioma excedem os pacotes instalados.

Os fluxos de processamento de documentos frequentemente expandem seu escopo. Um sistema desenvolvido para processar faturas em inglês recebe a exigência de também lidar com documentos em francês, alemão, árabe ou japonês. Com o Windows.Media.Ocr, o suporte a esses idiomas exige a coordenação da instalação do pacote de idiomas do sistema operacional em todos os destinos de implantação — máquinas de desenvolvimento, VMs de teste, servidores de produção e quaisquer contêineres envolvidos. Em ambientes gerenciados por Política de Grupo ou em VMs na nuvem com infraestrutura de sistema operacional mínima, essa coordenação é impraticável. Os pacotes de idiomas do IronOCR baseados em NuGet são instalados juntamente com o aplicativo e não exigem nenhuma configuração do sistema operacional.

O processamento de PDF foi adicionado ao escopo.

Quando o requisito original era "OCR de imagens de um scanner de mesa", o Windows.Media.Ocr funciona. Quando a exigência se expande para "processar também o acúmulo de PDFs digitalizados em nosso arquivo", uma segunda biblioteca entra em cena. Essa biblioteca representa uma dependência adicional, uma consideração adicional em relação ao licenciamento e uma superfície de falha adicional. Equipes que precisam de OCR tanto para imagens quanto para PDFs em uma API unificada descobrem que o IronOCR elimina a arquitetura de duas bibliotecas desde o início.

A precisão se degrada com dados do mundo real.

Ambientes de digitalização controlados produzem imagens nítidas. Dados do mundo real — fotos tiradas com celulares, digitalizações de mesa levemente distorcidas, documentos antigos recebidos por fax, materiais fotocopiados — produzem uma degradação da precisão que não pode ser corrigida no Windows.Media.Ocr. Quando começam a chegar reclamações de clientes sobre mensagens de texto não enviadas, as equipes descobrem que a etapa de pré-processamento que haviam ignorado se tornou necessária. A adaptação do pré-processamento usando as APIs de Imagem do Windows exige um esforço de desenvolvimento considerável, o que mantém a solução exclusiva para Windows. O pipeline de pré-processamento do IronOCR já está pronto.

Surge a questão da implantação do servidor.

A documentação do Windows.Media.Ocr posiciona explicitamente a API para aplicativos cliente. Executar isso em um contexto de servidor — um aplicativo ASP.NET processando documentos enviados pelo usuário, um serviço do Windows consumindo uma fila de documentos — requer um ambiente Servidor Windows com a Experiência Desktop instalada, que é um perfil de máquina virtual mais pesado e caro do que um contêiner Linux. Quando a equipe de infraestrutura pergunta se o processo de OCR pode ser executado em uma instânciaLinuxpara reduzir os custos de hospedagem, a resposta com o Windows.Media.Ocr é não.

Considerações Comuns de Migração

Alteração do arquivo de projeto TFM

Windows.Media.Ocr requer um TFM específico para Windows no arquivo de projeto (net8.0-windows10.0.19041.0 ou similar). Remover essa dependência para dar suporte a plataformas cruzadas significa remover o sufixo TFM.IronOCR direciona net6.0, net8.0, e net9.0 sem sufixos específicos para Windows. Ao migrar, confirme se nenhuma outra dependência da API WinRT no projeto requer o TFM do Windows — outros recursos da plataforma Windows (integração com o shell, notificações do Windows, etc.) podem precisar ser abstraídos por meio de verificações de plataforma.

Migração de assíncrono para síncrono

Windows.Media.Ocr é totalmente assíncrono — RecognizeAsync retorna IAsyncOperation<OcrResult> que mapeia para Task<OcrResult> via interop WinRT.IronOCR fornece caminhos síncronos e assíncronos. O ocr.Read("file.jpg") síncrono substitui diretamente a cadeia de espera multistep. Para aplicações de servidor onde a chamada OCR reside dentro de um serviço em segundo plano ou um pipeline baseado em tarefas, o caminho assíncrono também está disponível. De qualquer forma, a transição de 6 ou mais etapas assíncronas para 1 chamada é simples:

// Before: Windows.Media.Ocr — 6+ await operations
var file = await StorageFile.GetFileFromPathAsync(imagePath);
using var stream = await file.OpenAsync(FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(stream);
var bitmap = await decoder.GetSoftwareBitmapAsync();
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var winResult = await engine.RecognizeAsync(bitmap);
string text = winResult.Text;

// After:IronOCR— 1 call, same result, any platform
string text = new IronTesseract().Read(imagePath).Text;
// Before: Windows.Media.Ocr — 6+ await operations
var file = await StorageFile.GetFileFromPathAsync(imagePath);
using var stream = await file.OpenAsync(FileAccessMode.Read);
var decoder = await BitmapDecoder.CreateAsync(stream);
var bitmap = await decoder.GetSoftwareBitmapAsync();
var engine = OcrEngine.TryCreateFromUserProfileLanguages();
var winResult = await engine.RecognizeAsync(bitmap);
string text = winResult.Text;

// After:IronOCR— 1 call, same result, any platform
string text = new IronTesseract().Read(imagePath).Text;
Imports Windows.Storage
Imports Windows.Graphics.Imaging
Imports Windows.Media.Ocr

' Before: Windows.Media.Ocr — 6+ await operations
Dim file As StorageFile = Await StorageFile.GetFileFromPathAsync(imagePath)
Using stream = Await file.OpenAsync(FileAccessMode.Read)
    Dim decoder As BitmapDecoder = Await BitmapDecoder.CreateAsync(stream)
    Dim bitmap = Await decoder.GetSoftwareBitmapAsync()
    Dim engine = OcrEngine.TryCreateFromUserProfileLanguages()
    Dim winResult = Await engine.RecognizeAsync(bitmap)
    Dim text As String = winResult.Text
End Using

' After: IronOCR— 1 call, same result, any platform
Dim text As String = New IronTesseract().Read(imagePath).Text
$vbLabelText   $csharpLabel

Substituição do pacote de idiomas

Para cada idioma anteriormente resolvido por OcrEngine.TryCreateFromLanguage(new Windows.Globalization.Language("fr-FR")), instale o pacote de idioma correspondente do IronOCR e configure ocr.Language = OcrLanguage.French. O catálogo de idiomas do IronOCR lista todos os mais de 125 pacotes disponíveis. Os códigos de idioma mapeiam de forma simples de tags BCP-47 para o enumerador OcrLanguage.

Remoção do manuseio nulo do motor

O Windows.Media.Ocr exige a verificação de valores nulos em todas as chamadas de criação do mecanismo. O IronOCR lança exceções estruturadas em vez de retornar nulo em caso de falhas de configuração ou inicialização. Remova as cláusulas de verificação de nulo e substitua-as pelo tratamento de exceções padrão, quando necessário. O resultado é um site de chamadas mais limpo, sem o modo de falha de "idioma indisponível silenciosamente".

Funcionalidades adicionais do IronOCR

Além dos recursos que substituem diretamente a funcionalidade do Windows.Media.Ocr, o IronOCR abrange capacidades para as quais o Windows.Media.Ocr não possui equivalente:

  • Processamento de documentos digitalizados — gerenciamento específico para arquivos digitalizados com várias páginas, incluindo entradas TIFF e PDF com várias páginas.
  • Extração de tabelas — detecção estruturada de dados tabulares em documentos, como itens de faturas, tabelas de relatórios e matrizes de formulários.
  • Tipos de documentos especializados — zonas MRZ de passaportes, linhas MICR de cheques, placas de veículos e texto manuscrito, cada um com seus próprios fluxos de processamento.
  • Acompanhamento do progresso — as operações em lote relatam o progresso por meio de eventos, permitindo barras de progresso e monitoramento da taxa de processamento nas interfaces de usuário do aplicativo.

Compatibilidade com .NET e Preparação para o Futuro

O IronOCR é compatível com .NET 6, .NET 7, .NET 8 e .NET 9 em TFMs padrão, sem sufixos específicos de plataforma, além do .NET Framework 4.6.2 a 4.8 para suporte a aplicativos legados. A biblioteca recebe atualizações regulares acompanhando o ritmo de lançamentos do .NET , com suporte ao .NET 10 previsto para 2026. O Windows.Media.Ocr está disponível em qualquer versão do .NET que suporte interoperabilidade com WinRT a partir do .NET 5, mas o requisito do Windows TFM limita permanentemente sua aplicabilidade a projetos direcionados ao Windows. À medida que a história multiplataforma do .NET amadurece — com mais equipes visando contêineresLinuxe funções em nuvem como destinos de implantação de primeira classe — a restrição TFM do Windows.Media.Ocr se torna uma desvantagem arquitetural mais pronunciada do que uma pequena ressalva.

Conclusão

O Windows.Media.Ocr ocupa um nicho específico e legítimo: um aplicativo para desktopWindows 10/11sem ambições multiplataforma, com necessidades básicas de OCR de imagem e uma restrição orçamentária rígida de US$ 0. Dentro desse nicho, ele funciona. Fora desse nicho — no momento em que a implantação se destina a um contêiner Linux, uma função em nuvem, um servidor com requisitos de vários idiomas ou um pipeline de documentos que processa PDFs — a API não existe na plataforma de destino e o código precisa ser substituído.

A questão mais profunda é que as limitações do Windows.Media.Ocr são arquitetônicas, e não acidentais. O bloqueio de plataforma não é uma opção de configuração que possa ser desativada; Está integrado ao ambiente de execução WinRT do qual a API depende. A disponibilidade de idiomas não é um pacote a ser incluído no momento da compilação; isso é delegado aos administradores do sistema operacional. O suporte a PDF não é um recurso ausente que deva ser adicionado por meio de um pacote NuGet ; Está completamente ausente da superfície da API. Cada limitação exige um sistema separado para compensá-la, e cada sistema compensatório reintroduz dependências de plataforma.

O IronOCR resolve todas as quatro restrições — plataforma, idioma, pré-processamento e PDF — em um único pacote. O preço de entrada $999 não é $0, e para um utilitário de desktop somente para Windows com entrada controlada e documentos apenas em inglês, Windows.Media.Ocr continua sendo uma escolha válida. Para qualquer projeto com requisitos mais amplos, o custo de construir em torno das restrições do Windows.Media.Ocr pode exceder o custo da licença IronOCR em horas de desenvolvedor antes que o projeto chegue ao seu primeiro lançamento em produção.

O teste prático é simples: se o destino da implantação puder ser Linux,Dockerou uma função na nuvem, e se os documentos de entrada puderem ser PDFs ou chegar em idiomas além do pacote padrão do sistema operacional, o Windows.Media.Ocr é a base errada. Descobrir isso no meio do projeto é consideravelmente mais caro do que escolher a ferramenta certa desde o início. A forma mais eficiente de tomar uma decisão é avaliar o conjunto de recursos do IronOCR em relação às suas necessidades específicas antes de optar por uma solução.

ObserveTesseract e Windows Media OCR são marcas registradas de seus respectivos proprietários. Este site não é afiliado, endossado ou patrocinado pelo Google ou Microsoft. Todos os nomes de produtos, logotipos e marcas são propriedade de seus respectivos proprietários. As comparações são apenas para fins informativos e refletem informações disponíveis publicamente no momento da redação.

Perguntas frequentes

O que é Windows.Media.Ocr?

O Windows.Media.Ocr é uma solução de OCR usada por desenvolvedores e empresas para extrair texto de imagens e documentos. É uma das várias opções de OCR avaliadas juntamente com o IronOCR para desenvolvimento de aplicações .NET.

Como o IronOCR se compara ao Windows.Media.Ocr para desenvolvedores .NET?

IronOCR é uma biblioteca OCR .NET nativa do NuGet que utiliza o IronTesseract como mecanismo principal. Comparada ao Windows.Media.Ocr, oferece implantação mais simples (sem instaladores de SDK), preço fixo e uma API C# limpa, sem interoperabilidade COM ou dependências de nuvem.

O IronOCR é mais fácil de configurar do que o Windows.Media.Ocr?

O IronOCR é instalado por meio de um único pacote NuGet. Não há instaladores de SDK, arquivos de licença para copiar, componentes COM para registrar ou binários de tempo de execução separados para gerenciar. Todo o mecanismo de OCR está incluído no pacote.

Quais são as diferenças de precisão entre o Windows.Media.Ocr e o IronOCR?

O IronOCR alcança alta precisão de reconhecimento para documentos comerciais padrão, faturas, recibos e formulários digitalizados. Para documentos muito degradados ou com escritas incomuns, a precisão varia de acordo com a qualidade da fonte. O IronOCR inclui filtros de pré-processamento de imagem para melhorar o reconhecimento em entradas de baixa qualidade.

O IronOCR suporta extração de texto de PDFs?

Sim. O IronOCR extrai texto tanto de PDFs nativos quanto de imagens digitalizadas de PDFs em uma única chamada. Ele também suporta arquivos TIFF com várias páginas, imagens e fluxos de dados. Para PDFs digitalizados, o OCR é aplicado página por página, com objetos de resultado por página.

Como se compara o licenciamento do Windows.Media.Ocr ao do IronOCR?

O IronOCR utiliza uma licença perpétua com preço fixo, sem cobranças por página ou por digitalização. Organizações que processam grandes volumes de documentos pagam o mesmo valor de licença, independentemente do volume. Detalhes e preços por volume estão disponíveis na página de licenciamento do IronOCR.

Quais idiomas o IronOCR suporta?

O IronOCR suporta 127 idiomas através de pacotes de idiomas NuGet separados. Adicionar um idioma requer um único comando 'dotnet add package IronOcr.Languages.{Idioma}'. Não é necessário inserir arquivos manualmente nem configurar caminhos.

Como faço para instalar o IronOCR em um projeto .NET ?

Instale via NuGet: 'Install-Package IronOcr' no Console do Gerenciador de Pacotes ou 'dotnet add package IronOcr' na CLI. Pacotes de idiomas adicionais são instalados da mesma forma. Não é necessário instalar o SDK nativo.

O IronOCR é adequado para Docker e implantações em contêineres, ao contrário do Windows.Media.Ocr?

Sim. O IronOCR funciona em contêineres Docker por meio de seu pacote NuGet. A chave de licença é definida por meio de uma variável de ambiente. Não são necessários arquivos de licença, caminhos de SDK ou montagens de volume para o próprio mecanismo de OCR.

Posso experimentar o IronOCR antes de comprar, em comparação com o Windows.Media.Ocr?

Sim. O modo de avaliação do IronOCR processa documentos e retorna resultados de OCR com uma marca d'água sobreposta. Você pode verificar a precisão em seus próprios documentos antes de adquirir uma licença.

O IronOCR suporta leitura de código de barras juntamente com extração de texto?

O IronOCR concentra-se na extração de texto e OCR. Para leitura de código de barras, a Iron Software fornece o IronBarcode como uma biblioteca complementar. Ambos estão disponíveis individualmente ou como parte do pacote Iron Suite.

É fácil migrar do Windows.Media.Ocr para o IronOCR?

A migração do Windows.Media.Ocr para o IronOCR normalmente envolve a substituição das sequências de inicialização pela instanciação do IronTesseract, a remoção do gerenciamento do ciclo de vida COM e a atualização das chamadas de API. A maioria das migrações reduz significativamente a complexidade do código.

Kannaopat Udonpant
Engenheiro de Software
Antes de se tornar Engenheiro de Software, Kannapat concluiu um doutorado em Recursos Ambientais pela Universidade de Hokkaido, no Japão. Durante o doutorado, Kannapat também integrou o Laboratório de Robótica Veicular, que faz parte do Departamento de Engenharia de Bioprodução. Em 2022, ele utilizou suas habilidades ...
Leia mais

Equipe de Suporte Iron

Estamos online 24 horas por dia, 5 dias por semana.
Bater papo
E-mail
Liga para mim