iText - 如何识别可以打印字符串中所有字符的单个字体?

时间:2014-02-25 05:35:16

标签: itext

这是iText 2.1.6。

我有一个包含不同语言字符的字符串,我想为它选择一个字体(在已注册的字体中),其中包含所有这些字符的字形。我想避免使用不同字体打印字符串中不同子串的情况,如果我已经有一种字体可以显示所有这些字形。

如果没有这样的单一字体,我仍然想选择覆盖字符串中字符的最小字体集。

我知道FontSelector,但它似乎没有尝试为给定的文本找到最小的字体集。正确?我该怎么做?

1 个答案:

答案 0 :(得分:2)

iText 2.1.6已过时。请停止使用它:http://itextpdf.com/salesfaq

我在一个中看到两个问题:

是否有包含所有语言的所有字符的字体?

请允许我解释为什么这是不可能的:

  • Unicode中有1,114,112个代码点。并非所有这些代码点都被使用,但可能的不同字形数量巨大。
  • 简单字体只包含256个字符(每个字体1个字节),复合字体使用0到65,535之间的CID。

65,535比1,114,112小得多,这意味着在技术上不可能有一个包含所有可能字形的字体。

FontSelector找不到最小的字体集!

FontSelector不会寻找最小的字体集。您必须告诉FontSelector您要使用哪些字体,以哪种顺序!假设你有这段代码:

FontSelector selector = new FontSelector();
selector.addFont(font1);
selector.addFont(font2);
selector.addFont(font3);

在这种情况下,FontSelector将首先查看每个特定字形的font1。如果它不存在,则会查看font2等等......显然font1font2font3将具有相同字符的不同字形。例如:a, a a 。将使用哪个字形取决于您添加字体的顺序。

底线:

选择涵盖所需字形的各种字体,并将其添加到FontSelector实例中。不要指望找到包含您需要的所有字形的单一字体。