Alternativas ao OCR do Acrobat DC usando o IronOCR
Antes que oGoogle Cloud Visionleia um único caractere de uma imagem, você já criou um projeto GCP, habilitou a Vision API, criou uma conta de serviço, baixou um arquivo JSON contendo uma chave privada RSA, configurou a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS em cada servidor que executará seu código e escreveu um loop de repetição para lidar com StatusCode.ResourceExhausted quando a cota padrão de 1.800 solicitações por minuto for excedida. Então você descobre que o processamento de PDF requer um segundo pacote NuGet (Google.Cloud.Storage.V1), um bucket GCS, um loop de pesquisa assíncrona, análise de saída JSON e uma etapa de limpeza para excluir objetos do armazenamento em nuvem. OGoogle Cloud Visionpossui pontos fortes inegáveis — seus modelos baseados em aprendizado de máquina produzem alta precisão em textos em chinês, japonês e coreano — mas a área de atuação é considerável antes mesmo de se processar um único documento de produção.
Entendendo a visão do Google Cloud
OGoogle Cloud Visioné uma API de análise de imagens hospedada na nuvem e com suporte da infraestrutura de aprendizado de máquina do Google. Para OCR, ele oferece dois tipos distintos de recursos: TEXT_DETECTION, otimizado para texto esparso em cenas naturais, como placas de rua e etiquetas de produtos, e DOCUMENT_TEXT_DETECTION, otimizado para documentos densos com parágrafos, tabelas e layouts em várias colunas. O serviço é invocado através do pacote NuGet Google.Cloud.Vision.V1, que envolve uma camada de transporte gRPC e retorna objetos de resposta gerados por Protobuf.
Principais características arquitetônicas:
- Processamento exclusivamente na nuvem: todos os documentos são transmitidos e processados na infraestrutura do Google. Não existe modo local (on-premise).
- Autenticação da conta de serviço: A autenticação requer um arquivo de chave JSON contendo uma chave privada RSA, um e-mail do cliente e um ID de projeto. O arquivo deve ser implantado em todos os hosts e referenciado por meio da variável de ambiente
GOOGLE_APPLICATION_CREDENTIALSou das Credenciais de Aplicativo Padrão do Google. - O PDF requer GCS e modo assíncrono: o processamento de documentos PDF não é uma chamada direta à API. Os PDFs devem ser carregados no Google Cloud Storage, enviados via
AsyncBatchAnnotateFilesAsync, pesquisados até a conclusão, e os arquivos de saída JSON baixados e analisados a partir do GCS. - Hierarquia de resposta Protobuf:
DOCUMENT_TEXT_DETECTIONretorna um objeto ProtobufTextAnnotationcom uma hierarquia dePages→Blocks→Paragraphs→Words→Symbols. A extração do texto de um parágrafo requer a iteração em quatro níveis e a concatenação de sequências de símbolos individuais. - Limites de taxa: A cota padrão é de 1.800 solicitações por minuto. O processamento em lote acima deste limite requer a implementação de lógica de repetição para respostas
StatusCode.ResourceExhausted. - Status FedRAMP: OGoogle Cloud Visionnão possui autorização FedRAMP, o que o desqualifica para casos de uso em agências federais onde o Azure Computer Vision (FedRAMP High) ou o AWS Textract (FedRAMP High) continuam sendo alternativas disponíveis.
- Preços: Taxas por 1.000 imagens para
TEXT_DETECTIONeDOCUMENT_TEXT_DETECTIONapós as primeiras 1.000 unidades gratuitas por mês; O processamento assíncrono de PDF é cobrado por página. Consulte a página de preços do Google Cloud Vision para tarifas atuais.
Configuração de credenciais da conta de serviço
O código a seguir de google-vision-vs-ironocr-examples.cs ilustra o padrão de inicialização do cliente. O que a linha de instanciação esconde é o pré-requisito: a variável de ambiente GOOGLE_APPLICATION_CREDENTIALS já deve apontar para um arquivo JSON de chave de conta de serviço válido na máquina atual:
using Google.Cloud.Vision.V1;
public class GoogleVisionService
{
private readonly ImageAnnotatorClient _client;
public GoogleVisionService()
{
// Requires GOOGLE_APPLICATION_CREDENTIALS env var
// pointing to a service account JSON key file
_client = ImageAnnotatorClient.Create();
}
public string DetectText(string imagePath)
{
// WARNING: Image uploaded to Google Cloud
var image = Image.FromFile(imagePath);
var response = _client.DetectText(image);
if (response.Count > 0)
{
return response[0].Description;
}
return string.Empty;
}
}
using Google.Cloud.Vision.V1;
public class GoogleVisionService
{
private readonly ImageAnnotatorClient _client;
public GoogleVisionService()
{
// Requires GOOGLE_APPLICATION_CREDENTIALS env var
// pointing to a service account JSON key file
_client = ImageAnnotatorClient.Create();
}
public string DetectText(string imagePath)
{
// WARNING: Image uploaded to Google Cloud
var image = Image.FromFile(imagePath);
var response = _client.DetectText(image);
if (response.Count > 0)
{
return response[0].Description;
}
return string.Empty;
}
}
Imports Google.Cloud.Vision.V1
Public Class GoogleVisionService
Private ReadOnly _client As ImageAnnotatorClient
Public Sub New()
' Requires GOOGLE_APPLICATION_CREDENTIALS env var
' pointing to a service account JSON key file
_client = ImageAnnotatorClient.Create()
End Sub
Public Function DetectText(imagePath As String) As String
' WARNING: Image uploaded to Google Cloud
Dim image = Image.FromFile(imagePath)
Dim response = _client.DetectText(image)
If response.Count > 0 Then
Return response(0).Description
End If
Return String.Empty
End Function
End Class
O arquivo de chave JSON contém a chave privada RSA, o e-mail do cliente e os identificadores do projeto. Nunca deve ser incluído no controle de versão, deve ser excluído das imagens do Docker, deve ser rotacionado periodicamente e deve ser protegido com as permissões apropriadas do sistema de arquivos. Uma chave comprometida concede acesso à API até que seja revogada manualmente no Console do GCP.
Entendendo o IronOCR
O IronOCR é uma biblioteca OCR comercial para .NET , instalada localmente e construída sobre um mecanismo Tesseract 5 otimizado. Ele processa todos os documentos localmente — sem transmissão para a nuvem, sem necessidade de internet e sem manipulação de dados por terceiros. Uma única instalação de pacote NuGet (IronOcr) fornece tudo: o mecanismo OCR, filtros de pré-processamento automáticos, suporte nativo a PDF e mais de 125 pacotes de idiomas disponíveis como pacotes NuGet separados.
Principais características:
- Processamento local: os documentos nunca saem da sua infraestrutura. Funciona em ambientes isolados da internet, redes classificadas e contêineres Docker sem conectividade de saída.
- Implantação única NuGet : Sem pastas tessdata, sem gerenciamento de bibliotecas nativas, sem variáveis de ambiente necessárias além de uma string de chave de licença.
- Pré-processamento automático: os filtros de correção de desalinhamento (shiftew), redução de ruído (DeNoise), contraste (Contrast), binarização (Binarize) e aprimoramento de resolução (EnhancedResolution) são aplicados automaticamente em entradas de baixa qualidade e estão disponíveis individualmente para controle explícito.
- Entrada nativa de PDF: PDFs são carregados diretamente via
input.LoadPdf()com processamento síncrono. Os PDFs protegidos por senha requerem um parâmetro. OcrResultestruturado: Os resultados expõemText,Confidence,Pages,Paragraphs,Lines,WordseBarcodescomo objetos .NET tipados — sem desserialização Protobuf, sem concatenação de símbolos.- Seguro para threads: Instâncias de
IronTesseractsão seguras para uso paralelo. Trabalhos em lote podem usarParallel.ForEachsem sincronização adicional. - Licenciamento perpétuo: $999 Lite, $1,499 Plus, $2,999 Professional, $5,999 Unlimited — compra única sem custos por transação.
Comparação de recursos
| Recurso | Google Cloud Vision | IronOCR |
|---|---|---|
| Modelo de processamento | Somente na nuvem | Somente para instalação local |
| Processamento de PDF | Via GCS + API assíncrona | Direto, síncrono |
| Autenticação | Chave JSON da conta de serviço | String da chave de licença |
| autorizaçãoFedRAMP | Não autorizado | Não aplicável (no local) |
| Custo por documento | Por página (veja preços do Google Cloud Vision) | None |
| Offline / isolado da internet | Não | Sim |
Comparação Detalhada de Recursos
| Categoria | Recurso | Google Cloud Vision | IronOCR |
|---|---|---|---|
| Entrada | OCR de imagem | Sim | Sim |
| OCR de PDF | Via GCS + assíncrono (mais de 50 linhas) | input.LoadPdf() (3 linhas) |
|
| PDF protegido por senha | Não suportado | LoadPdf(path, Password: "...") |
|
| Entrada de fluxo | Sim | Sim | |
| Entrada de URL | Não | input.LoadImageFromUrl() |
|
| TIFF / GIF com vários quadros | Limitado | Sim | |
| Autenticação | Tipo de credencial | Arquivo de chave JSON + variável de ambiente | String da chave de licença |
| Rotação de credenciais | Obrigatório (manual) | Não é necessário | |
| Segredos de CI/CD necessários | Sim (arquivo chave) | Sim (apenas a string de licença) | |
| Processamento | Offline / isolado da internet | Não | Sim |
| Processamento síncrono | Somente imagens | Imagens e PDFs | |
| Limites de taxa | 1.800 requisições/min padrão | Nenhum (limitado pela CPU) | |
| Pré-processamento (automático) | Nenhum (baseado em aprendizado de máquina) | Correção de distorção, redução de ruído, contraste, binarização, aumento da resolução | |
| Saída | Texto simples | Sim | Sim |
| Resultado estruturado (digitado) | Hierarquia Protobuf | OcrResult (objetos .NET) |
|
| Pontuações de confiança | Por símbolo/palavra | Por palavra e no geral | |
| Saída em PDF pesquisável | Não | result.SaveAsSearchablePdf() |
|
| Leitura de código de barras | Recurso de API separado | ocr.Configuration.ReadBarCodes = true |
|
| OCR baseado em região | Culturas não nativas da região | CropRectangle na entrada |
|
| Linguagem | Contagem de idiomas | ~50 | Mais de 125 via pacotes NuGet |
| Precisão CJK | Forte (com suporte de aprendizado de máquina) | Bom (Tesseract 5 LSTM) | |
| Conformidade | FedRAMP | Não autorizado | Não aplicável (no local) |
| HIPAA/ITAR | BAA + revisão complexa | Sem processamento por terceiros | |
| Artigo 28 do RGPD | DPA necessário | Não aplicável (local) | |
| Custo | Modelo de preços | Entre em contato com o Google para preços atuais | Perpétuo ($5,999) |
Complexidade da autenticação e gerenciamento de credenciais
O custo mais subestimado doGoogle Cloud Visionnão é a taxa por imagem. Trata-se da sobrecarga operacional de gerenciar as credenciais da conta de serviço em todos os ambientes onde seu aplicativo é executado.
Abordagem Google Cloud Vision
Inicializar o cliente parece uma única linha, mas essa linha lançará RpcException com StatusCode.PermissionDenied a menos que sete pré-requisitos estejam definidos. De google-cloud-vision-migration-examples.cs, a configuração de credenciais conta toda a história:
public GoogleVisionCredentialSetup()
{
// BEFORE: Requires GOOGLE_APPLICATION_CREDENTIALS environment variable
// pointing to a service account JSON key file:
// export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
//
// The JSON file contains sensitive data:
// - private_key: RSA private key
// - client_email: service account email
// - project_id: GCP project identifier
//
// Security concerns:
// - Key file must never be committed to source control
// - Key file must be rotated periodically
// - Key file must be protected with file system permissions
// - Key file compromise grants API access until revoked
_client = ImageAnnotatorClient.Create();
}
public GoogleVisionCredentialSetup()
{
// BEFORE: Requires GOOGLE_APPLICATION_CREDENTIALS environment variable
// pointing to a service account JSON key file:
// export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
//
// The JSON file contains sensitive data:
// - private_key: RSA private key
// - client_email: service account email
// - project_id: GCP project identifier
//
// Security concerns:
// - Key file must never be committed to source control
// - Key file must be rotated periodically
// - Key file must be protected with file system permissions
// - Key file compromise grants API access until revoked
_client = ImageAnnotatorClient.Create();
}
Public Sub New()
' BEFORE: Requires GOOGLE_APPLICATION_CREDENTIALS environment variable
' pointing to a service account JSON key file:
' export GOOGLE_APPLICATION_CREDENTIALS="/path/to/service-account.json"
'
' The JSON file contains sensitive data:
' - private_key: RSA private key
' - client_email: service account email
' - project_id: GCP project identifier
'
' Security concerns:
' - Key file must never be committed to source control
' - Key file must be rotated periodically
' - Key file must be protected with file system permissions
' - Key file compromise grants API access until revoked
_client = ImageAnnotatorClient.Create()
End Sub
Em uma implementação baseada em Docker, o arquivo de chave JSON deve ser montado como um volume secreto ou injetado por meio de segredos do Kubernetes. Em uma configuração com várias regiões, cada região precisa da mesma configuração de credenciais. A rotação de chaves é um processo manual que exige a atualização simultânea de todas as implementações ou a aceitação de um período em que as chaves antigas e novas sejam válidas. A camada de tratamento de erros cresce proporcionalmente — o código de produção necessita de blocos de captura distintos para StatusCode.PermissionDenied, StatusCode.ResourceExhausted, StatusCode.Unavailable e StatusCode.DeadlineExceeded.
Abordagem IronOCR
A configuração do IronOCR consiste em uma sequência de chave de licença. Sem arquivos para implantar, sem variáveis de ambiente além da própria chave, sem cronograma de rotação:
public IronOcrCredentialSetup()
{
// Simple license key - no key files, no environment variables required
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
?? "YOUR-LICENSE-KEY";
// Não service accounts, no key rotation, no IAM configuration
_ocr = new IronTesseract();
}
public IronOcrCredentialSetup()
{
// Simple license key - no key files, no environment variables required
IronOcr.License.LicenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE")
?? "YOUR-LICENSE-KEY";
// Não service accounts, no key rotation, no IAM configuration
_ocr = new IronTesseract();
}
Public Sub New()
' Simple license key - no key files, no environment variables required
IronOcr.License.LicenseKey = If(Environment.GetEnvironmentVariable("IRONOCR_LICENSE"), "YOUR-LICENSE-KEY")
' Não service accounts, no key rotation, no IAM configuration
_ocr = New IronTesseract()
End Sub
Em CI/CD, a chave de licença é um segredo único do pipeline. Não Docker, trata-se de uma única variável de ambiente. Não há arquivo JSON para montar, nenhuma função IAM para atribuir, nenhum console do GCP para interagir. Quando um desenvolvedor entra para a equipe, ele recebe uma única string. A gama completa de erros possíveis em casos de falhas relacionadas à autenticação é: a chave é inválida ou o período de avaliação expirou.
Processamento de PDF: Pipeline GCS vs. Carregamento Direto
É no processamento de PDFs que a diferença operacional entre as duas bibliotecas se torna concreta. OGoogle Cloud Visionnão aceita PDFs como entrada direta da API — o arquivo precisa passar pelo Google Cloud Storage como intermediário.
Abordagem Google Cloud Vision
O fluxo completo de processamento de PDF de google-cloud-vision-migration-examples.cs ultrapassa 40 linhas antes da implementação de DownloadAndParseResultsAsync — que por si só requer a análise de URIs de saída do GCS, listagem de objetos de resultado, download de arquivos JSON e concatenação de texto em páginas:
public async Task<string> ProcessPdfAsync(string pdfPath)
{
// Step 1: Create storage client
var storageClient = StorageClient.Create();
var objectName = $"ocr-input/{Guid.NewGuid()}.pdf";
// Step 2: Upload PDF to GCS (document leaves your infrastructure)
using (var stream = File.OpenRead(pdfPath))
{
await storageClient.UploadObjectAsync(
_bucketName, objectName, "application/pdf", stream);
}
// Step 3: Build async annotation request
var asyncRequest = new AsyncAnnotateFileRequest
{
InputConfig = new InputConfig
{
GcsSource = new GcsSource { Uri = $"gs://{_bucketName}/{objectName}" },
MimeType = "application/pdf"
},
Features = { new Recurso { Type = Feature.Types.Type.DocumentTextDetection } },
OutputConfig = new OutputConfig
{
GcsDestination = new GcsDestination { Uri = $"gs://{_bucketName}/ocr-output/" },
BatchSize = 1
}
};
// Step 4: Submit and wait for async operation
var operation = await _visionClient.AsyncBatchAnnotateFilesAsync(
new[] { asyncRequest });
var completedOperation = await operation.PollUntilCompletedAsync();
// Step 5: Download and parse results from GCS output
var outputUri = completedOperation.Result.Responses[0]
.OutputConfig.GcsDestination.Uri;
var text = await DownloadAndParseResultsAsync(storageClient, outputUri);
// Step 6: Clean up input file from GCS
await storageClient.DeleteObjectAsync(_bucketName, objectName);
return text;
}
public async Task<string> ProcessPdfAsync(string pdfPath)
{
// Step 1: Create storage client
var storageClient = StorageClient.Create();
var objectName = $"ocr-input/{Guid.NewGuid()}.pdf";
// Step 2: Upload PDF to GCS (document leaves your infrastructure)
using (var stream = File.OpenRead(pdfPath))
{
await storageClient.UploadObjectAsync(
_bucketName, objectName, "application/pdf", stream);
}
// Step 3: Build async annotation request
var asyncRequest = new AsyncAnnotateFileRequest
{
InputConfig = new InputConfig
{
GcsSource = new GcsSource { Uri = $"gs://{_bucketName}/{objectName}" },
MimeType = "application/pdf"
},
Features = { new Recurso { Type = Feature.Types.Type.DocumentTextDetection } },
OutputConfig = new OutputConfig
{
GcsDestination = new GcsDestination { Uri = $"gs://{_bucketName}/ocr-output/" },
BatchSize = 1
}
};
// Step 4: Submit and wait for async operation
var operation = await _visionClient.AsyncBatchAnnotateFilesAsync(
new[] { asyncRequest });
var completedOperation = await operation.PollUntilCompletedAsync();
// Step 5: Download and parse results from GCS output
var outputUri = completedOperation.Result.Responses[0]
.OutputConfig.GcsDestination.Uri;
var text = await DownloadAndParseResultsAsync(storageClient, outputUri);
// Step 6: Clean up input file from GCS
await storageClient.DeleteObjectAsync(_bucketName, objectName);
return text;
}
Imports System
Imports System.IO
Imports System.Threading.Tasks
Public Class PdfProcessor
Private _bucketName As String
Private _visionClient As VisionClient
Public Async Function ProcessPdfAsync(pdfPath As String) As Task(Of String)
' Step 1: Create storage client
Dim storageClient = StorageClient.Create()
Dim objectName = $"ocr-input/{Guid.NewGuid()}.pdf"
' Step 2: Upload PDF to GCS (document leaves your infrastructure)
Using stream = File.OpenRead(pdfPath)
Await storageClient.UploadObjectAsync(_bucketName, objectName, "application/pdf", stream)
End Using
' Step 3: Build async annotation request
Dim asyncRequest = New AsyncAnnotateFileRequest With {
.InputConfig = New InputConfig With {
.GcsSource = New GcsSource With {.Uri = $"gs://{_bucketName}/{objectName}"},
.MimeType = "application/pdf"
},
.Features = {New Recurso With {.Type = Feature.Types.Type.DocumentTextDetection}},
.OutputConfig = New OutputConfig With {
.GcsDestination = New GcsDestination With {.Uri = $"gs://{_bucketName}/ocr-output/"},
.BatchSize = 1
}
}
' Step 4: Submit and wait for async operation
Dim operation = Await _visionClient.AsyncBatchAnnotateFilesAsync({asyncRequest})
Dim completedOperation = Await operation.PollUntilCompletedAsync()
' Step 5: Download and parse results from GCS output
Dim outputUri = completedOperation.Result.Responses(0).OutputConfig.GcsDestination.Uri
Dim text = Await DownloadAndParseResultsAsync(storageClient, outputUri)
' Step 6: Clean up input file from GCS
Await storageClient.DeleteObjectAsync(_bucketName, objectName)
Return text
End Function
Private Async Function DownloadAndParseResultsAsync(storageClient As StorageClient, outputUri As String) As Task(Of String)
' Implementation for downloading and parsing results
Return Await Task.FromResult(String.Empty)
End Function
End Class
Public Class StorageClient
Public Shared Function Create() As StorageClient
Return New StorageClient()
End Function
Public Async Function UploadObjectAsync(bucketName As String, objectName As String, mimeType As String, stream As Stream) As Task
' Implementation for uploading object
End Function
Public Async Function DeleteObjectAsync(bucketName As String, objectName As String) As Task
' Implementation for deleting object
End Function
End Class
Public Class VisionClient
Public Async Function AsyncBatchAnnotateFilesAsync(requests As AsyncAnnotateFileRequest()) As Task(Of Operation)
' Implementation for async batch annotate files
Return New Operation()
End Function
End Class
Public Class Operation
Public Async Function PollUntilCompletedAsync() As Task(Of OperationResult)
' Implementation for polling until completed
Return New OperationResult()
End Function
End Class
Public Class OperationResult
Public Property Responses As Response()
End Class
Public Class Response
Public Property OutputConfig As OutputConfig
End Class
Public Class AsyncAnnotateFileRequest
Public Property InputConfig As InputConfig
Public Property Features As List(Of Recurso)
Public Property OutputConfig As OutputConfig
End Class
Public Class InputConfig
Public Property GcsSource As GcsSource
Public Property MimeType As String
End Class
Public Class GcsSource
Public Property Uri As String
End Class
Public Class Recurso
Public Property Type As Feature.Types.Type
End Class
Public Class Feature
Public Class Types
Public Enum Type
DocumentTextDetection
End Enum
End Class
End Class
Public Class OutputConfig
Public Property GcsDestination As GcsDestination
Public Property BatchSize As Integer
End Class
Public Class GcsDestination
Public Property Uri As String
End Class
Esta é a implementação mínima funcional, não uma versão robusta para produção. O código de produção adiciona lógica de repetição para falhas de upload no GCS, tratamento de timeouts para operações assíncronas lentas, limpeza de objetos de saída (e não apenas de entrada), tratamento de erros caso a operação falhe durante o processo e registro de estados intermediários. Arquivos PDF protegidos por senha não são suportados em nenhum nível de complexidade.
Abordagem IronOCR
O suporte a PDF do IronOCR carrega o arquivo diretamente e o processa de forma síncrona:
public string ProcessPdf(string pdfPath)
{
// Direct Processamento de PDF - no GCS, no async, no cleanup
using var input = new OcrInput();
input.LoadPdf(pdfPath);
return _ocr.Read(input).Text;
}
public string ProcessPdfPages(string pdfPath, int startPage, int endPage)
{
// Process specific page range
using var input = new OcrInput();
input.LoadPdfPages(pdfPath, startPage, endPage);
return _ocr.Read(input).Text;
}
public string ProcessEncryptedPdf(string pdfPath, string password)
{
// Password-protected PDFs - not possible with Google Cloud Vision
using var input = new OcrInput();
input.LoadPdf(pdfPath, Password: password);
return _ocr.Read(input).Text;
}
public string ProcessPdf(string pdfPath)
{
// Direct Processamento de PDF - no GCS, no async, no cleanup
using var input = new OcrInput();
input.LoadPdf(pdfPath);
return _ocr.Read(input).Text;
}
public string ProcessPdfPages(string pdfPath, int startPage, int endPage)
{
// Process specific page range
using var input = new OcrInput();
input.LoadPdfPages(pdfPath, startPage, endPage);
return _ocr.Read(input).Text;
}
public string ProcessEncryptedPdf(string pdfPath, string password)
{
// Password-protected PDFs - not possible with Google Cloud Vision
using var input = new OcrInput();
input.LoadPdf(pdfPath, Password: password);
return _ocr.Read(input).Text;
}
Imports System
Public Class PdfProcessor
Public Function ProcessPdf(pdfPath As String) As String
' Direct Processamento de PDF - no GCS, no async, no cleanup
Using input As New OcrInput()
input.LoadPdf(pdfPath)
Return _ocr.Read(input).Text
End Using
End Function
Public Function ProcessPdfPages(pdfPath As String, startPage As Integer, endPage As Integer) As String
' Process specific page range
Using input As New OcrInput()
input.LoadPdfPages(pdfPath, startPage, endPage)
Return _ocr.Read(input).Text
End Using
End Function
Public Function ProcessEncryptedPdf(pdfPath As String, password As String) As String
' Password-protected PDFs - not possible with Google Cloud Vision
Using input As New OcrInput()
input.LoadPdf(pdfPath, Password:=password)
Return _ocr.Read(input).Text
End Using
End Function
End Class
Não há um segundo pacote NuGet . Não há bucket do GCS para provisionar ou manter. Sem etapa de limpeza. Sem máquina de estados assíncrona. A variante protegida por senha adiciona exatamente um parâmetro. Para equipes que precisam produzir PDFs pesquisáveis a partir de entradas digitalizadas, result.SaveAsSearchablePdf("output.pdf") lida com a saída de PDF pesquisável em uma linha adicional — uma capacidade que oGoogle Cloud Visionnão oferece em nenhum nível de complexidade de API.
Análise de resposta Protobuf versus OcrResult simples
Obter dados estruturados de uma chamada DOCUMENT_TEXT_DETECTION requer navegar na hierarquia de resposta Protobuf. O caminho desde a chamada da API até o texto do parágrafo passa por cinco níveis de iteração aninhada.
Abordagem Google Cloud Vision
Extrair o texto de um parágrafo de um documento denso exige percorrer as Páginas, depois os Blocos, depois os Parágrafos e, por fim, concatenar os Símbolos de cada Palavra — porque o design do Protobuf armazena o texto no nível do símbolo, e não no nível da palavra ou do parágrafo:
public DocumentStructure ExtractDocumentStructure(string imagePath)
{
var image = Image.FromFile(imagePath);
var annotation = _client.DetectDocumentText(image);
var structure = new DocumentStructure
{
FullText = annotation.Text,
Pages = new List<PageInfo>()
};
// Navigate: Pages -> Blocks -> Paragraphs -> Words -> Symbols
foreach (var page in annotation.Pages)
{
var pageInfo = new PageInfo
{
Confidence = page.Confidence,
Paragraphs = new List<ParagraphInfo>()
};
foreach (var block in page.Blocks)
{
foreach (var paragraph in block.Paragraphs)
{
// Must concatenate symbols to get paragraph text
var text = string.Join("", paragraph.Words
.SelectMany(w => w.Symbols)
.Select(s => s.Text));
pageInfo.Paragraphs.Add(new ParagraphInfo
{
Text = text,
Confidence = paragraph.Confidence
});
}
}
structure.Pages.Add(pageInfo);
}
return structure;
}
public DocumentStructure ExtractDocumentStructure(string imagePath)
{
var image = Image.FromFile(imagePath);
var annotation = _client.DetectDocumentText(image);
var structure = new DocumentStructure
{
FullText = annotation.Text,
Pages = new List<PageInfo>()
};
// Navigate: Pages -> Blocks -> Paragraphs -> Words -> Symbols
foreach (var page in annotation.Pages)
{
var pageInfo = new PageInfo
{
Confidence = page.Confidence,
Paragraphs = new List<ParagraphInfo>()
};
foreach (var block in page.Blocks)
{
foreach (var paragraph in block.Paragraphs)
{
// Must concatenate symbols to get paragraph text
var text = string.Join("", paragraph.Words
.SelectMany(w => w.Symbols)
.Select(s => s.Text));
pageInfo.Paragraphs.Add(new ParagraphInfo
{
Text = text,
Confidence = paragraph.Confidence
});
}
}
structure.Pages.Add(pageInfo);
}
return structure;
}
Imports System.Drawing
Public Function ExtractDocumentStructure(imagePath As String) As DocumentStructure
Dim image = Image.FromFile(imagePath)
Dim annotation = _client.DetectDocumentText(image)
Dim structure As New DocumentStructure With {
.FullText = annotation.Text,
.Pages = New List(Of PageInfo)()
}
' Navigate: Pages -> Blocks -> Paragraphs -> Words -> Symbols
For Each page In annotation.Pages
Dim pageInfo As New PageInfo With {
.Confidence = page.Confidence,
.Paragraphs = New List(Of ParagraphInfo)()
}
For Each block In page.Blocks
For Each paragraph In block.Paragraphs
' Must concatenate symbols to get paragraph text
Dim text = String.Join("", paragraph.Words _
.SelectMany(Function(w) w.Symbols) _
.Select(Function(s) s.Text))
pageInfo.Paragraphs.Add(New ParagraphInfo With {
.Text = text,
.Confidence = paragraph.Confidence
})
Next
Next
structure.Pages.Add(pageInfo)
Next
Return structure
End Function
A concatenação de nível de símbolo não é opcional — paragraph.Text não existe como uma propriedade direta na resposta Protobuf. Cada equipe que utiliza essa API escreve sua própria variante da mesma agregação de loop aninhado. A confiança a nível de palavra requer um sexto nível de iteração para acessar valores de word.Confidence, mapeando-os de volta para o resultado da concatenação de símbolos.
Abordagem IronOCR
IronOCR's OcrResult exposes a flat, typed API. Pages, Paragraphs, Lines e Words são todas propriedades diretas com Text, Confidence, X, Y, Width e Height prontas para uso:
public DocumentStructure ExtractDocumentStructure(string imagePath)
{
var result = _ocr.Read(imagePath);
// Direct access - no symbol concatenation, no nested loops
return new DocumentStructure
{
FullText = result.Text,
Confidence = result.Confidence,
Paragraphs = result.Paragraphs.Select(p => new ParagraphInfo
{
Text = p.Text,
Confidence = p.Confidence
}).ToList(),
Lines = result.Lines.Select(l => new LineInfo
{
Text = l.Text,
X = l.X,
Y = l.Y
}).ToList()
};
}
public DocumentStructure ExtractDocumentStructure(string imagePath)
{
var result = _ocr.Read(imagePath);
// Direct access - no symbol concatenation, no nested loops
return new DocumentStructure
{
FullText = result.Text,
Confidence = result.Confidence,
Paragraphs = result.Paragraphs.Select(p => new ParagraphInfo
{
Text = p.Text,
Confidence = p.Confidence
}).ToList(),
Lines = result.Lines.Select(l => new LineInfo
{
Text = l.Text,
X = l.X,
Y = l.Y
}).ToList()
};
}
Public Function ExtractDocumentStructure(imagePath As String) As DocumentStructure
Dim result = _ocr.Read(imagePath)
' Direct access - no symbol concatenation, no nested loops
Return New DocumentStructure With {
.FullText = result.Text,
.Confidence = result.Confidence,
.Paragraphs = result.Paragraphs.Select(Function(p) New ParagraphInfo With {
.Text = p.Text,
.Confidence = p.Confidence
}).ToList(),
.Lines = result.Lines.Select(Function(l) New LineInfo With {
.Text = l.Text,
.X = l.X,
.Y = l.Y
}).ToList()
}
End Function
O guia de resultados de leitura abrange toda a API de dados estruturados. As posições a nível de palavra e as pontuações de confiança estão disponíveis em result.Words[i].X, result.Words[i].Y e result.Words[i].Confidence sem navegar por uma hierarquia intermediária. Para extração específica por região, OCR baseado em região usa um CropRectangle no OcrInput, evitando processar toda a imagem quando apenas uma linha de cabeçalho ou campo específico é necessário.
Modelo de custo: cobrança por imagem versus licença perpétua
A comparação de custos depende muito do volume e do horizonte temporal.
Abordagem Google Cloud Vision
Os preços doGoogle Cloud Visionsão baseados no uso e variam conforme o tipo de recurso e o volume. Consulte a página de preços do Google Cloud Vision para tarifas atuais. Observe que os custos totais também podem incluir armazenamento GCS e cobranças de operação para fluxos de trabalho de PDF, custos de saída de rede e o tempo de engenharia para gerenciamento de credenciais e rotação de chaves.
Em altos volumes de documentos, as tarifas por imagem aumentam significativamente, com os custos crescendo linearmente com o volume e sem teto, a menos que você negocie um acordo de uso comprometido.
Abordagem IronOCR
A precificação do IronOCR é uma compra perpétua única: $999 Lite (1 desenvolvedor), $1,499 Plus (3 desenvolvedores), $2,999 Professional (10 desenvolvedores), $5,999 Unlimited. A licença abrange o processamento ilimitado de documentos, sem cobrança de taxa de processamento. O segundo ano custa zero. O terceiro ano não tem custo algum. Em altos volumes de documentos, a licença perpétua do IronOCR rapidamente se torna mais custo-efetiva do que os preços por imagem em nuvem. Veja a página de licenciamento do IronOCR para detalhes atuais dos níveis.
O ponto de cruzamento onde o IronOCR se torna mais barato que oGoogle Cloud Visiondepende do seu volume e dos preços atuais do Google. Para a maioria das equipes processando documentos de forma consistente em produção, a licença perpétua do IronOCR se paga nos primeiros meses de uso.
Referência de Mapeamento de API
| Google Cloud Vision | IronOCR | Notas |
|---|---|---|
ImageAnnotatorClient.Create() |
new IronTesseract() |
Inicialização do cliente |
_client.DetectText(image) |
_ocr.Read(imagePath).Text |
Extração básica de texto |
_client.DetectDocumentText(image) |
_ocr.Read(imagePath) |
OCR de documentos densos |
AsyncBatchAnnotateFilesAsync() |
input.LoadPdf(); _ocr.Read(entrada) |
Processamento de PDF |
StorageClient.Create() |
Não é necessário | GCS não é necessário no IronOCR. |
storageClient.UploadObjectAsync() |
Não é necessário | Os PDFs carregam diretamente |
operation.PollUntilCompletedAsync() |
Não é necessário | O processamento é síncrono. |
TextAnnotation |
OcrResult |
Contêiner de resultados |
annotation.Text |
result.Text |
Texto completo do documento |
annotation.Pages[i] |
result.Pages[i] |
Acesso por página |
page.Blocks[i].Paragraphs[j] |
result.Paragraphs[i] |
Acesso ao parágrafo |
paragraph.Words.SelectMany(w => w.Symbols).Select(s => s.Text) |
paragraph.Text |
Propriedade de texto direto |
word.Confidence |
word.Confidence |
confiança por palavra |
page.Confidence |
result.Confidence |
Confiança geral |
Feature.Types.Type.DocumentTextDetection |
Automático | O IronOCR seleciona o modo automaticamente. |
Image.FromFile(path) |
_ocr.Read(path) ou input.LoadImage(path) |
Carregando imagem |
response[0].Description |
result.Text |
Extração de texto completo |
annotation.BoundingPoly.Vertices |
word.X, word.Y, word.Width, word.Height |
Coordenadas delimitadoras |
RpcException (StatusCode.ResourceExhausted) |
Não aplicável | Sem limites de tarifa locais |
RpcException (StatusCode.PermissionDenied) |
Não aplicável | Sem autenticação em tempo de execução |
Quando as equipes consideram migrar doGoogle Cloud Visionpara o IronOCR
Requisitos de conformidade Bloqueiam o processamento em nuvem
O fator mais comum que desencadeia uma migração não é o custo, mas sim uma auditoria de conformidade. Os contratados do governo se deparam com restrições do ITAR e descobrem que a transmissão de dados técnicos controlados para o Google Cloud é proibida. Organizações de saúde que estão construindo fluxos de trabalho para processamento de documentos descobrem que seu responsável pela segurança HIPAA exige uma revisão do Acordo de Parceiro Comercial (Business Associate Agreement - BAA) de cada processador de dados, e a avaliação do escopo da infraestrutura de nuvem do Google excede sua tolerância ao risco. Os departamentos jurídicos que processam documentos confidenciais de clientes decidem que as preocupações com o sigilo entre advogado e cliente superam a conveniência do processamento em nuvem. Empresas contratadas pela área de defesa se deparam com requisitos do CMMC que consideram qualquer dado que saia dos limites da organização como uma descoberta. Em todos esses cenários, a qualidade técnica dos modelos de aprendizado de máquina do Google é irrelevante — a própria arquitetura é o fator de desqualificação. O modelo on-premise da IronOCR elimina toda a categoria de conformidade com processadores de dados terceirizados, pois não há terceiros envolvidos no processamento.
Fluxos de trabalho em PDF tornam-se incontroláveis em grande escala.
As equipes que começam a usar oGoogle Cloud Visionpara OCR de imagens geralmente descobrem a complexidade do PDF quando precisam expandir o escopo. Lidar com 200 PDFs por dia usando o pipeline assíncrono do GCS é viável, mas trabalhoso. Lidar com 10.000 PDFs por dia exige o fortalecimento de todo o pipeline: lógica de repetição para falhas de upload no GCS, filas de mensagens não entregues para operações que nunca são concluídas, tarefas de limpeza para objetos órfãos do GCS quando o aplicativo trava no meio do pipeline e monitoramento dos custos da API Vision e dos custos de armazenamento do GCS. Equipes que atingem essa escala consistentemente consideram a migração para o IronOCR simples — todo o pipeline assíncrono do GCS se resume a um carregamento direto de arquivo local seguido por uma única chamada de leitura, e os modos de falha diminuem de timeouts de rede, falhas de autenticação, erros de cota do GCS e exceções de análise JSON para apenas exceções de E/S de arquivo local.
A previsibilidade orçamentária importa mais do que a flexibilidade por imagem.
Projetos em fase inicial costumam escolher oGoogle Cloud Visionporque o nível gratuito absorve os custos iniciais de desenvolvimento e o modelo por imagem se torna escalável até zero quando nada está sendo processado. Quando um produto atinge um volume de produção consistente — normalmente acima de 50.000 documentos por mês — a equipe financeira percebe a recorrência dessa rubrica. Diferentemente das assinaturas SaaS que crescem com o negócio, a licença perpétua da IronOCR transforma o OCR de uma despesa operacional variável em um investimento de capital fixo. Para uma equipe de 10 desenvolvedores processando documentos em uma indústria regulamentada, a licença Professional em $2,999 uma vez geralmente é justificada no primeiro trimestre de volume de produção em comparação com a precificação contínua por imagem na nuvem.
O processamento em lote atinge os limites de taxa.
Fluxos de trabalho com grande volume de documentos — como descoberta de provas legais, digitalização de documentos financeiros e processamento de sinistros de seguros — exigem rotineiramente o processamento de milhares de documentos por hora. A cota padrão de 1.800 solicitações por minuto doGoogle Cloud Visionsignifica que um pico de 3.000 documentos aciona a limitação de taxa e exige uma solicitação de aumento de cota por meio do Console do GCP (o que envolve aguardar a aprovação do Google) ou a implementação de backoff exponencial com jitter. Uma única ultrapassagem da cota paralisa todo o fluxo de processamento por uma espera obrigatória de 60 segundos antes de qualquer nova tentativa. O processamento local do IronOCR é limitado apenas pelos núcleos de CPU disponíveis, e o processamento paralelo utiliza todos eles sem necessidade de aprovação externa.
Implantações isoladas da internet são necessárias.
Alguns ambientes não possuem conectividade de saída para a internet por projeto: redes militares classificadas, sistemas de controle industrial, centros de dados seguros para compensação financeira. OGoogle Cloud Visionnão funciona nesses ambientes em nenhum nível de criatividade arquitetônica — a API requer conectividade com a internet nos endpoints do Google. A implementação do IronOCR em Docker funciona sem conectividade de saída. A chave de licença é validada no primeiro uso e armazenada em cache; O uso subsequente não requer acesso à rede.
Considerações Comuns de Migração
Removendo a dependência do GCS
A mudança estrutural mais significativa na migração é a eliminação completa do pipeline do GCS. Antes de remover os pacotes do Google, documente todos os buckets do GCS criados para entrada e saída de OCR e limpe-os para evitar cobranças contínuas de armazenamento. A variável de ambiente GOOGLE_APPLICATION_CREDENTIALS e o arquivo de chave JSON devem ser removidos de todas as configurações de implantação, segredos CI/CD e máquinas de desenvolvedores. A conta de serviço do IAM no Console do GCP pode ser desativada ou excluída após a confirmação de que nenhum outro serviço depende dela.
Após remover Google.Cloud.Vision.V1 e Google.Cloud.Storage.V1, o código de processamento de PDF que anteriormente abrangia mais de 50 linhas de orquestração assíncrona se reduz para um OcrInput com LoadPdf e uma única chamada Read. Os contratos de tratamento de erros foram alterados: exceções de rede, exceções de autenticação e exceções de limite de taxa desapareceram. As exceções restantes são exceções de E/S de arquivo (arquivo não encontrado, arquivo bloqueado) e OcrException para falhas de processamento. O guia de entrada de imagens do IronOCR e o guia de entrada de PDF abrangem toda a API de entrada, incluindo fluxos, matrizes de bytes e carregamento de URLs.
Concatenação de símbolos Protobuf para acesso direto ao texto
Cada localização no seu código onde você escreveu .SelectMany(w => w.Symbols).Select(s => s.Text) para extrair texto de parágrafo ou palavra da hierarquia Protobuf se torna um acesso de propriedade direta. paragraph.Text, line.Text, e word.Text existem como propriedades de string tipadas em objetos de resultado IronOCR. Analise todo o código de extração de dados estruturados e remova a lógica de agregação intermediária. O guia prático para ler resultados mapeia cada propriedade disponível em OcrResult, OcrResult.Page, OcrResult.Paragraph, OcrResult.Line e OcrResult.Word.
Transição de assíncrono para síncrono em fluxos de trabalho de PDF
O processamento de PDFs doGoogle Cloud Visioné exclusivamente assíncrono, pois a operação requer viagens de ida e volta pelo GCS. O método Read do IronOCR é síncrono. Se a camada de processamento de PDF do seu aplicativo for construída em torno de assinaturas async Task<string> e cadeias de chamadas baseadas em await, o padrão de migração é um wrapper Task.Run:
public async Task<string> ProcessPdfAsync(string pdfPath)
{
return await Task.Run(() =>
{
using var input = new OcrInput();
input.LoadPdf(pdfPath);
return _ocr.Read(input).Text;
});
}
public async Task<string> ProcessPdfAsync(string pdfPath)
{
return await Task.Run(() =>
{
using var input = new OcrInput();
input.LoadPdf(pdfPath);
return _ocr.Read(input).Text;
});
}
Imports System.Threading.Tasks
Public Async Function ProcessPdfAsync(pdfPath As String) As Task(Of String)
Return Await Task.Run(Function()
Using input As New OcrInput()
input.LoadPdf(pdfPath)
Return _ocr.Read(input).Text
End Using
End Function)
End Function
Isso preserva a interface assíncrona para os chamadores enquanto executa o trabalho de OCR no pool de threads. Para cenários de alta taxa de transferência, o suporte assíncrono do IronOCR lida com esse padrão nativamente sem o wrapper Task.Run.
Pré-processamento de imagens processado pelo aprendizado de máquina do Google
Os modelos com suporte de aprendizado de máquina doGoogle Cloud Visionlidam com alguns problemas de qualidade de imagem — baixo contraste, distorção leve, ruído moderado — sem configuração explícita de pré-processamento. Mecanismos baseados no Tesseract, incluindo o IronOCR, se beneficiam do pré-processamento explícito em entradas degradadas. Se o seu corpus de documentos incluir digitalizações de baixa qualidade, adicione input.Deskew(), input.DeNoise() e input.EnhanceResolution(300) ao pipeline de entrada. O pré-processamento automático do IronOCR aplica esses filtros de forma inteligente na detecção de problemas de qualidade de imagem, mas para fontes de digitalização sabidamente problemáticas, a aplicação explícita dos filtros fornece resultados determinísticos. O guia de correção da qualidade da imagem abrange toda a API de filtros, e o guia de correção de cores da imagem aborda o contraste e a binarização para digitalizações com iluminação irregular.
Funcionalidades adicionais do IronOCR
Além dos recursos abordados nas comparações acima, o IronOCR oferece funcionalidades que não têm equivalente na plataforma OCR do Google Cloud Vision:
- Exportação hOCR: Salve os resultados como arquivos hOCR com
result.SaveAsHocrFile()para ferramentas downstream que consomem o formato hOCR. - Rastreamento do progresso de trabalhos em lote : cargas de trabalho em lote de longa duração podem relatar a conclusão de cada documento por meio da API de rastreamento de progresso, sem consultar uma fila ou analisar a saída do log.
- Tipos de documentos especializados : O IronOCR inclui configurações pré-ajustadas para passaportes, placas de veículos, cheques MICR e documentos manuscritos — tipos de documentos que exigem ajustes específicos do mecanismo além do OCR geral.
- Extração de tabelas de documentos : Os dados estruturados de tabelas em documentos digitalizados podem ser extraídos para uma saída em linhas e colunas sem pós-processamento do fluxo de texto bruto.
- Correção de cor da imagem : A normalização de contraste, o ajuste do limiar de binarização e a conversão para tons de cinza estão disponíveis como etapas explícitas de pré-processamento para digitalizações com iluminação irregular ou tinta desbotada.
Compatibilidade com .NET e Preparação para o Futuro
O IronOCR é compatível com .NET 8 e .NET 9, com suporte ativo, e suporta o .NET Framework 4.6.2 até 4.8 e o .NET Standard 2.0 para bases de código legadas. Os guias de implantação abrangem Windows , Linux , macOS , Docker , Azure e AWS Lambda — o mesmo pacote NuGet é implantado em todos eles sem configuração específica da plataforma. O Google Cloud Vision, como uma API REST/gRPC, não possui uma dependência de versão .NET própria, mas a biblioteca cliente Google.Cloud.Vision.V1 tem como alvo .NET Standard 2.0 e versões posteriores, e sua árvore de dependências (gRPC, Protobuf) adiciona uma superfície de gerenciamento de pacotes NuGet que cresce a cada versão principal dessas bibliotecas.
Conclusão
OGoogle Cloud Visioné um serviço de OCR tecnicamente capaz com forças genuínas: seus modelos apoiados por ML desempenham bem em texto CJK, caligrafia e imagens de cenas naturais, e a saída hierárquica Protobuf do recurso DOCUMENT_TEXT_DETECTION fornece dados granulares a nível de símbolo para casos de uso que precisam disso. Essas vantagens são importantes no contexto certo, mas as limitações arquitetônicas — transmissão obrigatória para a nuvem, gerenciamento de credenciais em arquivos JSON, processamento de PDF dependente do GCS, cobrança por imagem, limite de 1.800 solicitações por minuto e ausência de autorizaçãoFedRAMP— não são parâmetros de configuração que podem ser simplesmente desativados. São propriedades fundamentais de uma API em nuvem.
O modelo local do IronOCR inverte quase todas essas restrições. Os documentos nunca saem do servidor de processamento. A chave de licença substitui o arquivo de chave JSON e a configuração IAM da conta de serviço. O processamento de PDF é uma operação síncrona de três linhas. Não há limites de taxa, nem buckets do GCS para provisionar, nem loops de polling assíncronos, nem desserialização de Protobuf. O objeto OcrResult expõe dados estruturados como propriedades .NET tipadas em vez de uma hierarquia Protobuf que requer concatenação de símbolos para ler texto de parágrafo.
A decisão se resume a uma única questão de arquitetura. Se seus documentos puderem ser enviados para a infraestrutura do Google sem problemas de conformidade, regulamentação ou contrato, e seu volume for baixo o suficiente para que o custo por imagem seja aceitável, a precisão de aprendizado de máquina e a infraestrutura gerenciada doGoogle Cloud Visionrepresentam vantagens legítimas. Se os documentos precisarem permanecer no local — seja por exigências de HIPAA, ITAR, CMMC, contratos com o governo, implantação em ambiente isolado ou políticas de soberania de dados — essa questão já está respondida antes mesmo de avaliar qualquer outra funcionalidade. O licenciamento perpétuo do IronOCR também transforma o OCR de um custo variável, que aumenta com o volume de documentos, em um item fixo, o que simplifica consideravelmente o planejamento orçamentário em escala de produção.
Para as equipes que avaliam a migração, a central de documentação e tutoriais do IronOCR oferece uma cobertura completa da API, incluindo o pré-processamento, os dados estruturados e os recursos especializados de documentos que estão totalmente fora do escopo do OCR do Google Cloud Vision.
Perguntas frequentes
O que é a API Google Cloud Vision?
A API Google Cloud Vision é uma solução de OCR usada por desenvolvedores e empresas para extrair texto de imagens e documentos. Ela é uma das várias opções de OCR avaliadas juntamente com o IronOCR para desenvolvimento de aplicações .NET.
Como o IronOCR se compara à API Google Cloud Vision para desenvolvedores .NET?
IronOCR é uma biblioteca OCR .NET nativa do NuGet que utiliza o IronTesseract como mecanismo principal. Comparada à API Google Cloud Vision, 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 a API Google Cloud Vision?
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 a API Google Cloud Vision 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 da API Google Cloud Vision 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 implantações em Docker e contêineres, ao contrário do Google Cloud Vision?
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 Google Cloud Vision?
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 da API Google Cloud Vision para o IronOCR?
A migração da API Google Cloud Vision 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.

