Я скачал Neutra Text Book.otf
, и я запустил этот код:
public static final String FONT = "resources/fonts/Neutra Text Book.otf";
public static void main(String[] args) throws IOException, DocumentException {
BaseFont bf = BaseFont.createFont(FONT, "", BaseFont.EMBEDDED);
String[] encoding = bf.getCodePagesSupported();
for (int i = 0; i < encoding.length; i++) {
System.out.println(encoding[i]);
}
}
Я получил следующий вывод:
1252 Латинский 1
1253 Греческий
Это может объяснить полученную ошибку.Это означает, что поддерживаются "Cp1252"
и "Cp1253"
.Если вы хотите использовать символы, которые не известны в этих кодовых страницах, эти символы не будут отображаться.
При попытке выполнить IDENTITY_H
не возникло проблем: iText был достаточно умен, чтобы сопоставить доступные символы сих значение Unicode.Так что же не так?
Мне удалось воспроизвести упомянутую вами проблему, изменив следующую строку:
BaseFont bf = BaseFont.createFont(FONT, "", BaseFont.EMBEDDED);
На эту строку:
BaseFont bf = BaseFont.createFont("neutratext-lightalt", "", BaseFont.EMBEDDED);
Ошибка, которую выполучить не означает, что у вас неправильная кодировка, как вы изначально думалиЭто просто означает, что "neutratext-lightalt"
нельзя использовать в качестве параметра при создании объекта BaseFont
.(Кстати: когда я проверил имя шрифта "Neutra Text Book.otf"
, в результате я получил "NeutraText-Book"
, а не "neutratext-lightalt"
.)
Чтобы решить проблему, нужно что-то вроде этого:
public static final String FONT = "resources/fonts/Neutra Text Book.otf";
BaseFont bf = BaseFont.createFont(FONT, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Я знаю, что вы зарегистрировали шрифты с FontFactory
, но когда вы это сделаете, вы должны получить объект Font
из этого FontFactory
, используя метод FontFactory.getFont()
, а не используяметод BaseFont.createFont()
.
Обновление:
В комментариях ФП утверждается, что предлагаемое решение не работает.
Следующееснимок экрана должен быть достаточным доказательством того, что это утверждение неверно: