为有中文需求的客户提供多渠道中文技术支持.

Wed Sep 03, 2025 7:31 am

我在docker下执行条形码代码第一次执行时会提示如下的运行时字体错误, 但第二次再执行时又不报错了, 请求帮助分析原因, 谢谢:
System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation.
---> System.InvalidOperationException: Cannot found font installed on the system.
at spr粗.ꘖ(String A_0, spr휣 A_1, String A_2)
at spr絃.퓉(String A_0, Single A_1, spr휣 A_2, String A_3, spr휣 A_4)
at spr絃.퓉(String A_0, Single A_1, spr휣 A_2, String A_3)
at spr絃.퓉(String A_0, Single A_1, spr휣 A_2)
at sprꩲ.퓉(String A_0, Single A_1, spr휣 A_2)
at sprꩲ.퓉(String A_0, Single A_1)
at spr帄..ctor()
at Spire.Barcode.BarCodeGenerator..ctor(IBarcodeSettings settings)
at Program.<Main>$(String[] args)
at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)
--- End of inner exception stack trace ---
at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span`1 copyOfArgs, BindingFlags invokeAttr)
at System.Reflection.MethodBaseInvoker.InvokeWithOneArg(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)

Code: Select all
var bs = new Spire.Barcode.BarcodeSettings();
bs.Type = Spire.Barcode.BarCodeType.Code39;
bs.Data = "*ABC 12345* ";
var bg = new Spire.Barcode.BarCodeGenerator(bs);
var skimage = bg.GenerateImage();
var data = skimage.Encode(SKEncodedImageFormat.Png, 100);
var stream = File.OpenWrite("/output/Spire.Barcode.png");
data.SaveTo(stream);
stream.Dispose();
skimage.Dispose();
Console.WriteLine("Spire.Barcode create!");


另外, 下面是帮助中的代码, 其中的HeiseiMinchoW3和TimesRoman字体在运行时也有类似的错误, 这两个需要安装某个字体集吗?
Code: Select all
var pdf = new PdfDocument();
var page = pdf.Pages.Add();
var standardFont = new PdfFont(PdfFontFamily.TimesRoman, 12f);
page.Canvas.DrawString("Hello China, 你好 中國", standardFont, PdfBrushes.Black, new PointF(10, 10));
var trueTypeFont = new PdfTrueTypeFont("甜蜜早安吻", 12f, PdfFontStyle.Regular, true);
page.Canvas.DrawString("Hello China, 你好 中国", trueTypeFont, PdfBrushes.Black, new PointF(10, 30));
var cjkFont = new PdfCjkStandardFont(PdfCjkFontFamily.HeiseiMinchoW3, 12f);
page.Canvas.DrawString("你好 中國", cjkFont, PdfBrushes.Black, new PointF(10, 50));
pdf.SaveToFile("/output/Spire.Pdf.pdf", Spire.Pdf.FileFormat.PDF);
Console.WriteLine("Spire.Pdf create!");


刚刚又发现,使用Microsoft YaHei Mono字体,中文部分显示成了方块(该字体已经安装, 在spire.Doc和Pdf下都能正常显示), 而甜蜜早安吻字体下英文和中文显示正常!
Code: Select all
var trueTypeFont = new PdfTrueTypeFont("甜蜜早安吻", 12f, PdfFontStyle.Regular, true); page.Canvas.DrawString("Hello China, 你好 中国!", trueTypeFont, PdfBrushes.Black, new PointF(10, 30));
var trueTypeFont2 = new PdfTrueTypeFont("Microsoft YaHei Mono", 12f, PdfFontStyle.Regular, true); page.Canvas.DrawString("Hello China, 你好 中國!", trueTypeFont2, PdfBrushes.Black, new PointF(10, 50));

xyzxyzxyz
 
Posts: 64
Joined: Fri Dec 27, 2024 1:10 pm

Wed Sep 03, 2025 10:32 am

您好,

Spire产品需要从使用环境读取相应字体,当文档使用到的字体未安装,会优先找能支持相同字形的字体替代,如果替代字体没有找到则会呈现方块乱码等或者抛出报错。为了避免由于缺少字体导致的问题,有以下两种方案:
1. 手动安装字体
手动将使用的所有字体安装到系统目录,如linux /usr/share/fonts/,并确保这些字体具有读取权限,你可以将windows 字体库的常用字体都复制过去,以保证常用的字体效果。
2. 指定自定义字体路径
将项目中使用的字体拷贝到测试环境上的自定义文件夹中,然后使用代码指定字体文件夹:
Code: Select all
String fontpath = @"fonts/";     //fonts为字体文件夹包括使用字体的.tff 文件
Spire.Pdf.PdfDocument.LoadCustomFontFolder(fontpath);
Spire.Doc.Document.SetGlobalCustomFontsFolders(fontpath);
Sincerely,
Talia
E-iceblue support team
User avatar

talia.liu
 
Posts: 341
Joined: Mon Apr 14, 2025 3:33 am

Return to 中文技术支持

cron