0

我正在使用 XMLWorker 来解析 html。我在样式中定义的字体一直存在一些问题。例如,像这样简单的事情:

<span style="font-family: Garamond">Foo Garamond</span>

没有工作。

我使用它作为我的 css 应用程序:

CssAppliers ca = new CssAppliersImpl();

为了检查是否是 html 的编码问题或任何其他问题......,我自己实现了 IFontProvider:

class MyFontProvider : IFontProvider
    {
        public bool IsRegistered(string fontname)
        {
            return false;
        }

        public Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color)
        {
            var font = FontFactory.GetFont(fontname, encoding, embedded, size, style, color);
            return new Font(font);
        }
    }

然后,这个:

CssAppliers ca = new CssAppliersImpl(new MyFontProvider());

太好了!!!,效果很好!!!,如果我将这个传递给构造函数:

CssAppliers ca = new CssAppliersImpl(new XMLWorkerFontProvider());

也有效。

因此,很明显字体提供程序的默认实现不起作用。我将其定义为:

CssAppliers ca = new CssAppliersImpl();

or 

CssAppliers ca = new CssAppliersImpl(new FontFactoryImp());

,而且都没有工作。

我的问题是:

  1. 这有什么可能的解释?
  2. 区别XMLWorkerFontProviderFontFactoryImp实现
4

1 回答 1

3

FontFactoryImp是 iText/iTextSharp 核心的一部分。它提供对所需核心 14 字体的访问,并允许您选择性地注册其他字体文件并为其命名。但除非您手动注册字体文件,否则它只会返回“默认”字体。

XMLWorkerFontProvider是 的一部分,XMLWorker实际上是 的子类FontFactoryImp。两者最大的区别在于,如果你在它上面使用空的构造函数,XMLWorkerFontProvider它实际上会调用base.RegisterDirectories()注册系统字体文件夹中的每种字体。根据您拥有的字体数量,这可能会很昂贵,这就是默认版本不这样做的原因。

于 2013-11-13T15:14:09.717 回答