在Linux Docker容器中运行Telerik Reporting生成PDF无文字如何解决
解决方案
1. 开启System.Drawing.Common Unix运行支持
.NET Core 3.1配套的System.Drawing.Common库默认在非Windows环境下禁用部分GDI+功能,需显式开启兼容开关,在程序入口(如Program.cs的Main方法最开头)添加以下代码:
AppContext.SetSwitch("System.Drawing.EnableUnixSupport", true);
也可在项目根目录新建runtimeconfig.template.json文件,添加配置实现全局生效:
{ "configProperties": { "System.Drawing.EnableUnixSupport": true } }
2. 补充Dockerfile字体缓存刷新与权限配置
当前的Dockerfile安装字体后没有刷新系统字体缓存,也没有配置字体文件的读取权限,导致Telerik无法读取到安装的字体,修改后的Dockerfile参考如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base RUN sed -i'.bak' 's/$/ contrib/' /etc/apt/sources.list RUN apt-get update && apt-get install -y --no-install-recommends \ ttf-mscorefonts-installer \ fontconfig \ libc6-dev \ libgdiplus \ libx11-dev \ && rm -rf /var/lib/apt/lists/* # 强制刷新系统字体缓存 RUN fc-cache -fv # 给字体目录配置全局读权限 RUN chmod -R 755 /usr/share/fonts/truetype/msttcorefonts
3. 显式给Telerik指定字体查找路径
避免系统字体查找逻辑异常,可在程序启动时手动给Telerik Reporting指定字体目录,代码如下:
// 路径对应Docker中微软字体的默认安装路径,可根据实际情况调整 Telerik.Reporting.Processing.FontRepository.Instance.AddFontPath("/usr/share/fonts/truetype/msttcorefonts");
4. 确认报表使用的字体已正确安装
如果你的报表使用了ttf-mscorefonts-installer包以外的字体,需要手动将对应字体文件复制到容器的字体目录,再刷新缓存。可在容器中执行fc-list命令查看所有已安装的字体,确认报表用到的字体是否在列表中。
内容的提问来源于stack exchange,提问作者Feras Salim
相关产品推荐
相关产品推荐

