Рендеринг шрифтов в Java: java.awt.Font работает некорректно

До сих пор я сталкивался с тем, что я могу назвать «ошибкой» в библиотеках рендеринга шрифтов Oracle в Java. В некоторых шрифтах (например, в шрифтах, встроенных в файлы PDF) используются некоторые неправильные коды символов и с ними связаны глифы.

При попытке получить вектор глифа с использованием метода java.awt.Font.createGlyphVector в таких случаях (коды символов 9, 10 и 13, которые принадлежат табуляции, возврату каретки и новой строке) правильный глиф не возвращается, но он работает для всего остального.

Я отследил проблему с реализацией CMap на Java, код которой похож на этот:

         char getGlyph(int charCode) {
             if (charCode < 256) {
                 if (charCode < 0x0010) {
                     switch (charCode) {
                     case 0x0009:
                     case 0x000a:
                     case 0x000d: return CharToGlyphMapper.INVISIBLE_GLYPH_ID;
                     }
                 }
                 return (char)(0xff & cmap[charCode]);
             } else {
                 return 0;
             }
         }

Итак, мой вопрос:

  • Это действительно ошибка?
  • Кто-нибудь знает, как это обойти?
  • Есть ли способ извлечь данные CMAP из шрифтов истинного типа, чтобы я мог сопоставить символы (кодовые точки) с кодами глифов?

person Iravanchi    schedule 02.04.2012    source источник


Ответы (1)


Я уверен, что вы уже выяснили проблему, но тем, кто наткнется на эту страницу в будущем, я бы порекомендовал библиотека sfntly. Это бесплатная библиотека Java от Google, которая позволяет редактировать шрифты на основе sfnt, с которыми очень легко работать. Если вы решили свою проблему другим способом, сообщите нам об этом. Спасибо.

person David Watson    schedule 11.05.2012