Как получить имя шрифта PostScript? - PullRequest
0 голосов
/ 02 июля 2018

Я добавляю возможность вставлять шрифты Truetype в PDF-файлы, сгенерированные моим приложением, но шрифты "Sitka Text" (и его варианты "Sitka Banner", "Sitka small" и т. Д.) и "Мейрио" не вставлять.

Я считаю, что это потому, что я использую имя из объекта LOGFONT , и для этих шрифтов я должен использовать имя PostScript.

Как я могу получить имя Postscript?

Я получил таблицу 'name' с GetFontData , но результат не вернул имя, которое я мог бы использовать.

Есть ли в WINAPI метод, который дает мне это имя?

Редактировать: Я показываю своим пользователям только шрифты с разрешениями на встраивание "Редактируемые" и "Устанавливаемые" , которые я получаю с помощью методов EnumFontFamiliesEx и это CALLBACK функция.

Я также проверил NEWTEXTMETRIC ntmFlags, который показывает, что все мои шрифты - NTM_TT_OPENTYPE.

Edit2: Под "не вставлять" я имею в виду, что программы чтения PDF-файлов не отображают мой шрифт как встроенный (а Acrobat не показывает никакого текста)

Пример ошибки.

решаемые
Во-первых, я хотел бы поблагодарить Майкла Маккефа и MKL. Вы, ребята, Awesome и мне очень помогли, я проверил свой оригинальный шрифт, и он не был поврежден, и я не изменил байты шрифта, но потом я наконец заметил, что если вы вызываете GetFontData для файла (.ttc), он обрезает часть ttcf, и никакой читатель PDF не сможет понять, какой это был шрифт.

1 Ответ

0 голосов
/ 03 июля 2018

В идеале вы должны найти это в таблице «name» шрифта. Это будет nameId 0x0006 в форме, полезной для вашей платформы. Формат таблицы имен является частью спецификаций TrueType и OpenType. (Вы можете найти копию здесь Название спецификации Microsoft Typography OpenType ). В таблице может быть очень много записей, или их может быть немного. В частности, имя Postscript может присутствовать или отсутствовать в любом шрифте. Вам нужно будет просмотреть таблицу для nameID 0x0006 и форму (язык, платформа, кодировка), которую вы можете использовать. Для имен postscript вы, скорее всего, захотите, чтобы они были на английском языке в кодировке ASCII для любой платформы.

Однако по этой причине маловероятно, что шрифт не внедряется! Более распространенная причина заключается в том, что не разрешено встраивать этот шрифт. В Microsoft Typography OpenType Spec OS / 2 вы увидите поле с именем fsType. Это поле содержит флаги, указывающие, при каких обстоятельствах этот шрифт лицензирован для встраивания. Ни один авторитетный инструмент не будет встраивать или подгруппировать этот шрифт, если эти флаги указывают, что он не лицензирован для встраивания.

Я вижу, что "Sitka Text" - это шрифт MS Windows 10, свободно распространяемый окнами. Кажется маловероятным, что он не будет лицензирован для встраивания. Интересно, что инструмент, который я обычно использую для быстрого «просмотра» шрифта (Font Validator, который раньше был доступен в Microsoft Typography, но, похоже, его больше нет) говорит мне, что запись OS / 2 недействительна. То, что он указывает тип 5, а спецификация говорит, что тип 4 является последним. Для правильного ответа на запрос на встраивание потребуется доступ к полю fsType, а если формат записи неизвестен, он должен «отказоустойчиво» и отказаться от встраивания шрифта.

Так что это наиболее вероятная причина того, что шрифт не будет вставляться для вас.

...