为什么FontFactory.GetFont(“已知字体名称”,floatSize)不起作用?

如果我说:

var georgia = FontFactory.GetFont("Georgia Regular", 10f); 

它不起作用。 当我检查变量UNDEFINED的状态时,它将其Family属性设置为值UNDEFINED并将其FamilyName属性设置为Unknown

它只有在我实际加载并注册字体文件然后得到它时才有效:

 FontFactory.Register("C:\\Windows\\Fonts\\georgia.ttf", "Georgia"); var georgia = FontFactory.GetFont("Georgia", 20f); 

这是为什么?

iText是用Java编写的,这意味着它与平台无关。 它附带14个AFM文件,其中包含14种标准类型1字体的指标(4种口味的Helvetica,4种口味的Times Roman,4种口味的Courier,Symbol和ZapfDingbats)。

只要需要其他字体,就需要通过将路径传递给字体目录或实际字体的路径来注册字体文件。 Linux上的字体目录与Windows上的字体目录不同(Linux上没有“C:/ Windows / fonts”)。 还有一个方法registerDirectories() ,它查看您当前正在使用的操作系统,并注册所有“常见的嫌疑人”(iText根据操作系统猜测字体路径)。 这种方法很昂贵:它会记录它找到的所有字体,这会花费时间和内存。

注册字体后,您可以向FontFactory询问已注册的名称。 这显示在FontFactoryExample中 。 您会注意到getRegisteredFonts()方法和getRegisteredFamilies()方法之间的区别。

附加说明:原始问题是关于用C#编写的iTextSharp。 iTextSharp从Java移植,并尽可能保持尽可能接近用Java编写的原始版本。 然而,同样的理由适用:如果iTextSharp必须扫描fonts目录,启动应用程序会慢得多。 在大多数应用程序中,您只需要少量字体; 注册Windows字体目录中可用的所有字体将是过度的。