fonttools для чтения данных cmap - PullRequest
0 голосов
/ 27 августа 2018

фон:

используя fonttools, я хочу изменить символ, такой как "ل" (U + 0644), до его начальной формы "ﻟ" (U + FEDF). Я могу сделать это в 4 шага:

  1. с помощью fonttools, сохранить данные шрифта в формате xml и затем проанализировать их

    font = TTFont(fontPath) font.saveXML("tempfont.xml")

  2. найти имя, связанное с U + 0644, в таблице cmap (предположим, имя "isolam")

  3. в таблице GSUB найдите таблицу для «init» и найдите запись с атрибутом «in» для «isolam», а затем прочитайте его атрибут «out» (предположим, что это «initlam»)

  4. и, наконец, найдите имя "initlam" в таблице cmap и получите кодовую точку

этот процесс очень медленный, и я думаю, что это потому, что xml-файл записывается на жестком диске, а затем читается оттуда, а также есть много итераций по xml-файлу.

вопрос:

вместо сохранения XML-файла я сейчас пытаюсь напрямую работать с объектом TTFont. но у меня проблемы с чтением кодов из cmap.

font = TTFont(fontPath)
cmap = font['cmap'].tables

# there are 3 cmap tables for different platform in the font i am using, but
# for now i'm using cmap[2] which has platformId = 3 and is for windows.
print(cmap[2].data)

но результат кажется gibberish.it очень длинный, поэтому я просто покажу некоторые из них:

Ь '\ x00` \ x00 @ \ x00 \ x05 \ x00 \ x00 \ x00 + \ x00 / \ X009 \ x00: \ x00> \ x00 [\ x00] \ x00 {\ x00} \ x00 \ Xab \ x00 \ Xbb \

теперь я ожидал, что он вернет словарь с кодовыми точками в качестве ключей и имена в качестве значений, или, может быть, список кортежей.

так как я могу получить доступ к данным cmap в понятном формате?

или как я могу получить имя глифа, учитывая соответствующую кодовую точку и наоборот?

1 Ответ

0 голосов
/ 04 декабря 2018

Чтобы отобразить фактический символ на имя в таблице cmap , вы можете сделать что-то вроде этого:

font = TTFont(fontPath)
ch_to_name = {} # key will be the codepoint in hex, value will be name

cmap = font["cmap"]
for ch, name in cmap.getBestCmap().items():
    ch_to_name["{:04X}".format(ch)] = name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...