iText 5 BaseFont. Создать не удалось, ошибка кодирования не распознана - PullRequest
0 голосов
/ 12 июня 2018

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

Dim fontDir = Server.MapPath("~/Fonts")
FontFactory.RegisterDirectory(fontDir)
Dim myFontBase = BaseFont.CreateFont("neutratext-lightalt", BaseFont.IDENTITY_H, True)

Точная ошибка гласит:

"Шрифт 'neutratext-lightalt' с 'Identity-H' не распознан"

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

1 Ответ

0 голосов
/ 13 июня 2018

Я скачал 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().

Обновление:

В комментариях ФП утверждается, что предлагаемое решение не работает.

Следующееснимок экрана должен быть достаточным доказательством того, что это утверждение неверно:

enter image description here

...