« 文字列:濁音の分割 | トップページ | [Windows]Acrobatインストール時トラブル対処手順(Limited Access Repair toolを追加) »

[python3]フォントのグリフIDを取得する

202411280200421_533x319

yugothb.ttc.html


こんな感じで
フォントの文字情報を取得してHTML表示します

ダウンロード - dumpgid.zip




サンプルコード

サンプルソース(参考)
行番号ソース
001#!/usr/bin/env python3
002# coding: utf-8
003import sys
004import os
005from fontTools.ttLib import TTFont
006from fontTools.ttLib import TTCollection
007import unicodedata
008
009 
010ARG_QUERY = sys.argv
011STR_FONT_FILE_PATH = str(ARG_QUERY[1])
012ARG_INPUT_STRING = str(ARG_QUERY[2])
013NORMALIZED_STRING = unicodedata.normalize("NFC", ARG_INPUT_STRING)
014
015#テスト用
016#STR_FONT_FILE_PATH = "/path/to/some/font.otf"
017#ARG_INPUT_STRING="美しい日本語"
018
019PATH_DESKTOP = os.path.join(os.path.expanduser("~"), "Desktop")
020PATH_FILENAME = os.path.basename(STR_FONT_FILE_PATH)
021PATH_BASE_FILENAME = os.path.splitext(PATH_FILENAME)[0]
022STR_SAVE_TEXT_FILENAME = f"{PATH_BASE_FILENAME}.txt"
023PATH_OUTPUT_FILE = os.path.join(PATH_DESKTOP,STR_SAVE_TEXT_FILENAME)
024
025def FUNC_TTF(STR_FONT_FILE_PATH):
026    READ_FONT = TTFont(STR_FONT_FILE_PATH)
027    with open(PATH_OUTPUT_FILE, 'w', encoding='utf-8') as file:
028        print(f"COLLECTION:1")
029        print(f"パス: {STR_FONT_FILE_PATH}")
030        file.write(f"パス: {STR_FONT_FILE_PATH}\n")
031        STR_FILENAME = os.path.basename(STR_FONT_FILE_PATH)
032        print(f"ファイル名: {STR_FILENAME}\n")
033        file.write(f"ファイル名: {STR_FILENAME}\n\n")
034        
035        FONT_DICT = READ_FONT["name"].names
036        for item in FONT_DICT:
037            if item.nameID == 1:
038                FONTFAMILY_NAME = item.toUnicode()
039                break
040
041        print(f"FontFamily名: {FONTFAMILY_NAME}")
042        file.write(f"FontFamily名: {FONTFAMILY_NAME}\n")
043    
044        for item in FONT_DICT:
045            if item.nameID == 6:
046                POSTSCRIPT_NAME = item.toUnicode()
047                break
048
049        print(f"PostScript名: {POSTSCRIPT_NAME}")
050        file.write(f"PostScript名: {POSTSCRIPT_NAME}\n")
051        
052        GLYPH_SET = READ_FONT.getGlyphSet()
053        print(f"収録文字数: {len(GLYPH_SET)}")
054        file.write(f"収録文字数: {len(GLYPH_SET)}\n\n")
055
056        STR_HEADER="NO\t文字\tユニコード\tグリフ名\tグリフID\tUTF8\t文字幅"
057        print(f"{STR_HEADER}")
058        file.write(f"{STR_HEADER}\n")
059
060        for INDEXNO, ITEMCHAR in enumerate(NORMALIZED_STRING):
061            DEC_CODEPOINT = ord(ITEMCHAR)
062            BYTE_UTF8 = ITEMCHAR.encode('utf-8')
063            HEX_UTF8 = BYTE_UTF8.hex().upper()
064            HEX_CODEPOINT = hex(DEC_CODEPOINT)
065            HEX_CODE = HEX_CODEPOINT[2:].upper()
066            STR_GLYPHNAME = READ_FONT.getBestCmap().get(DEC_CODEPOINT, "missing value")
067            NUM_GLYPHID = READ_FONT.getGlyphID(STR_GLYPHNAME)if STR_GLYPHNAME != "missing value" else -1
068            ITEM_GLYPH = READ_FONT.getGlyphSet()[STR_GLYPHNAME]
069            NUM_GLYPH_WIDTH = ITEM_GLYPH.width
070            print(f"{INDEXNO}\t{ITEMCHAR}\t{HEX_CODE}\t{STR_GLYPHNAME}\t{NUM_GLYPHID}\t{HEX_UTF8}\t{NUM_GLYPH_WIDTH}")
071            file.write(f"{INDEXNO}\t{ITEMCHAR}\t{HEX_CODE}\t{STR_GLYPHNAME}\t{NUM_GLYPHID}\t{HEX_UTF8}\t{NUM_GLYPH_WIDTH}\n")
072            
073
074        print(f"\n\n")
075        file.write(f"\n\n")
076        
077def FUNC_TTC(STR_FONT_FILE_PATH):
078
079    with open(PATH_OUTPUT_FILE, 'w', encoding='utf-8') as file:
080        FONT_COLLECTION = TTCollection(STR_FONT_FILE_PATH)
081        NUM_CNT_ONT_COLLECTION = len(FONT_COLLECTION.fonts)
082        print(f"COLLECTION:{NUM_CNT_ONT_COLLECTION}")
083        print(f"パス: {STR_FONT_FILE_PATH}")
084        file.write(f"パス: {STR_FONT_FILE_PATH}\n")
085        STR_FILENAME = os.path.basename(STR_FONT_FILE_PATH)
086        print(f"ファイル名: {STR_FILENAME}")
087        file.write(f"ファイル名: {STR_FILENAME}\n\n")
088        
089        for ITEM_FONT in FONT_COLLECTION.fonts:
090
091            FONT_DICT = ITEM_FONT["name"].names
092            for item in FONT_DICT:
093                if item.nameID == 1:
094                    FONTFAMILY_NAME = item.toUnicode()
095                    break
096
097            print(f"FontFamily名: {FONTFAMILY_NAME}")
098            file.write(f"FontFamily名: {FONTFAMILY_NAME}\n")
099            
100            for item in FONT_DICT:
101                if item.nameID == 6:
102                    POSTSCRIPT_NAME = item.toUnicode()
103                    break
104
105            print(f"PostScript名: {POSTSCRIPT_NAME}")
106            file.write(f"PostScript名: {POSTSCRIPT_NAME}\n")
107                
108            GLYPH_SET = ITEM_FONT.getGlyphSet()
109            print(f"収録文字数: {len(GLYPH_SET)}")
110            file.write(f"収録文字数: {len(GLYPH_SET)}\n\n")
111            
112            STR_HEADER="NO\t文字\tユニコード\tグリフ名\tグリフID\tUTF8\t文字幅"
113            print(f"{STR_HEADER}")
114            file.write(f"{STR_HEADER}\n")
115            
116            for INDEXNO, ITEMCHAR in enumerate(NORMALIZED_STRING):
117                DEC_CODEPOINT = ord(ITEMCHAR)
118                BYTE_UTF8 = ITEMCHAR.encode('utf-8')
119                HEX_UTF8 = BYTE_UTF8.hex().upper()
120                HEX_CODEPOINT = hex(DEC_CODEPOINT)
121                HEX_CODE = HEX_CODEPOINT[2:].upper()
122                STR_GLYPHNAME = ITEM_FONT.getBestCmap().get(DEC_CODEPOINT, "missing value")
123                NUM_GLYPHID = ITEM_FONT.getGlyphID(STR_GLYPHNAME)if STR_GLYPHNAME != "missing value" else -1
124                ITEM_GLYPH = ITEM_FONT.getGlyphSet()[STR_GLYPHNAME]
125                NUM_GLYPH_WIDTH = ITEM_GLYPH.width
126                print(f"{INDEXNO}\t{ITEMCHAR}\t{HEX_CODE}\t{STR_GLYPHNAME}\t{NUM_GLYPHID}\t{HEX_UTF8}\t{NUM_GLYPH_WIDTH}")
127                file.write(f"{INDEXNO}\t{ITEMCHAR}\t{HEX_CODE}\t{STR_GLYPHNAME}\t{NUM_GLYPHID}\t{HEX_UTF8}\t{NUM_GLYPH_WIDTH}\n")
128                
129
130            #print(f"")
131            file.write(f"\n\n")
132        
133
134_, extension = os.path.splitext(STR_FONT_FILE_PATH)
135EXTENSION_LOWER = extension.lower()
136if EXTENSION_LOWER == ".ttc":
137    FUNC_TTC(STR_FONT_FILE_PATH)
138elif EXTENSION_LOWER == ".otc":
139    FUNC_TTC(STR_FONT_FILE_PATH)
140elif EXTENSION_LOWER == ".otf":
141    FUNC_TTF(STR_FONT_FILE_PATH)
142elif EXTENSION_LOWER == ".ttf":
143    FUNC_TTF(STR_FONT_FILE_PATH)
144
AppleScriptで生成しました

|

« 文字列:濁音の分割 | トップページ | [Windows]Acrobatインストール時トラブル対処手順(Limited Access Repair toolを追加) »

Fonts Python」カテゴリの記事