IronOCR vs AWS Textract: soluções de OCR para startups
GdPicture.NET requer uma licença básica antes que você pague um único dólar pelo plugin OCR — e se você quiser ler PDFs ou produzir saída pesquisável, você precisa de plugins PDF adicionais também. Entre em contato com o GdPicture para preços atuais. Para uma equipe que precisa extrair texto de imagens e PDFs, o custo combinado de múltiplos plugins mais taxas de manutenção anual pode aumentar significativamente. A cobrança é uma consequência direta da arquitetura do GdPicture: trata-se de uma plataforma completa de imagens de documentos que abrange digitalização, DICOM, anotações, processamento de código de barras e edição de PDF, sendo o OCR apenas um dos muitos plugins disponíveis. Equipes com necessidades que exigem apenas OCR absorvem o custo de um SDK completo de processamento de imagens de documentos que nunca usarão totalmente.
A API reflete a mesma filosofia. GdPicture usa IDs de imagem inteiros para rastrear recursos na memória — cada imagem que você carrega retorna um int, você chama métodos contra esse identificador inteiro e depois deve liberá-lo explicitamente ou aceitar um vazamento de memória. Esse padrão antecede as declarações IDisposable e using. Funciona, mas coloca o ônus de cada decisão de limpeza sobre o desenvolvedor, sempre. Esta comparação examina essas duas tensões — o preço baseado em plugins e o ciclo de vida do ID da imagem — juntamente com a complexidade da API, o pré-processamento e o tratamento de PDFs, tendo o IronOCR como contraponto.
Entendendo o GdPicture .NET
GdPicture .NET é um SDK comercial para edição de imagens de documentos desenvolvido pela ORPALIS. Ao longo de muitos anos, foi construída uma plataforma abrangente que engloba processamento de imagens, criação e edição de PDFs, leitura e geração de códigos de barras, integração de scanners TWAIN/WIA, imagens médicas DICOM, fluxos de trabalho de anotação e revisão, e arquivamento de documentos com conformidade com PDF/A. O OCR é uma das funcionalidades dentro desse ecossistema, disponibilizada por meio de um plugin dedicado.
O SDK organiza sua funcionalidade em módulos distintos, cada um com sua própria classe principal:
- GdPictureImaging — carregamento, processamento e conversão de formatos de imagens, além de ser a fonte de todos os IDs de imagem inteiros.
- GdPicturePDF — Criação, edição, renderização e operações de OCR em nível de página para PDFs (licença de plugin separada necessária)
- GdPictureOCR — reconhecimento e extração de texto; Consome IDs de imagem produzidos por GdPictureImaging.
- GdPicture1DBarcode / GdPicture2DBarcode — leitura e gravação de códigos de barras lineares e 2D (licenças de plugin separadas)
- GdPictureDocumentImaging — filtros avançados de limpeza de documentos, incluindo correção de distorção, remoção de ruído, remoção de bordas e remoção de furos (plugin separado)
- GdPictureAnnotations — marcação, revisão e redação de documentos
Mesmo o OCR básico exige a instanciação de dois componentes — GdPictureImaging para carregar a imagem e GdPictureOCR para reconhecer o texto — e gerenciar ambos os seus ciclos de vida. O OCR de um PDF requer um terceiro: GdPicturePDF. O próprio namespace inclui um número de versão (GdPicture14), o que significa que toda grande atualização do SDK força uma busca e substituição em toda a base de código.
A árvore de dependências de plugins para cenários comuns de OCR tem a seguinte aparência:
| Se você precisar | Você precisa de uma licença. |
|---|---|
| OCR a partir de imagens | Licença básica + Plugin OCR |
| OCR a partir de PDFs | Base + Plugin OCR + Plugin PDF |
| Saída em PDF pesquisável | Base + Plugin OCR + Plugin PDF |
| Limpeza de documentos antes do OCR | Base + Plugin OCR + Plugin de Imagem de Documentos |
Ciclo de vida do ID da imagem
A característica arquitetônica que define o GdPicture é o gerenciamento de IDs de imagem inteiros. Carregar qualquer imagem aloca memória dentro do tempo de execução do GdPicture e retorna um identificador int. Você usa esse número inteiro para referenciar a imagem em todas as chamadas subsequentes. Quando você termina, chama ReleaseGdPictureImage com esse inteiro. Caso contrário, a memória não será liberada até que o processo termine.
using GdPicture14;
// Every image load returns an integer handle
int imageId = _imaging.CreateGdPictureImageFromFile(imagePath);
if (imageId == 0)
{
throw new Exception($"Failed to load image: {_imaging.GetStat()}");
}
try
{
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId))
{
throw new Exception($"OCR failed: {_ocr.GetStat()}");
}
return _ocr.GetOCRResultText(resultId);
}
finally
{
// CRITICAL: omitting this line causes a memory leak
_imaging.ReleaseGdPictureImage(imageId);
}
using GdPicture14;
// Every image load returns an integer handle
int imageId = _imaging.CreateGdPictureImageFromFile(imagePath);
if (imageId == 0)
{
throw new Exception($"Failed to load image: {_imaging.GetStat()}");
}
try
{
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId))
{
throw new Exception($"OCR failed: {_ocr.GetStat()}");
}
return _ocr.GetOCRResultText(resultId);
}
finally
{
// CRITICAL: omitting this line causes a memory leak
_imaging.ReleaseGdPictureImage(imageId);
}
Imports GdPicture14
' Every image load returns an integer handle
Dim imageId As Integer = _imaging.CreateGdPictureImageFromFile(imagePath)
If imageId = 0 Then
Throw New Exception($"Failed to load image: {_imaging.GetStat()}")
End If
Try
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
If String.IsNullOrEmpty(resultId) Then
Throw New Exception($"OCR failed: {_ocr.GetStat()}")
End If
Return _ocr.GetOCRResultText(resultId)
Finally
' CRITICAL: omitting this line causes a memory leak
_imaging.ReleaseGdPictureImage(imageId)
End Try
Ao processar PDFs com várias páginas, cada página renderizada gera um ID de imagem separado. Um documento de 100 páginas com resolução de 200 DPI pode alocar de 1 a 5 GB de memória se a limpeza for negligenciada. O padrão correto requer coletar todos os IDs e liberá-los em um bloco finally — mas essa disciplina é inteiramente responsabilidade do desenvolvedor.
Entendendo o IronOCR
IronOCR é uma biblioteca OCR comercial para .NET , construída como um único pacote NuGet . Sua meta de design é precisão sem overhead de configuração: instale o pacote, configure uma chave de licença, chame Read. A biblioteca encapsula um mecanismo Tesseract 5 otimizado com pré-processamento automático, manipulação nativa de PDFs e acesso estruturado aos resultados, tudo exposto por meio de padrões .NET padrão.
Principais características:
- Pacote NuGet único —
dotnet add package IronOcrinstala tudo, incluindo suporte ao idioma inglês; Sem pastas de recursos externos, sem gerenciamento de binários nativos. - Gerenciamento de recursos padrão .NET —
OcrInputimplementaIDisposable; uma declaraçãousinglida com toda a limpeza, independentemente das exceções - Pré-processamento automático — Deskew, DeNoise, Contraste, Binarização e EnhanceResolution são chamadas de método de uma linha em
OcrInput; O motor também aplica correções automáticas sem instruções explícitas. - Entrada de PDF nativa — PDFs digitalizados e PDFs nativos são alimentados diretamente em
IronTesseract.Readsem uma etapa de renderização separada - Seguro para threads por design — uma única instância
IronTesseractlida com solicitações simultâneas;Parallel.ForEachfunciona sem sincronização adicional - 125+ idiomas — distribuídos como pacotes NuGet separados (
IronOcr.Languages.French, etc.), sem pasta tessdata para gerenciar - Acesso estruturado aos resultados —
OcrResultexpõe.Pages,.Lines,.Words,.Characterse.Barcodescomo coleções tipadas com dados de coordenadas
O preço é perpétuo: $999 Lite, $1,499 Plus, $2,999 Professional, $5,999 Unlimited. Todas as funcionalidades estão disponíveis em todos os planos; A diferença reside no número de desenvolvedores e projetos abrangidos.
Comparação de recursos
| Recurso | GdPicture.NET | IronOCR |
|---|---|---|
| Modelo de preços | Licença perpétua baseada em plugins + manutenção de 20% ao ano. | Plano perpétuo, com atualizações anuais opcionais. |
| Custo de entrada (OCR a partir de PDFs) | Múltiplos plugins necessários (entre em contato com o GdPicture para preços) | $2,999 (um pacote, todos os recursos) |
| Gestão de recursos | Rastreamento e liberação manual de IDs inteiros | IDisposable / declaração de using |
| Estabilidade do espaço de nomes | Número de versão no namespace (GdPicture14) |
Sem dependência de versão (IronOcr) |
| OCR de PDF | Requer um plugin de PDF separado. | Integrado, sem necessidade de licença adicional. |
| Instalação | Vários pacotes NuGet + pasta de recursos externa | Um único NuGet, sem arquivos externos. |
| Multiplataforma | Windows, Linux, macOS | Windows, Linux, macOS, Docker, AWS, Azure |
Comparação Detalhada de Recursos
| Recurso | GdPicture.NET | IronOCR |
|---|---|---|
| Configuração e instalação | ||
| Instalação do NuGet | São necessários vários embalagens. | dotnet add package IronOcr |
| Pasta de recursos externos | Obrigatório (arquivos de idioma no estilo tessdata) | Não obrigatório (incluído) |
| Ativação de licença | LicenseManager.RegisterKEY() |
IronOcr.License.LicenseKey = "..." |
| Inicialização de componentes | 3 a 4 classes para fluxo de trabalho de OCR de PDF | new IronTesseract() |
| Namespace em atualização principal | É necessário atualizar todos os arquivos de origem. | Nenhuma alteração necessária |
| Capacidades de OCR | ||
| OCR de imagem | Sim | Sim |
| OCR de PDF | Sim (é necessário o plugin PDF) | Sim (integrado) |
| PDF protegido por senha | Sim | Sim |
| PDF com várias páginas | Loop de página manual + limpeza de ID | Automático |
| Saída em PDF pesquisável | OcrPage + SaveToFile |
result.SaveAsSearchablePdf() |
| Exportação hOCR | Não | Sim |
| Pré-processamento | ||
| Desvio | Através do plugin GdPictureDocumentImaging | input.Deskew() |
| Remoção de ruído | Através do plugin GdPictureDocumentImaging | input.DeNoise() |
| Aprimoramento de contraste | Via GdPictureImaging | input.Contrast() |
| Binarização | Via GdPictureImaging | input.Binarize() |
| Melhoria de DPI | Via GdPictureImaging | input.EnhanceResolution(300) |
| Correção automática (sem código) | Não | Sim (integrado ao Read) |
| Gestão de Recursos | ||
| Modelo de gerenciamento de memória | Rastreamento manual de IDs inteiros | IDisposable / GC |
| risco de vazamento de memória | Alto (imagem ReleaseGdPictureImage ausente) | Nenhum (usando declaração) |
| Segurança da rosca | Gerenciamento manual de instâncias | Projetado para ser seguro contra roscas. |
| Resultados e dados | ||
| Texto simples | GetOCRResultText(resultId) |
result.Text |
| Pontuação de confiança | GetOCRResultConfidence(resultId) |
result.Confidence |
| Dados ao nível da palavra | Iteração aninhada de bloco/linha/palavra | Coleta de result.Words |
| Acesso coordenado | Por meio de chamadas de índice de bloco/linha/palavra | Direto .X, .Y, .Width, .Height |
| Leitura de código de barras durante OCR | Por meio de um plugin de código de barras separado | ocr.Configuration.ReadBarCodes = true |
| Línguas | ||
| Contagem de idiomas | Cobertura semelhante baseada no Tesseract | Mais de 125 pacotes NuGet |
| Distribuição de idiomas | Arquivos da pasta de recursos | pacotes NuGet |
| Multilíngue em uma única passagem | Sim | Sim (AddSecondaryLanguage) |
| Implantação | ||
| Docker | Apoiado | Apoiado (documentado) |
| Linux | Apoiado | Apoiado |
| AWS Lambda | Possível | Guia documentado |
| Serviço de Aplicativos do Azure | Possível | Guia documentado |
Ciclo de vida do ID da imagem vs. OCR descartável
A diferença arquitetônica mais significativa entre GdPicture e IronOCR não reside em recursos, mas sim na forma como cada biblioteca gerencia a memória das imagens que processa.
Abordagem GdPicture
Cada imagem em GdPicture existe como um identificador inteiro em um pool gerenciado em tempo de execução. Você adquire o identificador carregando uma imagem, passa esse número inteiro para o OCR e outras operações e, em seguida, o libera quando terminar. O padrão é explícito e correto quando seguido. O problema é que é fácil errar, e a consequência é um crescimento ilimitado da memória.
O fluxo de trabalho de OCR em PDF demonstra o risco de forma mais clara. Cada chamada para pdf.RenderPageToGdPictureImage() aloca uma nova imagem raster na memória e retorna um novo ID inteiro. Um documento de 100 páginas gera 100 alocações separadas. Falta uma chamada ReleaseGdPictureImage e o processo acumula memória vazada:
using GdPicture14;
public string ExtractTextFromPdf(string pdfPath)
{
var text = new StringBuilder();
using var pdf = new GdPicturePDF();
GdPictureStatus status = pdf.LoadFromFile(pdfPath, false);
if (status != GdPictureStatus.OK)
throw new Exception($"Failed to load PDF: {status}");
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
// Each page render = new memory allocation + new integer ID
int imageId = pdf.RenderPageToGdPictureImage(200, false);
if (imageId == 0) continue;
try
{
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (!string.IsNullOrEmpty(resultId))
text.AppendLine(_ocr.GetOCRResultText(resultId));
}
finally
{
// Without this: ~10–50MB leaked per page
_imaging.ReleaseGdPictureImage(imageId);
}
}
return text.ToString();
}
using GdPicture14;
public string ExtractTextFromPdf(string pdfPath)
{
var text = new StringBuilder();
using var pdf = new GdPicturePDF();
GdPictureStatus status = pdf.LoadFromFile(pdfPath, false);
if (status != GdPictureStatus.OK)
throw new Exception($"Failed to load PDF: {status}");
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
// Each page render = new memory allocation + new integer ID
int imageId = pdf.RenderPageToGdPictureImage(200, false);
if (imageId == 0) continue;
try
{
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (!string.IsNullOrEmpty(resultId))
text.AppendLine(_ocr.GetOCRResultText(resultId));
}
finally
{
// Without this: ~10–50MB leaked per page
_imaging.ReleaseGdPictureImage(imageId);
}
}
return text.ToString();
}
Imports GdPicture14
Imports System.Text
Public Function ExtractTextFromPdf(ByVal pdfPath As String) As String
Dim text As New StringBuilder()
Using pdf As New GdPicturePDF()
Dim status As GdPictureStatus = pdf.LoadFromFile(pdfPath, False)
If status <> GdPictureStatus.OK Then
Throw New Exception($"Failed to load PDF: {status}")
End If
Dim pageCount As Integer = pdf.GetPageCount()
For i As Integer = 1 To pageCount
pdf.SelectPage(i)
' Each page render = new memory allocation + new integer ID
Dim imageId As Integer = pdf.RenderPageToGdPictureImage(200, False)
If imageId = 0 Then Continue For
Try
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
If Not String.IsNullOrEmpty(resultId) Then
text.AppendLine(_ocr.GetOCRResultText(resultId))
End If
Finally
' Without this: ~10–50MB leaked per page
_imaging.ReleaseGdPictureImage(imageId)
End Try
Next
End Using
Return text.ToString()
End Function
O processamento em lote de vários PDFs agrava isso. A documentação para cada loop for deve conter uma nota lembrando aos mantenedores para coletar IDs em um List<int> e liberá-los todos em finally. Isso é trabalho de infraestrutura, não trabalho de OCR.
Abordagem IronOCR
OcrInput é um IDisposable padrão. Uma declaração using garante a limpeza, quer o método retorne normalmente ou lance uma exceção. Não há IDs inteiros para rastrear, nenhum componente de imagem separado para inicializar e nenhuma etapa externa de renderização DPI para páginas PDF.
using IronOcr;
public string ExtractTextFromPdf(string pdfPath)
{
// LoadPdf handles page rendering internally
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = new IronTesseract().Read(input);
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
return result.Text;
// using block exits — all internal resources released automatically
}
using IronOcr;
public string ExtractTextFromPdf(string pdfPath)
{
// LoadPdf handles page rendering internally
using var input = new OcrInput();
input.LoadPdf(pdfPath);
var result = new IronTesseract().Read(input);
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text}");
return result.Text;
// using block exits — all internal resources released automatically
}
Imports IronOcr
Public Function ExtractTextFromPdf(pdfPath As String) As String
' LoadPdf handles page rendering internally
Using input As New OcrInput()
input.LoadPdf(pdfPath)
Dim result = New IronTesseract().Read(input)
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Text}")
Next
Return result.Text
' using block exits — all internal resources released automatically
End Using
End Function
Para PDFs protegidos por senha, o parâmetro é um argumento nomeado em vez de uma sobrecarga separada que requer verificação de status adicional:
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");
using var input = new OcrInput();
input.LoadPdf("encrypted.pdf", Password: "secret");
var result = new IronTesseract().Read(input);
result.SaveAsSearchablePdf("searchable-output.pdf");
Imports IronOcr
Using input As New OcrInput()
input.LoadPdf("encrypted.pdf", Password:="secret")
Dim result = New IronTesseract().Read(input)
result.SaveAsSearchablePdf("searchable-output.pdf")
End Using
O guia de entrada de PDF do IronOCR aborda opções adicionais, incluindo a seleção de intervalo de páginas. Para equipes já familiarizadas com padrões IDisposable no Entity Framework, HttpClient e manuseio de streams, OcrInput não exige um novo modelo mental.
Custo do pacote de plugins
Para uma aplicação de servidor que extrai texto de imagens e PDFs e produz saída pesquisável, a pilha de licenças da GdPicture requer múltiplos plugins. Entre em contato com a GdPicture para preços atuais na licença básica Professional, plugin OCR e plugin PDF. As taxas de manutenção anual (tipicamente uma porcentagem do custo total da licença) somam-se ao longo do tempo.
O IronOCR Professional abrange o mesmo fluxo de trabalho em um único pacote:
IronOCR Professional: $professionalLicense (compra única)
Atualizações anuais opcionais: $plusLicense/ano
Total de 3 anos (perpétuo, sem atualizações): $professionalLicense
A diferença de custo de vários anos pode ser significativa, dependendo das preferências de atualização. Essa lacuna existe porque o modelo de plugins do GdPicture tem preço voltado para uma plataforma completa de digitalização de documentos, e não para cargas de trabalho focadas em OCR. O plugin de OCR é necessário antes do plugin PDF que o torna utilizável para o formato de entrada de OCR mais comum.
As equipes que avaliam o GdPicture para OCR pagam por recursos que raramente aparecem em projetos já consolidados focados em OCR: integração com scanners TWAIN/WIA, imagens médicas DICOM, fluxos de trabalho de anotação e redação, e edição avançada de PDFs além da extração de texto. Veja a página de licenciamento IronOCR para um modelo de preços onde todos os recursos estão disponíveis em todos os níveis — sem plugins, sem addons, sem decisões de licenciamento por recurso.
Complexidade da API e pré-processamento
O GdPicture expõe o pré-processamento por meio de GdPictureImaging (contraste, binarização, escalonamento de resolução) e através de um plug-in GdPictureDocumentImaging separado (deskew, despeckle, remoção de borda). Aplicar a correção de distorção antes do OCR requer a licença do plugin Document Imaging, criando um terceiro custo adicional para qualquer fluxo de trabalho que processe documentos digitalizados de qualidade variável.
Abordagem GdPicture
O fluxo de trabalho completo para um PDF digitalizado de baixa qualidade — carregar, pré-processar, realizar OCR em cada página e liberar — abrange três classes de componentes e requer uma verificação cuidadosa do status em cada etapa:
using GdPicture14;
public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
using var pdf = new GdPicturePDF();
GdPictureStatus status = pdf.LoadFromFile(inputPdf, false);
if (status != GdPictureStatus.OK)
throw new Exception($"Load failed: {status}");
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
// OcrPage adds text layer to each page
// Requires: OCR plugin + PDF plugin + resource folder path
GdPictureStatus ocrStatus = pdf.OcrPage(
"eng",
@"C:\GdPicture\Resources\OCR", // Pasta de recursos externos required
"",
200
);
if (ocrStatus != GdPictureStatus.OK)
Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}");
}
pdf.SaveToFile(outputPdf, true);
}
using GdPicture14;
public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
using var pdf = new GdPicturePDF();
GdPictureStatus status = pdf.LoadFromFile(inputPdf, false);
if (status != GdPictureStatus.OK)
throw new Exception($"Load failed: {status}");
int pageCount = pdf.GetPageCount();
for (int i = 1; i <= pageCount; i++)
{
pdf.SelectPage(i);
// OcrPage adds text layer to each page
// Requires: OCR plugin + PDF plugin + resource folder path
GdPictureStatus ocrStatus = pdf.OcrPage(
"eng",
@"C:\GdPicture\Resources\OCR", // Pasta de recursos externos required
"",
200
);
if (ocrStatus != GdPictureStatus.OK)
Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}");
}
pdf.SaveToFile(outputPdf, true);
}
Imports GdPicture14
Public Sub CreateSearchablePdf(inputPdf As String, outputPdf As String)
Using pdf As New GdPicturePDF()
Dim status As GdPictureStatus = pdf.LoadFromFile(inputPdf, False)
If status <> GdPictureStatus.OK Then
Throw New Exception($"Load failed: {status}")
End If
Dim pageCount As Integer = pdf.GetPageCount()
For i As Integer = 1 To pageCount
pdf.SelectPage(i)
' OcrPage adds text layer to each page
' Requires: OCR plugin + PDF plugin + resource folder path
Dim ocrStatus As GdPictureStatus = pdf.OcrPage(
"eng",
"C:\GdPicture\Resources\OCR", ' Pasta de recursos externos required
"",
200
)
If ocrStatus <> GdPictureStatus.OK Then
Console.WriteLine($"Warning: Page {i} OCR failed: {ocrStatus}")
End If
Next
pdf.SaveToFile(outputPdf, True)
End Using
End Sub
O caminho ResourceFolder não é opcional. Deve resolver para um diretório contendo arquivos de idioma .traineddata em tempo de execução. Esse caminho funciona na máquina de desenvolvimento, mas falha na produção quando a conta de serviço não consegue ver C:\GdPicture\Resources\OCR, ou quando o aplicativo é implantado no Linux, ou quando as imagensDockernão incluem essa estrutura de diretório. Depurar essas falhas frequentemente significa perseguir códigos genéricos de erro GdPictureStatus que dizem pouco sobre a causa raiz.
Abordagem IronOCR
O fluxo de trabalho equivalente no IronOCR— incluindo o pré-processamento para correção de distorção e remoção de ruído — consiste em cinco linhas:
using IronOcr;
public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(inputPdf);
input.Deskew(); // Não separate plugin required
input.DeNoise();
var result = ocr.Read(input);
result.SaveAsSearchablePdf(outputPdf);
}
using IronOcr;
public void CreateSearchablePdf(string inputPdf, string outputPdf)
{
var ocr = new IronTesseract();
using var input = new OcrInput();
input.LoadPdf(inputPdf);
input.Deskew(); // Não separate plugin required
input.DeNoise();
var result = ocr.Read(input);
result.SaveAsSearchablePdf(outputPdf);
}
Imports IronOcr
Public Sub CreateSearchablePdf(inputPdf As String, outputPdf As String)
Dim ocr As New IronTesseract()
Using input As New OcrInput()
input.LoadPdf(inputPdf)
input.Deskew() ' Não separate plugin required
input.DeNoise()
Dim result = ocr.Read(input)
result.SaveAsSearchablePdf(outputPdf)
End Using
End Sub
O suporte ao idioma inglês está incorporado no pacote NuGet . Idiomas adicionais são instalados como pacotes NuGet (IronOcr.Languages.French) em vez de arquivos .traineddata em um caminho de sistema de arquivos. O guia de correção de qualidade de imagem e o guia de correção de orientação de imagem cobrem todo o conjunto de opções de pré-processamento disponíveis em OcrInput.
Para processamento com reconhecimento de confiança — filtrando resultados abaixo de um limite antes de gravar em um banco de dados, por exemplo — o objeto de resultado expõe a confiança diretamente:
var result = new IronTesseract().Read("scanned.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");
// Per-word confidence for fine-grained filtering
var highConfidenceWords = result.Words
.Where(w => w.Confidence > 85)
.Select(w => w.Text);
var result = new IronTesseract().Read("scanned.jpg");
Console.WriteLine($"Confidence: {result.Confidence}%");
// Per-word confidence for fine-grained filtering
var highConfidenceWords = result.Words
.Where(w => w.Confidence > 85)
.Select(w => w.Text);
Imports System
Imports System.Linq
Dim result = (New IronTesseract()).Read("scanned.jpg")
Console.WriteLine($"Confidence: {result.Confidence}%")
' Per-word confidence for fine-grained filtering
Dim highConfidenceWords = result.Words _
.Where(Function(w) w.Confidence > 85) _
.Select(Function(w) w.Text)
O GdPicture requer três loops aninhados — blocos, linhas, palavras — para alcançar os mesmos dados, com chamadas de método baseadas em índice em cada nível (GetOCRResultBlockLineWordConfidence(resultId, b, l, w)). O guia prático de pontuação de confiança demonstra o modelo de acesso estruturado para casos de uso comuns.
Dados estruturados e acesso a resultados
A extração de coordenadas e valores de confiança por palavra é um requisito comum para fluxos de trabalho de compreensão de documentos — extração de campos de faturas, processamento de formulários e análise de layout, todos precisam disso.
Abordagem GdPicture
O GdPicture retorna uma string resultId de RunOCR(), e todos os dados de resultados são consultados através desse ID por meio de chamadas de método na instância GdPictureOCR. Para atingir a confiança por palavra, é necessário iterar por três níveis aninhados:
using GdPicture14;
public List<(string word, float confidence)> GetWordConfidences(int imageId)
{
var words = new List<(string, float)>();
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
int blockCount = _ocr.GetOCRResultBlockCount(resultId);
for (int b = 0; b < blockCount; b++)
{
int lineCount = _ocr.GetOCRResultBlockLineCount(resultId, b);
for (int l = 0; l < lineCount; l++)
{
int wordCount = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l);
for (int w = 0; w < wordCount; w++)
{
string word = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w);
float conf = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w);
words.Add((word, conf));
}
}
}
return words;
}
using GdPicture14;
public List<(string word, float confidence)> GetWordConfidences(int imageId)
{
var words = new List<(string, float)>();
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
int blockCount = _ocr.GetOCRResultBlockCount(resultId);
for (int b = 0; b < blockCount; b++)
{
int lineCount = _ocr.GetOCRResultBlockLineCount(resultId, b);
for (int l = 0; l < lineCount; l++)
{
int wordCount = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l);
for (int w = 0; w < wordCount; w++)
{
string word = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w);
float conf = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w);
words.Add((word, conf));
}
}
}
return words;
}
Imports GdPicture14
Public Function GetWordConfidences(imageId As Integer) As List(Of (word As String, confidence As Single))
Dim words As New List(Of (String, Single))()
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
Dim blockCount As Integer = _ocr.GetOCRResultBlockCount(resultId)
For b As Integer = 0 To blockCount - 1
Dim lineCount As Integer = _ocr.GetOCRResultBlockLineCount(resultId, b)
For l As Integer = 0 To lineCount - 1
Dim wordCount As Integer = _ocr.GetOCRResultBlockLineWordCount(resultId, b, l)
For w As Integer = 0 To wordCount - 1
Dim word As String = _ocr.GetOCRResultBlockLineWordText(resultId, b, l, w)
Dim conf As Single = _ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w)
words.Add((word, conf))
Next
Next
Next
Return words
End Function
Isso não está errado — os dados são acessíveis. Mas isso exige compreender e manter um índice tridimensional da estrutura de resultados para cada projeto que necessite de dados em nível de palavra.
Abordagem IronOCR
OcrResult expõe .Words como uma coleção tipada. LINQ atua diretamente contra isso:
using IronOcr;
var result = new IronTesseract().Read("invoice.jpg");
// All words with position and confidence
foreach (var word in result.Words)
{
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}");
}
// Lines, paragraphs, and pages follow the same pattern
foreach (var line in result.Lines)
Console.WriteLine(line.Text);
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters");
using IronOcr;
var result = new IronTesseract().Read("invoice.jpg");
// All words with position and confidence
foreach (var word in result.Words)
{
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}");
}
// Lines, paragraphs, and pages follow the same pattern
foreach (var line in result.Lines)
Console.WriteLine(line.Text);
foreach (var page in result.Pages)
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters");
Imports IronOcr
Dim result = New IronTesseract().Read("invoice.jpg")
' All words with position and confidence
For Each word In result.Words
Console.WriteLine($"'{word.Text}' at ({word.X},{word.Y}) — {word.Confidence:P0}")
Next
' Lines, paragraphs, and pages follow the same pattern
For Each line In result.Lines
Console.WriteLine(line.Text)
Next
For Each page In result.Pages
Console.WriteLine($"Page {page.PageNumber}: {page.Text.Length} characters")
Next
O OCR baseado em região — que extrai texto de um retângulo definido em um documento — é igualmente direto:
var region = new CropRectangle(0, 0, 600, 100); // header area
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
var headerText = new IronTesseract().Read(input).Text;
var region = new CropRectangle(0, 0, 600, 100); // header area
using var input = new OcrInput();
input.LoadImage("invoice.jpg", region);
var headerText = new IronTesseract().Read(input).Text;
Imports IronOcr
Dim region As New CropRectangle(0, 0, 600, 100) ' header area
Using input As New OcrInput()
input.LoadImage("invoice.jpg", region)
Dim headerText As String = New IronTesseract().Read(input).Text
End Using
O guia de resultados de leitura e o guia de OCR baseado em região mostram como esses padrões se estendem a documentos com várias páginas e fluxos de trabalho de extração de campos estruturados.
Referência de Mapeamento de API
| GdPicture.NET | Equivalente de IronOCR |
|---|---|
LicenseManager.RegisterKEY("key") |
IronOcr.License.LicenseKey = "key" |
new GdPictureImaging() |
Não é necessário — tratado internamente. |
new GdPictureOCR() |
new IronTesseract() |
new GdPicturePDF() |
Não requerido — OcrInput.LoadPdf() lida com isso |
ocr.ResourceFolder = path |
Não é necessário — recursos incluídos no NuGet. |
imaging.CreateGdPictureImageFromFile(path) |
input.LoadImage(path) em OcrInput |
imaging.ReleaseGdPictureImage(imageId) |
using var input = new OcrInput() — automático |
ocr.SetImage(imageId) |
Não requerido — OcrInput mantém a imagem |
ocr.Language = "eng" |
ocr.Language = OcrLanguage.English |
ocr.RunOCR() → resultId |
ocr.Read(input) → OcrResult |
ocr.GetOCRResultText(resultId) |
result.Text |
ocr.GetOCRResultConfidence(resultId) |
result.Confidence |
ocr.GetOCRResultBlockLineWordText(resultId, b, l, w) |
result.Words[i].Text |
ocr.GetOCRResultBlockLineWordConfidence(resultId, b, l, w) |
result.Words[i].Confidence |
pdf.LoadFromFile(path, false) → GdPictureStatus |
input.LoadPdf(path) — lança em caso de falha |
pdf.LoadFromFile(path, password) |
input.LoadPdf(path, Password: password) |
pdf.RenderPageToGdPictureImage(200, false) |
Não é necessário — o IronOCR renderiza internamente. |
pdf.SelectPage(i) |
Não é necessário — todas as páginas são processadas por padrão. |
pdf.GetPageCount() |
Não requerido — ou result.Pages.Count |
pdf.OcrPage("eng", resourcePath, "", 200) |
result.SaveAsSearchablePdf(outputPath) |
pdf.SaveToFile(outputPath, true) |
result.SaveAsSearchablePdf(outputPath) |
imaging.GetStat() / ocr.GetStat() |
Exceções padrão do .NET |
Verificação de GdPictureStatus.OK após cada chamada |
Não é necessário — as exceções se propagam normalmente. |
using GdPicture14; |
using IronOcr; |
Quando as equipes consideram migrar do GdPicture .NET para o IronOCR
OCR é o único requisito.
As equipes que implementam fluxos de trabalho de ingestão de documentos — como a entrada de faturas digitalizadas, o processamento de formulários médicos e a extração de texto de contratos — costumam avaliar o GdPicture porque ele aparece em diretórios de software Enterprise ao lado do LEADTOOLS e do Kofax. Assim que a tabela de dependências do plugin ficar clara, o cenário muda. O plugin PDF não é opcional se a entrada de PDF for necessária. O plugin Document Imaging não é opcional se o pré-processamento for necessário. Uma equipe que precisa de OCR a partir de PDFs digitalizados com correção de deskew acaba com três licenças de plugin a um custo significativo de entrada no Professional. Quando o requisito é a extração de texto e nada na lista de recursos do GdPicture além disso é necessário, esse preço representa um ônus puro.IronOCR em $2,999 Professional cobre o fluxo de trabalho idêntico — entrada de imagem, entrada de PDF, pré-processamento, saída de PDF pesquisável — de um único pacote, sem decisões de plugins a serem feitas.
Incidentes de vazamento de memória em produção
O ciclo de vida de IDs inteiros se torna um incidente de produção prestes a acontecer em serviços de processamento de documentos de alto volume. Um endpoint de API web que processa PDFs carregados sob carga eventualmente terá um trecho de código onde a chamada de liberação da imagem não será alcançada — um retorno prematuro em um ramo de erro, uma exceção não tratada antes do bloco de limpeza, ou simplesmente um novo desenvolvedor não familiarizado com o padrão adicionando um método auxiliar que recebe um identificador de imagem inteiro como parâmetro e se esquece de liberá-lo. A memória aumenta, o serviço fica mais lento e a causa raiz não é óbvia em um despejo de memória. Equipes que depuraram um desses incidentes geralmente desejam um modelo em que o ambiente de execução lide com a limpeza. O padrão de descarte padrão no IronOCR é esse modelo — limpeza estruturada imposta pelo compilador em vez de pela disciplina do desenvolvedor em cada ponto de chamada.
Atrito na atualização da versão
O GdPicture incorpora o número da versão principal em seu espaço de nomes. A atualização da versão 14 para a versão 15 exige a atualização dessa diretiva de namespace em todos os arquivos de origem que fazem referência às classes GdPicture. Em uma aplicação de grande porte com OCR, manipulação de PDF e processamento de imagens distribuídos por dezenas de serviços e classes de utilitários, essa é uma tarefa de migração complexa — e não oferece nenhum benefício funcional. Todas as bibliotecas .NET modernas, desde Microsoft.EntityFrameworkCore até Newtonsoft.Json, usam namespaces independentes de versão, gerenciando o versionamento por meio do número da versão do pacote NuGet . O IronOCR segue essa convenção: a mesma importação de namespace se aplica da versão 1 até a versão atual.
Implantação de microsserviços e contêineres
O GdPicture OCR requer que uma pasta de recursos externa contendo arquivos de dados de idioma esteja presente em um caminho específico em tempo de execução. Em uma implantação em contêiner, isso significa incorporar esses arquivos à imagem do Docker, montar um volume ou configurar um script de inicialização para baixá-los. O resultado típico é uma imagemDockercom várias centenas de megabytes a mais do que o necessário, um item da lista de verificação de implantação que é esquecido e falhas em produção em reinicializações limpas de contêineres, onde o volume não está montado. O IronOCR inclui suporte para inglês no próprio pacote; Idiomas adicionais são instalados como pacotes NuGet que fazem parte do resultado da compilação. O contêiner obtém o que precisa na etapa de restauração e não há caminhos a serem configurados. O guia de implantação do Docker e o guia de implantação do Linux abordam a configuração específica para cada ambiente de destino.
Equipes de desenvolvimento sem experiência em digitalização de documentos
A área de superfície do GdPicture é grande por necessidade — ela abrange uma plataforma completa de digitalização de documentos. Para um desenvolvedor que entra em uma equipe para manter um microsserviço de OCR, entender o componente de imagem, o componente de OCR, o componente de PDF, o ciclo de vida do ID inteiro, o tratamento do código de retorno de status e a configuração da pasta de recursos representa um investimento inicial considerável. A interface do IronOCR para OCR é composta por três classes: o mecanismo, o contêiner de entrada e o objeto de resultado. Esse é o modelo mental completo para 90% dos casos de uso. Integrar um novo desenvolvedor significa direcioná-lo para a configuração do IronTesseract em vez de para um guia de SDK com vários módulos.
Considerações Comuns de Migração
Substituindo a inicialização do componente
GdPicture requer uma sequência de inicialização em quatro etapas: registre a chave de licença por meio de LicenseManager, inicialize GdPictureImaging, inicialize GdPictureOCR e configure o caminho da pasta de recursos.IronOCR reduz isso a uma única atribuição de propriedade que pertence a Program.cs ou Startup.cs:
// Remove
LicenseManager lm = new LicenseManager();
lm.RegisterKEY("GDPICTURE-LICENSE-KEY");
_imaging = new GdPictureImaging();
_ocr = new GdPictureOCR();
_ocr.ResourceFolder = @"C:\GdPicture\Resources\OCR";
// Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY";
// IronTesseract instances are instantiated per-use or as a singleton
// Remove
LicenseManager lm = new LicenseManager();
lm.RegisterKEY("GDPICTURE-LICENSE-KEY");
_imaging = new GdPictureImaging();
_ocr = new GdPictureOCR();
_ocr.ResourceFolder = @"C:\GdPicture\Resources\OCR";
// Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY";
// IronTesseract instances are instantiated per-use or as a singleton
' Remove
Dim lm As New LicenseManager()
lm.RegisterKEY("GDPICTURE-LICENSE-KEY")
_imaging = New GdPictureImaging()
_ocr = New GdPictureOCR()
_ocr.ResourceFolder = "C:\GdPicture\Resources\OCR"
' Replace with
IronOcr.License.LicenseKey = "IRONOCR-LICENSE-KEY"
' IronTesseract instances are instantiated per-use or as a singleton
Eliminação do rastreamento de ID de imagem
Cada chamada CreateGdPictureImageFromFile e cada chamada RenderPageToGdPictureImage tem uma chamada correspondente ReleaseGdPictureImage em algum lugar na base de código existente. Essas chamadas de limpeza são removidas inteiramente no IronOCR— OcrInput lida com a eliminação. A migração é mecânica: encontre cada int imageId = ..., encontre seu par ReleaseGdPictureImage(imageId), envolva o código de carregamento em using var input = new OcrInput() e substitua as chamadas de método do GdPicture por seus equivalentes em IronOCR.
// Remove
int imageId = _imaging.CreateGdPictureImageFromFile(path);
if (imageId == 0) throw new Exception(_imaging.GetStat().ToString());
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId)) throw new Exception(_ocr.GetStat().ToString());
string text = _ocr.GetOCRResultText(resultId);
_imaging.ReleaseGdPictureImage(imageId);
// Replace with
using var input = new OcrInput();
input.LoadImage(path);
var result = new IronTesseract().Read(input);
string text = result.Text;
// Remove
int imageId = _imaging.CreateGdPictureImageFromFile(path);
if (imageId == 0) throw new Exception(_imaging.GetStat().ToString());
_ocr.SetImage(imageId);
_ocr.Language = "eng";
string resultId = _ocr.RunOCR();
if (string.IsNullOrEmpty(resultId)) throw new Exception(_ocr.GetStat().ToString());
string text = _ocr.GetOCRResultText(resultId);
_imaging.ReleaseGdPictureImage(imageId);
// Replace with
using var input = new OcrInput();
input.LoadImage(path);
var result = new IronTesseract().Read(input);
string text = result.Text;
Imports System
' Remove
Dim imageId As Integer = _imaging.CreateGdPictureImageFromFile(path)
If imageId = 0 Then Throw New Exception(_imaging.GetStat().ToString())
_ocr.SetImage(imageId)
_ocr.Language = "eng"
Dim resultId As String = _ocr.RunOCR()
If String.IsNullOrEmpty(resultId) Then Throw New Exception(_ocr.GetStat().ToString())
Dim text As String = _ocr.GetOCRResultText(resultId)
_imaging.ReleaseGdPictureImage(imageId)
' Replace with
Using input As New OcrInput()
input.LoadImage(path)
Dim result = New IronTesseract().Read(input)
Dim text As String = result.Text
End Using
Adaptando o tratamento de erros
GdPicture usa códigos de retorno GdPictureStatus verificados após cada operação significativa. O IronOCR gera exceções padrão do .NET . A migração substitui as proteções if (status != GdPictureStatus.OK) por blocos try/catch que lidam com IronOcr.Exceptions.OcrException para falhas específicas de OCR e padrão IOException e FileNotFoundException para falhas de entrada. O tutorial sobre leitura de texto em imagens aborda padrões de tratamento de erros para cenários comuns.
Implantação do pacote de idiomas
Os arquivos de idioma do GdPicture são arquivos .traineddata em uma pasta de sistema de arquivos. Os pacotes de idiomas do IronOCR são pacotes NuGet . A migração remove a pasta de recursos do manifesto de implantação e adiciona referências de pacotes NuGet para cada idioma necessário:
# Remove filesystem dependency for each language
# Add NuGet package instead
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
# Remove filesystem dependency for each language
# Add NuGet package instead
dotnet add package IronOcr.Languages.French
dotnet add package IronOcr.Languages.German
dotnet add package IronOcr.Languages.ChineseSimplified
O guia de múltiplos idiomas cobre a configuração para documentos multilíngues onde os idiomas primário e secundário são especificados na instância IronTesseract.
Funcionalidades adicionais do IronOCR
Além das áreas abordadas nesta comparação, o IronOCR inclui recursos que não possuem equivalentes diretos no GdPicture em um contexto puramente de OCR:
- OCR Assíncrono —
ReadAsyncpara operação não bloqueante em manipuladores de solicitações ASP.NET Core e serviços em segundo plano - Detecção de rotação de página — detecção e correção automática de páginas rotacionadas sem pré-processamento manual.
- Rastreamento de progresso — eventos de progresso baseados em callbacks para trabalhos em lote de longa duração expostos a barras de progresso na interface do usuário.
- Entrada de fluxo —
input.LoadImage(stream)aceitaSystem.IO.Streamdiretamente, evitando gravações de arquivos temporários em arquiteturas de pipeline - Leitura especializada de documentos — tratamento construído para passaportes, placas de licença, cheques MICR e texto manuscrito através da mesma interface
IronTesseract
Compatibilidade com .NET e Preparação para o Futuro
O IronOCR é compatível com .NET 8, .NET 9, .NET Standard 2.0 e .NET Framework 4.6.2 e versões posteriores. O pacote NuGet único é implantado de forma idêntica no Windows x64, Windows x86,Linuxx64 e macOS. O GdPicture .NET também oferece suporte a plataformas cruzadas, mas sua arquitetura de plugins significa que as implantações emLinuxe contêineres devem levar em conta as dependências nativas de cada plugin individualmente. O namespace do IronOCR permaneceu IronOcr em todas as principais mudanças de versão, o que significa que os caminhos de atualização não exigem operações de busca e substituição em toda a base de código. Com a chegada do .NET 10 no final de 2026, o histórico da IronOCR em manter a compatibilidade entre as versões sucessivas do .NET sem alterações que quebrem a API fornece uma base sólida para aplicativos com longos ciclos de manutenção.
Conclusão
O GdPicture .NET é uma escolha legítima para equipes que precisam de uma plataforma consolidada de digitalização de documentos — integração de scanner, edição de PDF, anotações, suporte a DICOM e OCR em um único SDK de um único fornecedor. Esse caso de uso existe. O modelo de plugins faz sentido quando a maioria dessas funcionalidades está efetivamente dentro do escopo.
A incompatibilidade ocorre quando o requisito é OCR e a resposta é GdPicture. O plugin PDF não é separável do caso de uso de OCR a partir de PDF. O plugin de digitalização de documentos não pode ser separado do pré-processamento. O ciclo de vida do ID inteiro não é opcional — é o modelo fundamental de gerenciamento de recursos para todo o SDK. Uma equipe que precisa extrair texto de PDFs digitalizados absorve toda essa complexidade e todo esse custo, e nenhuma das funcionalidades adicionais justifica o investimento para sua carga de trabalho.
A diferença de preços ao longo de vários anos pode ser substancial para um fluxo de trabalho Professional de um único desenvolvedor. A diferença na complexidade do código é mensurável: mais de 25 linhas para OCR básico com limpeza, contra apenas uma. A lacuna operacional — pastas de recursos externos, namespaces específicos da versão, inicialização de vários componentes — se manifesta como atrito na implantação e tempo de integração, em vez de número de linhas, mas é real.
IronOCR em $2,999 perpétuo oferece os mesmos resultados principais de OCR — extração de texto de imagem, processamento de PDF digitalizado, saída de PDF pesquisável, 125+ idiomas, pontuação de confiança, acesso a dados estruturados — através de padrões .NET padrão que não requerem conhecimento especializado em SDK para manutenção. Para equipes em que o OCR é o objetivo e não um componente de uma plataforma mais ampla de gerenciamento de documentos, essa é a opção mais adequada.
Perguntas frequentes
O que é o OCR do GdPicture.NET?
O GdPicture.NET 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 GdPicture.NET OCR para desenvolvedores .NET?
IronOCR é uma biblioteca OCR .NET nativa do NuGet que utiliza o IronTesseract como mecanismo principal. Comparada ao GdPicture.NET 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 GdPicture.NET 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 OCR do GdPicture.NET e o do 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 GdPicture.NET 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 GdPicture.NET?
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 GdPicture.NET?
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 OCR do GdPicture.NET para o IronOCR?
A migração do OCR GdPicture.NET 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.

