我的netcore6项目,部署到IIS的时候,生成报告时,需要获取公司LOGO图片放到PDF报告文件中,这时候访问静态图片没有问题。 然后还有生成邀请二维码图片,这时候动态创建图片路径和图片也没有问题,可以在站点的wwwroot目录下正确创建二维码图片。
但是部署到linux的nginx站点之后,不管是访问静态LOGO图片,还是动态生成二维码图片,都有问题了。
获取logo图片提示如下异常:
[ERR] Could not find file '/www/wwwroot/站点根目录名/wwwroot/ReportTemplate\CompanyLogo\jq_logo02.jpg'.
动态生成的二维码图片成了如下截图的样子:

问题解决过程:
1、关于无法生成二维码的问题,网上搜到的资料有个说法是linux系统中,路径中不能有 \\ 这样的反斜杠,应该用 / 这样的正斜杠来分隔目录上下级,而且windows是可以支持 正斜杠/这样的文件物理路径的。我照此办法修改生成的文件目录物理地址串之后,是可以成功创建二维码图片了的。效果如下:


2、关于导出时找不到LOGO图标的问题 ,错误提示里说的地址是下面这样的,
'/www/wwwroot/站点根目录名/wwwroot/ReportTemplate\CompanyLogo\jq_logo02.jpg'
明显的这里面也有反斜杠,所以先想办法把导出报表里面的物理文件路径 的反斜杠 \或者\\都替换成正斜杠/。 发布到nginx测试看是否可行。

结果还是提示找不到logo图片, 最后我到宝塔里直接用这个报错的路径去访问文件,也提示找不到,最后发现是目录最后一级的 CompanyLog 这个名字的l大写了, 但实际目录却没有大写,linux是区分大小写的,所以找不到文件了。

解决了这个问题之后,发现还有错误日志
Export_series发生异常==The type initializer for ' ' threw an exception.
如下图所示

这个错误日志是我的导出报表业务类抛出来的,但是明显的描述不够详细,没法诊断具体错误发生的行。 只能继续加日志 一段段代码来打印日志。得到了如下日志结果


引起这个异常日志The type initializer for 'Gdip' threw an exception. 的原因是 设置图片大小的时候用了Image对象 属于GDI的,但是linux默认可能没有GDI包。根据百度查出来的资料提示。参考这个链接给linux安装了GDI包 ,我的是centos,所以使用yum install libgdiplus -y 命令安装。The type initializer for 'Gdip' threw an exception_the type initializer for 'gdip' threw an exception-CSDN博客


安装了GDI包之后,重试接口导出,还是报GdIp异常,那就重启linux

重启之后,没有GIDP的异常了
又得到了如下异常。对应的代码又有一个生成文件路径的方法GetFilePath,里面又发现了反斜杠\ 所以在下面替换成正斜杠。



至此,终于能导出PDF文件了, 结果他给我来个中文乱码,中文全部成了小方格。

我用的是aspose.words 插件来导出生成pdf文件,根据网上的说法是要把windows的字体上传到linux。下面展示windows字体上传至linux的操作步骤:
1、打包windows字体
windows字体在C:\WINDOWS\Fonts中。 直接将fonts文件夹压缩成压缩包。注意,到fonts文件夹里面全选再压缩貌似不能成功,我试过两次了,所以返回到上一级windows目录中对fonts文件夹压缩。

2、到linux创建目录并上传字体文件
执行命令创建win目录:mkdir /usr/share/fonts/win
上传文件到目录中,可以用ftp方式上传, 我用的是宝塔控制面板,网页界面直接上传的rar文件。
3、解压缩fonts.rar包
用cd .. 命令回到根目录,然后cd 几次进入 win文件夹.
用命令解压Fonts.rar文件: rar x Fonts.rar
如下图:

4、建立字体缓存
输入命令给字体文件夹更高权限:chmod -R 755 ./Fonts
cd Fonts 进入 fonts文件夹
输入命令建立字体缓存:sudo mkfontscale
如果提示 mkfontscale: command not found,需安装 yum install mkfontscale
安装好了之后继续执行
sudo mkfontscale
sudo mkfontdir // 我没创建这个
sudo fc-cache -fv //使缓存生效
#如果提示 fc-cache: command not found,需安装 yum install fontconfig


5、是字体生效,重启项目
source /etc/profile
fc-list #查看Linux下所有字体
fc-list :lang=zh #查看Linux下中文字体
然后重启项目就可以了
如果重启 项目还是不能正常导出中文,那就重启服务器。
正常导出如下图:
