当前位置: 首页 > article >正文

.net6 使用 FreeSpire.XLS 实现 excel 转 pdf - docker 部署

FreeSpire.XLS && Aspose.Cells包都可以实现。实现过程中发现如下问题:

本地测试通过, docker部署服务器后报错:
The type initializer for 'Spire.Xls.Core.Spreadsheet.XlsPageSetupBase' threw an exception.
由于缺少依赖: libc6-dev,libgdiplus,libx11-dev。由于目标服务器为内网环境,无外网环境。官网给出答案在dockerfile中 增加

RUN apt-get update \ && apt-get install -y --allow-unauthenticated \ libc6-dev \  libgdiplus \ libx11-dev \   && rm -rf /var/lib/apt/lists/*


尝试解决: 创建docker镜像。由于项目已 mcr.microsoft.com/dotnet/aspnet:6.0-bullseye-slim 为基础镜像,以此新建一个环境镜像。

# 进入容器部署环境
docker run -it mcr.microsoft.com/dotnet/aspnet:6.0-bullseye-slim /bin/bash
apt-get update \ && apt-get install -y --allow-unauthenticated \ libc6-dev \  libgdiplus \ libx11-dev \   && rm -rf /var/lib/apt/lists/*

#部署成功后, 退出容器,并将容器打包为新镜像。
docker commit -a="djc" -m="add libc6-dev,libgdiplus,libx11-dev based on .netcore5.0" 28a66ebccd55 dotnetcore-djc:5.2
# -a :作者; -m: 备注信息 ; 28a66xxx : 容器id(可通过docker ps -a 查看);  

#新的镜像名称为:dotnetcore-djc:5.2


vs项目dockerfile中修改基础镜像:FROM dotnetcore-djc:5.2 AS base

发布后,又报错:System.TypeInitializationException: The type initializer for ‘Gdip’ threw an exception.
google后发现 libgdiplus 包使用了 System.Drawing.Common, .net6后仅在window上支持,我目前使用.net5, 也是平台兼容性报错,不知为何。
尝试解决: 在项目中添加如下代码:

AppContext.SetSwitch("System.Drawing.EnableUnixSupport", true);

发布后,又报错Index was out of range. Must be non-negative and less than the size of the collection. (Parameter 'index')
尝试解决:
升级 FreeSpire.XLS 包, 由原来的 10.10.0 升级为 12.7.0

导出图片后,发现中文字体乱码。
尝试解决:

#将window中 C:\Windows\fonts 内需要得字体,拷贝至容器内 /usr/share/fonts/windows文件夹内。
#更改字体库的权限
chmod 755 /usr/share/fonts/windows/*

#进入文件夹内
mkfontscale  //字体扩展
mkfontdir  //新增字体目录
fc-cache-fv  //刷新缓存

#肯定会报错:mkfontscale: command not found 等,
# 由于Docker mcr.microsoft.com/dotnet/aspnet:5.0 基础镜像中不包含该包,需手动安装。
apt-get update && apt-get upgrade 
apt-get install ttf-mscorefonts-installer // 安装mkfontscale  mkfontdir  命令

#报错: package 'ttf-mscorefonts-intaller' has no installation candidate 错误。
#由于系统初始的资源库找不到指定的包,需要更新 对应 的镜像地址。
#我的/etc/apt/sources.list 中, 初始镜像地址为 Debian buster  ,所以添加如下镜像至sources.list中。
#如果添加版本错误的话,update 会报错。
#华为云
deb https://mirrors.huaweicloud.com/debian/ buster main contrib non-free
deb https://mirrors.huaweicloud.com/debian/ buster-updates main contrib non-free
deb https://mirrors.huaweicloud.com/debian/ buster-backports main contrib non-free
deb https://mirrors.huaweicloud.com/debian-security/ buster/updates main contrib non-free

deb-src https://mirrors.huaweicloud.com/debian/ buster main contrib non-free
deb-src https://mirrors.huaweicloud.com/debian/ buster-updates main contrib non-free
deb-src https://mirrors.huaweicloud.com/debian/ buster-backports main contrib non-free 

#中科大
deb https://mirrors.ustc.edu.cn/debian/ buster main contrib non-free
deb https://mirrors.ustc.edu.cn/debian/ buster-updates main contrib non-free
deb https://mirrors.ustc.edu.cn/debian/ buster-backports main contrib non-free
deb https://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free

deb-src https://mirrors.ustc.edu.cn/debian/ buster main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ buster-updates main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian/ buster-backports main contrib non-free
deb-src https://mirrors.ustc.edu.cn/debian-security/ buster/updates main contrib non-free

# 添加后刷新
apt-get update && apt-get upgrade 
apt-get install ttf-mscorefonts-installer // 安装mkfontscale  mkfontdir  命令
apt-get install fontconfig //安装 fc-cache 命令

修改 .sln 同目录下的Dockerfile文件,内容如下:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

#这种模式是直接在构建镜像的内部编译发布dotnet项目。
#注意下容器内输出端口是9291
#如果你想先手动dotnet build成可执行的二进制文件,然后再构建镜像,请看.Api层下的dockerfile。


FROM mcr.microsoft.com/dotnet/aspnet:6.0-bullseye-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim AS build
WORKDIR /src
COPY ["ShutterPro.Core.Api/ShutterPro.Core.Api.csproj", "ShutterPro.Core.Api/"]
COPY ["ShutterPro.Core.Extensions/ShutterPro.Core.Extensions.csproj", "ShutterPro.Core.Extensions/"]
COPY ["ShutterPro.Core.Tasks/ShutterPro.Core.Tasks.csproj", "ShutterPro.Core.Tasks/"]
COPY ["ShutterPro.Core.IServices/ShutterPro.Core.IServices.csproj", "ShutterPro.Core.IServices/"]
COPY ["ShutterPro.Core.Model/ShutterPro.Core.Model.csproj", "ShutterPro.Core.Model/"]
COPY ["ShutterPro.Core.Common/ShutterPro.Core.Common.csproj", "ShutterPro.Core.Common/"]
COPY ["ShutterPro.Core.Services/ShutterPro.Core.Services.csproj", "ShutterPro.Core.Services/"]
COPY ["ShutterPro.Core.Repository/ShutterPro.Core.Repository.csproj", "ShutterPro.Core.Repository/"]
COPY ["ShutterPro.Core.EventBus/ShutterPro.Core.EventBus.csproj", "ShutterPro.Core.EventBus/"]
RUN dotnet restore "ShutterPro.Core.Api/ShutterPro.Core.Api.csproj"
COPY . .
WORKDIR "/src/ShutterPro.Core.Api"
RUN dotnet build "ShutterPro.Core.Api.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "ShutterPro.Core.Api.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
EXPOSE 9291 
ENTRYPOINT ["dotnet", "ShutterPro.Core.Api.dll"]

RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak && \
    mv sources.list /etc/apt/ && \
    apt-get update -y && \
    apt-get install -y --allow-unauthenticated libc6-dev libgdiplus libx11-dev fonts-wqy-zenhei ttf-mscorefonts-installer fontconfig && \
    apt-get clean && \
    ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll

同目录下,新增一个  sources.list 文件,内容如下:

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free

deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free

deb https://security.debian.org/debian-security bullseye-security main contrib non-free
# deb-src https://security.debian.org/debian-security bullseye-security main contrib non-free


重新部署后,一切正常。

参考
[1]: https://www.e-iceblue.com/forum/exception-the-type-initializer-for-spire-xls-core-spreadsh-t10260.html
[2]: https://docs.telerik.com/reporting/knowledge-base/system-drawing-common-is-not-supported-on-non-windows-platforms
[3]: https://www.lllxy.net/Blog/Detail/634b2769-5046-45eb-b71b-fe2a87b7c1fe


http://www.kler.cn/a/405704.html

相关文章:

  • 【Python系列】浅析 Python 中的字典更新与应用场景
  • 为什么transformer的时间复杂度是N的平方,具体是里面的哪一个计算流程最占用时间
  • java 并发编程 (1)java中如何实现并发编程
  • 【Linux内核深度解析】TCP协议栈之tcp_recvmsg
  • vue3+elementui-plus el-dialog全局配置点击空白处不关闭弹窗
  • tcp/ip异常断开调试笔记——lwip
  • 中国省级新质生产力发展指数数据(任宇新版本)2010-2023年
  • 单词的分类(二)冠词和数词
  • ANSYS HFSS仿真回流路径与跨分割布线
  • Go语言使用 kafka-go 消费 Kafka 消息教程
  • QA|使用 MapleSim 模拟卷料生产 (Converting)和卷对卷系统 (R2R)
  • Paper -- 洪水深度估计 -- 基于计算机视觉, 根据被淹车辆图像进行洪水深度估计
  • nginx 配置lua执行shell脚本
  • Linux ASLR
  • 【数据结构】—— 树
  • 从 HTML 到 CSS:开启网页样式之旅(开篇之一)——CSS 初体验与网页样式新征程
  • HTML 元素详解
  • 标贝科技:自动驾驶中的数据标注类别分享
  • 物联网研究实训室建设方案
  • Nuxt3:拉取项目模板失败问题解决方法
  • 【自动驾驶】数据集合集!
  • Spark SQL 之 QueryStage
  • C++基础:vector的底层实现
  • Linux 查看端口和进程的常用命令
  • 【优选算法】二分查找
  • 软件测试——自动化测试常见函数