.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-freedeb-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-freedeb-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 80FROM 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/buildFROM build AS publish
RUN dotnet publish "ShutterPro.Core.Api.csproj" -c Release -o /app/publishFROM 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-freedeb 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-freedeb 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-freedeb 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.rhkb.cn/news/476455.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot整合hive

springboot整合hive pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.…

跨视角差异-依赖网络用于体积医学图像分割|文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 Cross-view discrepancy-dependency network for volumetric medical imagesegmentation 跨视角差异-依赖网络用于体积医学图像分割 01 文献速递介绍 医学图像分割旨在从原始图像中分离出受试者的解剖结构&#xff08;例如器官和肿瘤&#xff09;&#xff0c;并…

WebApis学习笔记,第二节:高级语法

WebApis学习笔记&#xff0c;第二节&#xff1a;高级语法 一、JS组成 我们再回顾一下JS的组成&#xff1a;ECMAScript: 规定了js基础语法核心知识。 比如&#xff1a;变量、分支语句、循环语句、对象等等Web APIs : DOM 文档对象模型&#xff0c; 定义了一套操作HTML文档的AP…

二叉树路径相关算法题|带权路径长度WPL|最长路径长度|直径长度|到叶节点路径|深度|到某节点的路径非递归(C)

带权路径长度WPL 二叉树的带权路径长度(WPL)是二叉树所有叶节点的带权路径长度之和&#xff0c;给定一棵二叉树T&#xff0c;采用二叉链表存储&#xff0c;节点结构为 其中叶节点的weight域保存该节点的非负权值&#xff0c;设root为指向T的根节点的指针&#xff0c;设计求W…

飞桨大模型PaddleOCR

一、新建项目PaddleOCRProject 二、查看开源 pip install paddlepaddle pip install paddleocr指定镜像源下载才快&#xff1a; pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple pip install paddleocr -i https://pypi.tuna.tsinghua.edu.cn/simple 三…

Python创建虚拟环境报错:Error: Command......

文章目录 环境说明问题描述原因分析解决方法 环境说明 系统 # lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.4 LTS Release: 22.04 Codename: jammyPython版本 # python3 --version Python 3.13.0问题描…

Linux INPUT 子系统详解

目录 一、引言 二、INPUT 子系统的架构 1.输入设备驱动层 2.核心层 3.事件处理层 三、INPUT 子系统的工作原理 1.设备注册与初始化 2.事件产生与提交 3.事件分发与处理 4.应用程序访问输入设备 四、使用 INPUT 子系统进行设备驱动开发 1.编写输入设备驱动程序 2.注…

sql注入报错分享(mssql+mysql)

mysql mysql的报错内容比较多 网上也有比较多的 这里重复的就不多介绍了。一笔带过 溢出类 bigint 当超过mysql的整形的时候&#xff0c;就会导致溢出&#xff0c;mysql可能会将错误信息带出。这里user()是字母默认为0 取反以后1可能就会导致异常。 报错特征 BIGINT UNSIG…

JVM(五、垃圾回收器)

经典的垃圾回收器大概有7种&#xff0c;这些收集器的目标、特性、原理、使用场景都有所区别&#xff0c;有的适用于年轻代&#xff0c;有的适用于老年代&#xff0c;图中展示的就是这7中垃圾回收器&#xff0c;如果两个垃圾回收器有连线&#xff0c;则表明可以配合使用。这个关…

雅思阅读TFNG题型7大解题思路

雅思阅读TFNG题型7大解题思路&#xff0c;全在这了‼️ ⚠️在徘徊在6-6.5的同学有很大的共性就是对题型不够熟悉&#xff0c;我记得我当时卡6.5的时候我有时候分不清NG和F&#xff0c;有时候又分不清NG 和True&#xff0c;也不知道他有哪几种考我的方法&#xff0c;脑子里没有…

Nuxt3:拉取项目模板失败问题解决方法

问题描述 使用官网提供的命令npx nuxilatest init <project-name> 创建Nuxt3项目时&#xff0c;遇到了拉取项目模板失败的问题&#xff0c;报错信息如下 先分析一下这行命令在做的事情&#xff0c;结合之前的经验来看&#xff0c;似乎是在尝试通过该网址返回的元数据信息…

索引(MySQL)

1. 没有索引&#xff0c;可能会有什么问题 索引&#xff1a;提高数据库的性能&#xff0c;索引是物美价廉的东西了。不用加内存&#xff0c;不用改程序&#xff0c;不用调sql&#xff0c;只要执行 正确的 create index &#xff0c;查询速度就可能提高成百上千倍。但是天下没有…

MybatisPlus之1:快速入门

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

菜鸟驿站二维码/一维码 取件识别功能

特别注意需要引入 库文 ZXing 可跳转&#xff1a; 记录【WinForm】C#学习使用ZXing.Net生成条码过程_c# zxing-CSDN博客 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static System.Net.…

「甲子光年」对话黄翔:从电子签回望中国SaaS“黄金十年”

法大大成立十周年之际&#xff0c;联合「甲子光年」重榜发布《中国电子签十年风云录》&#xff0c;通过应用者、从业者、观察者的不同视角&#xff0c;记录电子签乃至时代发展的风云十年。本期是刊物精彩内容呈现的第一期&#xff0c;扫描下图可获取电子版。 创立法大大之前&am…

【Three.js基础学习】28.Coffee Smoke

前言 /* 补充&#xff1a;材质本身纹理有光源等信息因此能看到模型 gltf.scene.traverse((child) > { if (child.isMesh) { child.material.map null; // 移除贴图 } }); 此时是纯白色&#xff0c;按照正常逻辑 没有光会是灰/黑色 为什么显示白色 1.默认材质颜色 2.材质的表…

Linux(命令行扩展+命令行历史 大白话+图片)

后面也会持续更新&#xff0c;学到新东西会在其中补充。 建议按顺序食用&#xff0c;欢迎批评或者交流&#xff01; 缺什么东西欢迎评论&#xff01;我都会及时修改的&#xff01; 在这里真的很感谢这位老师的教学视频让迷茫的我找到了很好的学习视频 王晓春老师的个人空间…

渗透测试---shell(5)字符串运算符与逻辑运算符

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人与泷羽sec团队一律不承担一切后果 目录 一、字符串运算符 创建u.sh文…

06、Spring AOP

在我们接下来聊Spring AOP之前我们先了解一下设计模式中的代理模式。 一、代理模式 代理模式是23种设计模式中的一种,它属于结构型设计模式。 对于代理模式的理解: 程序中对象A与对象B无法直接交互,如:有人要找某个公司的老总得先打前台登记传达程序中某个功能需要在原基…

游戏陪玩系统开发功能需求分析

电竞游戏陪玩系统是一种专门为游戏玩家提供陪伴、指导和互动服务的平台。这类系统通常通过专业的陪玩师&#xff08;也称为陪练师&#xff09;为玩家提供一对一或多对一的游戏陪伴服务&#xff0c;帮助玩家提升游戏技能、享受游戏乐趣&#xff0c;甚至解决游戏中的各种问题。电…