‘SkiaSharp.SKImageInfo’ Aspose Word v18.8.0 中的异常

‘SkiaSharp.SKImageInfo’ Exception in Aspose Word v18.8.0

使用 Aspose Word (v18.8.0) 将文档转换为 PDF。当我尝试使用 Linux(Alpine)在 docker 容器内执行时,代码在 Visual Studio 内运行良好,它会抛出异常

FROM mcr.microsoft.com/dotnet/core/sdk:3.0.100-alpine3.9 AS build-env
WORKDIR /usr/src/app
COPY . .
RUN dotnet publish ./test/test.csproj -c Release -o ./_publish
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0.0-alpine3.9

RUN apk update
RUN apk upgrade --available

RUN apk add libgdiplus --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/testing/ --allow-untrusted
RUN apk --no-cache add msttcorefonts-installer fontconfig freetype-dev libjpeg-turbo-dev libpng-dev && \
    update-ms-fonts && \
    fc-cache -f

RUN apk add Goelze.SkiaSharp.NativeAssets.AlpineLinux --version 1.68.0
RUN apk add --no-cache icu-libs
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8

ENV ASPNETCORE_URLS http://+:5000
WORKDIR /app
COPY --from=build-env /usr/src/app/_publish ./
EXPOSE 5000/tcp
CMD ["dotnet", "test.dll"]

错误:

Connection id "0HLRQ2FV5QQ5J", Request id "0HLRQ2FV5QQ5J:00000001": An unhandled exception was thrown by the application.
System.TypeInitializationException: The type initializer for   ' threw an exception.
 ---> System.TypeInitializationException: The type initializer for 'SkiaSharp.SKImageInfo' threw an exception.
 ---> System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: Error loading shared library liblibSkiaSharp: No such file or directory
   at SkiaSharp.SkiaApi.sk_colortype_get_default_8888()
   at SkiaSharp.SKImageInfo..cctor()

Aspose.Words 18.8 使用 SkiaSharp 1.60.3 版本。 Goelze.SkiaSharp.NativeAssets.AlpineLinux 需要 SkiaSharp 1.68.0 或更新版本。您应该更新到 Aspose.Words 19.2.0 版本(在此版本中使用 1.68.0 版本的 SkiaSharp)。或者到最新版本,使用1.68.1版本的SkiaSharp。

您必须为 SkiaSharp 添加 Linux 本机资产才能使其在 Linux Alpine 中工作。将 Nuget 引用添加到 Goelze.SkiaSharp.NativeAssets.AlpineLinux。也不要忘记在您的容器中安装 fontconfig。 SkiaSharp 需要它才能使用字体。这是我用于在 Linux Alpine 容器中测试 Aspose.Words 的 Dockerfile。

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine3.9 AS build
WORKDIR /app

# copy csproj and restore as distinct layers
COPY Aspose.Words.Docker.Sample/*.csproj ./Aspose.Words.Docker.Sample/
WORKDIR /app/Aspose.Words.Docker.Sample
RUN dotnet restore

# copy and publish app and libraries
WORKDIR /app/
COPY Aspose.Words.Docker.Sample/. ./Aspose.Words.Docker.Sample/
WORKDIR /app/Aspose.Words.Docker.Sample
RUN dotnet publish -c Release -o out

# copy to runtime environment
FROM mcr.microsoft.com/dotnet/core/runtime:2.2-alpine3.9 AS runtime
WORKDIR /app
# fontconfig is required to properly work with fonts in Linux.
RUN apk update && apk upgrade && apk add fontconfig
COPY --from=build /app/Aspose.Words.Docker.Sample/out ./
ENTRYPOINT ["dotnet", "Aspose.Words.Docker.Sample.dll"]

注意,Goelze.SkiaSharp.NativeAssets.AlpineLinux 是为 Alpine Linux 3.9 编译的,不适用于 3.8。

披露:我在 Aspose.Words 团队工作。