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);
}