.NET Core部署Azure Linux App Service后PDF生成对齐问题求助
解决Azure Linux App Service上SautinSoft.Document DOCX转PDF字体缺失问题
核心原因
Azure Linux App Service默认未预装Windows常用字体(如宋体、微软雅黑等),SautinSoft.Document转换时找不到对应字体,会自动使用系统默认替代字体,进而引发排版错位问题。
具体解决方案
1. 打包字体到应用程序
- 将所需字体文件(如
simsun.ttf、msyh.ttc)添加到项目,设置复制到输出目录为「始终复制」。 - 在代码中指定字体搜索路径,让组件加载本地字体:
// 指向项目根目录下的Fonts文件夹 string fontFolder = Path.Combine(AppContext.BaseDirectory, "Fonts"); FontSettings.Default.FontsSources.Add(new FontFileSource(Directory.GetFiles(fontFolder)));
2. 在Azure Linux环境安装系统字体
通过SSH终端或自定义启动脚本安装字体:
- 连接App Service SSH终端,执行命令安装开源中文字体:
sudo apt-get update sudo apt-get install -y fonts-wqy-microhei fonts-wqy-zenhei
- 若需Windows字体,手动上传字体文件到
/usr/share/fonts目录后,执行更新缓存命令:
sudo fc-cache -fv
3. 配置字体 fallback 映射
若无法安装目标字体,可指定替代字体保障排版一致性:
// 映射缺失字体到可用替代字体 FontSettings.Default.FontReplacements.Add(new FontReplacement("宋体", "Noto Sans CJK SC")); FontSettings.Default.FontReplacements.Add(new FontReplacement("微软雅黑", "Noto Sans CJK SC"));
4. 验证字体加载状态
转换前添加日志输出,确认字体是否被正确识别:
foreach (var font in FontSettings.Default.GetAvailableFonts()) { Console.WriteLine($"可用字体:{font.FamilyName}"); }
注意事项
- 确保使用的字体具备合法授权,避免版权风险。
- 若用自定义启动脚本,需在Azure门户的App Service配置中设置启动命令,例如:
bash ./install-fonts.sh && dotnet YourApp.dll - 可通过Kudu站点检查应用目录下的字体文件是否存在,或通过SSH终端执行
fc-list命令查看系统已安装字体。
内容的提问来源于stack exchange,提问作者Suresh Sankar
相关产品推荐
相关产品推荐

