Dúvida sobre compatibilidade do Aspose.OCR com .NET 8 em Docker (Linux)

Estamos usando a biblioteca Aspose.OCR no nosso ambiente de produção, que roda em contêineres Docker com Linux e .NET 8.

Ao tentar fazer o reconhecimento de um PDF, esbarramos no erro System.PlatformNotSupportedException. Pelo que investigamos, a causa é a dependência da biblioteca com o System.Drawing.Common, que a Microsoft não suporta mais oficialmente no Linux.

O ponto principal para nós é que, por uma política de arquitetura do nosso projeto, não podemos habilitar o modo de compatibilidade System.Drawing.EnableUnixSupport. Nós buscamos usar apenas ferramentas que sejam 100% compatíveis com nosso ambiente Linux de forma nativa.

A nossa dúvida: existe alguma versão do Aspose.OCR que funcione nativamente no Linux com .NET 8, sem depender do System.Drawing.Common?

Por exemplo, talvez uma versão que utilize internamente uma biblioteca gráfica mais moderna e multiplataforma, como SkiaSharp ou ImageSharp?

@governanca.brasil

Atualmente, a biblioteca Aspose.OCR para .NET é compatível com o .NET 8 e foi testada em ambientes Linux. No entanto, a dependência do System.Drawing.Common pode causar problemas, como o erro System.PlatformNotSupportedException, especialmente se o suporte a Unix não estiver habilitado.

Atualmente, não há informações sobre uma versão do Aspose.OCR que utilize bibliotecas gráficas mais modernas e multiplataforma, como SkiaSharp ou ImageSharp, que funcionem nativamente no Linux sem depender do System.Drawing.Common.

Recomendo verificar as notas de versão mais recentes no site da Aspose ou no repositório do GitHub para atualizações sobre compatibilidade e possíveis soluções. Além disso, consulte a documentação oficial sobre requisitos de sistema para garantir que sua configuração esteja correta.

@governanca.brasil

Infelizmente, o Aspose.OCR para .NET não oferece suporte ao Alpine, pois não existem builds preparados do ONNXRuntime para Alpine, e o Aspose.OCR depende dele. No entanto, registramos um ticket de investigação como OCRNET-1110 em nosso sistema de rastreamento de problemas para análise adicional. Vamos verificar se é possível implementar alguma solução alternativa, mas não podemos prometer nada por enquanto. Informaremos você através deste tópico do fórum assim que tivermos atualizações sobre isso.

Existe alguma alternativa para transforma a pagina em uma imagem e depois fazer ocr? Precisamos extrair o máximo de texto das páginas, só extração de texto está ok, ocr de imagem estão ok, mas fazer a extração de tudo não está sendo possível. Estamos fazendo isso .net 8, para rodar em linux… docker…

@governanca.brasil

Para converter as páginas de PDF em imagens, você precisará usar a API Aspose.PDF para .NET. Consulte o(s) artigo(s) abaixo para mais informações:

Depois de obter imagens do Aspose.PDF, você pode usar o Aspose.OCR para realizar a operação de OCR nelas.

Olá.

Durante a execução do serviço de OCR utilizando a biblioteca Aspose.PDF para .NET, com essa sugestão foi identificado um erro crítico relacionado à dependência System.Drawing.Common. O erro completo indica uma exceção do tipo System.TypeInitializationException, causada por uma System.PlatformNotSupportedException, com a seguinte mensagem:

System.Drawing.Common is not supported on non-Windows platforms.

Esse erro ocorre porque a biblioteca System.Drawing.Common, utilizada internamente pelo Aspose.PDF para gerar imagens a partir de arquivos PDF, não é suportada oficialmente em ambientes que não sejam Windows, como é o caso do contêiner Docker baseado em Linux.

Erro durante o processamento do OCR.

System.TypeInitializationException: The type initializer for ‘Gdip’ threw an exception.

—> System.PlatformNotSupportedException: System.Drawing.Common is not supported on non-Windows platforms.

at System.Drawing.SafeNativeMethods.Gdip…cctor()

— End of inner exception stack trace —
at System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders()

at Aspose.Pdf.Devices.TiffDevice.Process(…)

at Aspose.Pdf.Devices.DocumentDevice.Process(…)

at xxxxxxxxxxx.OcrDocumentoServico.ProcessarPdf(…)

Ambiente Docker Atual

O contêiner Docker utilizado está baseado na imagem oficial do .NET 8.0 (mcr.microsoft.com/dotnet/aspnet:8.0) e inclui os seguintes pacotes e configurações:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base

RUN apt-get update && apt-get install -y libgdiplus
RUN apt install software-properties-common -y
RUN echo “deb Index of /debian bookworm contrib non-free” > /etc/apt/sources.list.d/contrib.list
RUN apt update && apt upgrade -y
RUN apt install ttf-mscorefonts-installer -y

Apesar da instalação do libgdiplus, que é um substituto do GDI+ no Linux, o erro persiste porque a partir do .NET 6, a Microsoft descontinuou o suporte oficial ao System.Drawing.Common em plataformas não-Windows, mesmo com libgdiplus instalado.

A biblioteca Aspose.PDF, ao tentar converter páginas de PDF em imagens (por exemplo, TIFF), faz uso interno de System.Drawing.Common. Como essa API depende de funcionalidades específicas do Windows, sua execução em ambientes Linux resulta em falha.

esse é um teste que estou fazendo aqui

private string ProcessarPdf(string caminhoArquivo, TipoSaidaOcrEnum formatoSaida)
{
StringBuilder textoExtraido = new();
string diretorioArquivo = Path.GetDirectoryName(caminhoArquivo) ?? string.Empty;

 using (Aspose.Pdf.Document document = new(caminhoArquivo))
 {
     Aspose.Pdf.Devices.Resolution resolution = new(300);
     Aspose.Pdf.Devices.TiffSettings tiffSettings = new()
     {
         Compression = Aspose.Pdf.Devices.CompressionType.RLE,
         Depth = Aspose.Pdf.Devices.ColorDepth.Format8bpp,
         Shape = Aspose.Pdf.Devices.ShapeType.Portrait,
     };

     Aspose.Pdf.Devices.TiffDevice tiffDevice = new(resolution, tiffSettings);

     for (int i = 1; i <= document.Pages.Count; i++)
     {
         string arquivoTemporario = Path.Combine(diretorioArquivo, $"{Guid.NewGuid()}.tif");

         try
         {
             tiffDevice.Process(document, i, i, arquivoTemporario);
             string textoPagina = ProcessarImagem(arquivoTemporario, formatoSaida);
             textoExtraido.AppendLine(textoPagina);
         }
         finally
         {
             if (File.Exists(arquivoTemporario))
             {
                 File.Delete(arquivoTemporario);
             }
         }
     }
 }

 return PrepararConteudoSaida(textoExtraido.ToString().Trim(), formatoSaida);

}

Olá,
Lembrando que esse assunto é uma prioridade na nossa API e estamos dependendo de uma solução concreta, temos prazos para cumprir, fico no aguardo, grato.

@governanca.brasil

Obrigado pela paciência. Informamos que lançamos outro pacote, o Aspose.PDF.Drawing para .NET, voltado para ambientes Linux. Este pacote não possui dependência da biblioteca System.Drawing.Common. Portanto, desinstale o Aspose.PDF para .NET já existente e instale o Aspose.PDF.Drawing para .NET. Ele funcionará no Docker Linux. Caso ainda encontre algum problema, por favor, nos informe.

Você teria algum exemplo que transforma a pagina em uma imagem? Usando Aspose.PDF.Drawing… Meu projeto não tem Aspose.PDF,

Tudo indica que deu certo aqui, vou fazer mais alguns testes. Obrigado

@governanca.brasil

Claro, por favor, leve o tempo que precisar e nos avise caso precise de qualquer tipo de assistência.

Olá, tudo bem?

Estou desenvolvendo uma solução que utiliza Aspose.Pdf para ler documentos e Aspose.Ocr para extrair texto de conteúdo não pesquisável.

Meu fluxo de trabalho atual é o seguinte:

  1. Itero sobre as páginas de um documento PDF.

  2. Verifico se a página contém recursos de imagem (pagina.Resources.Images).

  3. Se uma imagem é encontrada, assumo que a página pode ser um scan ou conter texto embutido na imagem. Para garantir a extração, eu converto a página inteira para uma imagem de alta resolução (ex: TIFF) e a processo com AsposeOcr.

O desafio que enfrento é a performance. Este método é eficaz, mas computacionalmente caro. Muitos dos meus documentos são oficiais e contêm imagens que são apenas figurativas (fotos de objetos, brasões governamentais, selos gráficos) e não possuem texto que precise ser extraído. Realizar o processo completo de conversão de página + OCR para essas imagens irrelevantes consome muito tempo e recursos de CPU.

Gostaria de saber se as ferramentas da Aspose oferecem uma maneira mais inteligente de lidar com isso. Existe alguma função ou heurística integrada que possa fazer uma pré-análise extremamente rápida de um XImage para avaliar a probabilidade de ele conter texto relevante? para avaliar a probabilidade de ele conter texto relevante

O objetivo é ter um mecanismo de baixo custo para descartar imagens que são claramente fotos ou gráficos, evitando assim o processamento de OCR desnecessário e otimizando todo o fluxo.

Qualquer orientação sobre as melhores práticas para este cenário seria ótimo.

Muito obrigado.

@governanca.brasil

Você poderia, por gentileza, compartilhar o trecho de código que está utilizando para verificar documentos PDF com o Aspose.PDF, juntamente com o arquivo PDF de exemplo? Se possível, uma aplicação de console de exemplo seria o ideal para reproduzir o cenário em nosso ambiente e tratá-lo adequadamente. Você pode criar uma aplicação de console e compartilhar o arquivo .zip conosco. Prosseguiremos com isso conforme necessário.

Olá,

Agradeço a rápida resposta.

Compreendo a solicitação de um código de exemplo para reprodução, e isso faz todo o sentido para depurar um problema específico de implementação. Acredito que minha pergunta original foi mais conceitual e estratégica do que um relato de bug ou um erro no código.

Para esclarecer: meu código atual funciona como o esperado. Ele consegue iterar pelas páginas, extrair as imagens e processar com o Aspose.Ocr. O desafio que enfrento não é de funcionamento, mas sim de performance e otimização.

O “problema” é que o processo de OCR é computacionalmente muito caro para ser executado em todas as imagens encontradas, especialmente porque em muitos dos meus documentos (documentos oficiais, contratos, etc.), as imagens são meramente figurativas (fotos, brasões de governo, selos gráficos, logotipos) e não contêm texto relevante.

Portanto, a minha dúvida é sobre a existência de uma funcionalidade nativa no ecossistema Aspose. Gostaria de saber se o Aspose.Pdf, Aspose.Ocr ou alguma outra ferramenta da suíte oferece um método de pré-análise de baixo custo computacional para avaliar um XImage e determinar a probabilidade de ele conter texto, antes de invocar o processo completo e pesado de OCR.

Para ilustrar, eu imagino algo como uma função hipotética:

// Isso é um exemplo do que eu procuro saber se existe no Aspose
bool imagemProvavelmenteContemTexto = Aspose.AnalisadorDeImagem.VerificarPotencialDeTexto(meuXImage, nivelDeConfianca: 0.7);

if (imagemProvavelmenteContemTexto)
{
    // Só então eu executaria a conversão da página em imagem e depois o processo de OCR na página inteira
    string caminhoImagem = ConvertePaginaImagem(pagina)
    ExecutarOcrCompleto(caminhoImagem );
}

Antes de eu mesmo ter que desenvolver uma heurística externa (analisando histogramas de cores, detecção de bordas, ou usando outra biblioteca de machine learning para classificação de imagem), gostaria de confirmar se a Aspose já não oferece uma solução mais inteligente e integrada para este problema comum de otimização de OCR e claro de forma mais rápida que fazer todos o processo anterior.

Por isso, neste momento, um código de exemplo da minha parte não ajudaria a responder a esta pergunta sobre as capacidades da ferramenta.

Aguardo orientação sobre as funcionalidades da suíte Aspose para este cenário.

@governanca.brasil

Entendemos suas preocupações, bem como o seu cenário, e faz sentido. Por favor, note que temos diferentes maneiras de alcançar o que você está tentando realizar atualmente, ou seja, realizar OCR em documentos PDF com conteúdo misto (Texto/Imagem). Por exemplo, uma técnica é converter toda a página do documento PDF em uma imagem e realizar a operação de OCR na imagem obtida, como no exemplo abaixo:

string pdfPath = $"{dataDir}pcuhSaved2.pdf";

List<Aspose.OCR.RecognitionResult> ocrResults = new List<Aspose.OCR.RecognitionResult>();
Aspose.OCR.AsposeOcr api = new Aspose.OCR.AsposeOcr();

// Resolution resolution = new Resolution(300);
// PngDevice imageDevice = new PngDevice(resolution);
PngDevice imageDevice = new PngDevice();
Document pdfDocument = new Document(pdfPath);

for (int pageCount = 1; pageCount <= pdfDocument.Pages.Count; pageCount++)
{
    using (MemoryStream ms = new MemoryStream())
    {
        // Convert a particular page and save the image to stream
        imageDevice.Process(pdfDocument.Pages[pageCount], ms);

        Aspose.OCR.OcrInput input = new Aspose.OCR.OcrInput(Aspose.OCR.InputType.SingleImage);
        input.Add(ms);
        var recognResult = api.Recognize(input, new Aspose.OCR.RecognitionSettings { DetectAreasMode = Aspose.OCR.DetectAreasMode.TABLE });
        ocrResults.Add(recognResult[0]);
        ms.Close();
    }
}

Aspose.OCR.AsposeOcr.SaveMultipageDocument(dataDir + "/res.pdf", Aspose.OCR.SaveFormat.Pdf, ocrResults);

Mas, como você mencionou, o processo de OCR é bastante computacional e exige muitos recursos, então, no seu caso, será melhor pular o máximo de páginas de PDF que possuem apenas texto para evitar o OCR. O Aspose.PDF oferece uma maneira de detectar se uma página de PDF contém texto, imagens ou ambos. O artigo abaixo explica isso com um exemplo.

Por favor, note que, caso você ainda perceba ou experimente problemas de consumo de memória e as abordagens sugeridas não ajudem no seu caso, precisaríamos de algumas informações de amostra da sua parte para criar um ticket em nosso sistema interno para uma análise mais detalhada. Isso é necessário para entendermos exatamente o que você está fazendo e como está fazendo, para que possamos realizar uma investigação e tentar encontrar uma solução alternativa. Sinta-se à vontade para nos escrever caso tenha mais perguntas.

Olá,

Obrigado pela resposta e pelo exemplo de código.

Acho que estamos quase chegando ao ponto central da minha dúvida. A abordagem que vocês descreveram é exatamente a que eu uso hoje, e é justamente ela que estou tentando otimizar.

Para deixar 100% claro, meu fluxo atual já faz o seguinte:

  1. Páginas com apenas texto: Eu extraio o texto diretamente com Aspose.Pdf. Tudo perfeito e rápido aqui.

  2. Páginas com imagens: Eu converto a página inteira para imagem e aplico o Aspose.Ocr.

O meu grande desafio de performance está no passo 2.

O problema é que muitas vezes a imagem presente na página não tem texto nenhum. Por exemplo, um cenário muito comum para mim:

  • Uma página de um contrato tem 50 parágrafos de texto digital normal.

  • No topo da página, há uma única imagem: o logotipo da empresa ou um brasão do governo.

  • Por causa dessa única imagem sem texto, meu sistema hoje é forçado a fazer o processo caro: converter a página inteira em imagem e rodar o OCR.

Isso é muito ineficiente, especialmente, como mencionei, em documentos de 100, 200 páginas, sendo processados por vários usuários ao mesmo tempo.

Portanto, a minha pergunta específica é:

Existe alguma função nativa no Aspose para fazer uma pré-análise RÁPIDA e de BAIXO CUSTO em um objeto de imagem (XImage) para avaliar se ele é um bom candidato para OCR?

Estou procurando por algo que me ajude a diferenciar uma foto ou um gráfico de uma imagem que realmente contém texto escaneado, para que eu possa tomar a decisão de rodar o OCR ou não. Algo como uma análise de histograma, detecção de bordas, ou qualquer heurística que a Aspose já possa oferecer.

Se a resposta for “não, o Aspose não possui essa funcionalidade de pré-análise de imagem”, está tudo bem! E fica a sugestão para ser colocado na biblioteca, assim evito usar outra bibliotecas no sistema para fazer esse processo ou até mesmo desenvolver algo próprio.

Agradeço mais uma vez a ajuda.

Outro ponto, estou conseguindo manipular bem o consumo de memória, ainda alto mas está mantendo aceitável.

@governanca.brasil

Obrigado pela explicação e pela sua paciência. Neste momento, precisaríamos de um documento PDF de amostra do seu lado, pois esse cenário precisa ser investigado internamente. Analisaremos e faremos o máximo possível para superar os desafios que você tem enfrentado. Registraremos este caso em nosso sistema de rastreamento de problemas e compartilharemos o ID do ticket com você. Por favor, compartilhe tal PDF de amostra.