如何在C# WPF中将项目嵌入的字体文件添加到Stimulsoft报表中
解决方案
前置配置
首先确认字体文件的项目属性设置:
- 在VS解决方案资源管理器中找到
FNT文件夹下的BTITRBD.TTF文件 - 右键选择「属性」,将「生成操作」设置为
嵌入的资源
实现代码
StiFontCollection.AddFontFile仅支持本地物理文件路径,不识别WPF的pack URI也无法直接读取程序集资源流,所以需要先将嵌入的字体资源导出到本地临时文件,再传递路径:
using System.IO; using System.Reflection; using Stimulsoft.Report; // 读取嵌入的字体资源流,注意资源名大小写要和实际一致 string fontResourceName = "WpfApp5.FNT.BTITRBD.TTF"; using Stream fontStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(fontResourceName); if (fontStream == null) { // 若流为空,可执行下方代码打印所有嵌入资源名,确认正确的资源名写法 // string[] allResourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames(); // foreach (string name in allResourceNames) Console.WriteLine(name); throw new FileNotFoundException("未找到嵌入的字体资源", fontResourceName); } // 将字体流写入系统临时目录 string tempFontPath = Path.Combine(Path.GetTempPath(), "BTITRBD.TTF"); if (!File.Exists(tempFontPath)) { using FileStream tempFs = File.Create(tempFontPath); fontStream.CopyTo(tempFs); } // 加载字体到Stimulsoft字体集合 StiFontCollection.AddFontFile(tempFontPath);
后续操作
在Stimulsoft报表设计器中,将需要使用该字体的文本控件字体设置为B Titr即可,与你XAML中引用的字体名保持一致。
旧方案失败原因
- 第一个方案使用pack URI失败:
StiFontCollection.AddFontFile是面向本地文件系统的API,不支持WPF专属的pack资源路径格式,所以抛出路径格式不支持的异常 - 第二个方案失败:
GetManifestResourceStream返回的是资源流对象,直接调用ToString()不会得到文件路径,只会返回类名;若流为空则说明你填写的资源名和实际嵌入的资源名不匹配,可通过上述代码中打印所有资源名的方式排查正确名称
内容的提问来源于stack exchange,提问作者user14953869
相关产品推荐
相关产品推荐

