Первый вопрос: как вы определяете Бравуру и Калибри?Эти шрифты не являются частью стандартной установки Ghostscript, поэтому они должны быть добавлены некоторым образом, возможно, через fontconfig (в Linux), но я вижу, что вы используете Windows (из пути).Как вы добавили шрифты?
Теперь вы (опять же из сообщений обратного канала) загружаете шрифты TrueType и используете их в качестве замены отсутствующих шрифтов PostScript.Это нестандартная функция, поэтому Ghostscript приходится много гадать, чтобы попытаться создать шрифт Type 42 (шрифт PostScript с контурами TrueType) из шрифта TrueType.Нет никаких гарантий, что все получится правильно, хотя в наши дни это довольно хорошо.
Кстати, это не имеет ничего общего с Unicode: -)
В PostScript вы используете символкод для каждого символа, который вы хотите отобразить.В вашем случае вы использовали от 0x40 (@) до 0x4C (L) последовательно.При рендеринге глифа интерпретатор берет код символа и ищет кодировку в этой позиции.Обратите внимание, что ваши массивы кодирования содержат только записи от 0x41 до 0x47, поэтому коды от 0x48 до 0x4C будут неопределенными.
Давайте подумаем о вашем TextFont, то есть Calibri.В позиции 0x41 в кодировке у вас есть глиф с именем «Scaron».Поэтому интерпретатор обращается к словарю CharStrings со шрифтом.Словарь CharStrings содержит пары ключ / значение, ключ (в данном случае) - это имя, а значение - исполняемая программа, определяющая способ визуализации глифа.
Таким образом, интерпретатор ищет ключ с именем /Scaron в словаре CharStrings, а затем выполняет связанную с ним программу.Если он не может найти ключ / Scaron, он ищет ключ /.notdef (для всех шрифтов требуется , чтобы иметь .notdef) и выполняет его вместо этого.
У вас естьна самом деле не сказал, что вы выходите.Я предполагаю, что есть проблема, потому что вы опубликовали вопрос (который, кажется, не содержит никаких реальных вопросов ....), но вы не сказали, что это такое.Если вместо ожидаемого глифа вы получаете пустые прямоугольники, то это потому, что интерпретатор выполняет /.notdef, который для шрифтов TrueType часто является прямоугольником (шрифты PostScript часто имеют полностью пустой .notdef, но оба типа шрифтов могут иметь все, что ониwant)
В этом случае проблема в том, что вы используете имя глифа (например, / muscialnote), которого нет в словаре CharStrings.Если шрифт TrueType не имеет таблицы POST (в большинстве случаев нет), то это неудивительно, потому что /icalnote - это очень нестандартное имя для глифа.
Если я добавлю Calibri в fontmap.GS и затем сделаю:
%!
/Calibri findfont /CharStrings get {== ==} forall
Тогда я вижу много записей вида:
0 / _6756 0 / _6689
это сопоставление имен (например, /_6576) к TrueType GID.При использовании шрифта TrueType Ghostscript необходим GID, чтобы он мог найти программу глифа в шрифте из таблицы GLYF.При определении шрифта TrueType для использования в качестве типа 42, это нечто, что Ghostscript должен попытаться создать для себя (настоящий шрифт Type 42 определен с этим словарем как часть шрифта).То, как он этого добивается, является эвристическим, то есть он много угадывает.
В этом случае GID равен 0, что является зарезервированным GID TrueType для глифа .notdef, поэтому все эти имена будут сопоставлены с .notdef.
Я также вижу ряд записей, таких как:
4 / A
Это (очевидно) глифы, которые вы можете использовать, в данном случае карты name / Aв GID 4. При проверке выходных данных нет названия «quarternote», «музыкальная нота» и т. д. Существует Scaron, поэтому я ожидаю, что ваш символ «@» будет отображаться как заглавная буква S с акронитным акцентом.Оставшиеся глифы будут отображаться как пустые квадраты или вообще ничего.Тестирование здесь показывает (интересно) прямоугольник с вопросительным знаком в нем.
Теперь может случиться так, что шрифт Calibri содержит нужные глифы, если он есть, то, боюсь, единственный способ получить к ним доступ (из PostScript) - это определить имя, которое Ghostscript связывает с глифом.То же самое верно и для шрифта Bravura.
Небольшое программирование на PostScript (кажется, вы более чем компетентны в написании этого) позволит вам извлечь словарь CharStrings из шрифта, выполнить итерацию по нему и создатьмассив всех имен, которые имеют ненулевое значение.Затем вы можете распечатать страницу (возможно, много страниц), где вы печатаете именной глиф из шрифта, и под ним выведите имя, связанное с этим глифом.Вот ваша карта, теперь вы можете создать кодировку, которая отображает имя глифа на код символа, который вы хотите использовать в своей программе PostScript для рисования этого глифа.
FWIW, когда я пытаюсь использовать Bravura (который является OpenTypeшрифт, а не шрифт TrueType) Я получаю синтаксическую ошибку при загрузке шрифта.То же самое для BravuraText.