【问题标题】:Why doesn't FontFactory.GetFont("Known Font Name", floatSize) work?为什么 FontFactory.GetFont("Known Font Name", floatSize) 不起作用?
【发布时间】:2014-07-23 08:03:37
【问题描述】:

如果我说:

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

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

它只有在我实际加载并注册字体文件然后像这样获取它时才有效:

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

为什么会这样?

【问题讨论】:

  • 我不知道这个功能,但请注意“Georgia Regular”不是默认的Windows字体名称。如果确实是字体名称,请确保已安装它。
  • 我做到了。事实上,我是从 Windows 安装的 Fonts 目录中复制名称的。

标签: c# itextsharp


【解决方案1】:

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

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

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

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

【讨论】:

  • 我在哪里声称“Georgia”是一个字体系列?你没有看到“Georgia Regular”作为第一个 sn-p 中的参数吗?
  • 您的代码令人困惑。您在第一个 sn-p 中使用“Georgia Regular”,并在第二个 sn-p 中定义别名“Georgia”。我没有看到您在任何地方检查实际名称(使用getRegisteredFonts() 方法)。我会删除评论,但你肯定不能否认答案是正确且有帮助的。
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-13
  • 2021-04-04
  • 1970-01-01
相关资源
最近更新 更多