Java: использование OTF-шрифтов, проверка наличия определенного шрифта - PullRequest
1 голос
/ 04 января 2011

Я работаю над Java-программой, которая проверяет файлы XML на наличие символов, которые не имеют глиф-представления в определенном шрифте (с Font.canDisplay())

Файлы XML должны быть в кодировке utf-8 по умолчанию. Объекты в XML-коде анализируются и преобразуются в значение char / int, прежде чем они проверяются canDisplay.

Для обеспечения гибкости программа принимает два параметра:

  • Имя файла XML-файла
  • Название шрифта

Я хотел бы проверить, существует ли указанный шрифт в системе, поскольку в противном случае нет смысла использовать canDisplay.

Насколько я понимаю, Java 6 поддерживает OTF-шрифты. Однако, когда я использую getAvailableFontFamilyNames() из java.awt. *, Он, по-видимому, перечисляет только шрифты TTF.

Я хотел бы знать, есть ли способ проверить, существует ли шрифт OTF (заданный его именем). И вообще, если использовать шрифты OTF в Java на Windows - это практично.

Цель этого: мы используем XEP для renderX, чтобы конвертировать xsl-fo в PDF-файлы. Я хотел бы иметь возможность определить, содержит ли файл xsl-fo символы, которые невозможно отобразить определенным шрифтом. XEP не выдает предупреждение и просто печатает пустые места вместо глифов. Что еще хуже, это то, что он, кажется, запутывает его вычисление интервала для выровненного текста, поэтому строки с этими пустыми местами длиннее или короче, чем текущий размер выровненного блока.

Я знаю, что есть определенные оговорки, например, Я должен был бы проверить, должен ли символ отображаться обычным, курсивом или полужирным шрифтом, а затем проверить наличие глифа в этом конкретном шрифте. Но сейчас достаточно более общего подхода, который проверяет, существует ли вообще символ для символа в шрифте обычного шрифта.

1 Ответ

0 голосов
/ 16 ноября 2011

Я тоже получаю шрифты .OTF.

    GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment();
    for (String ffname : genv.getAvailableFontFamilyNames()) {
        System.out.println(ffname);
    }

Таким образом, либо проблема связана с конкретным файлом шрифта, имя шрифта отличается от имени файла, либо необходимо добавить параметр Locale для getLocalGraphicsEnvironment.

Для символов латинского алфавита с диакритическими знаками может помочь нормализация Юникода (текст Java) для получения основного буквенного кода + кода комбинирования диакритических знаков. Что-то вроде:

java.text.Normalizer.normalize(letter, java.text.Normalizer.Form.NFKD).replaceAll("\\p{M}", "");
...