[python3]フォントのグリフIDを取得する
![202411280200421_533x319 202411280200421_533x319](https://quicktimer.cocolog-nifty.com/icefloe/images/202411280200421_533x319.png)
こんな感じで
フォントの文字情報を取得してHTML表示します
サンプルコード
行番号 | ソース |
---|---|
001 | #!/usr/bin/env python3 |
002 | # coding: utf-8 |
003 | import sys |
004 | import os |
005 | from fontTools.ttLib import TTFont |
006 | from fontTools.ttLib import TTCollection |
007 | import unicodedata |
008 | |
009 | |
010 | ARG_QUERY = sys.argv |
011 | STR_FONT_FILE_PATH = str(ARG_QUERY[1]) |
012 | ARG_INPUT_STRING = str(ARG_QUERY[2]) |
013 | NORMALIZED_STRING = unicodedata.normalize("NFC", ARG_INPUT_STRING) |
014 | |
015 | #テスト用 |
016 | #STR_FONT_FILE_PATH = "/path/to/some/font.otf" |
017 | #ARG_INPUT_STRING="美しい日本語" |
018 | |
019 | PATH_DESKTOP = os.path.join(os.path.expanduser("~"), "Desktop") |
020 | PATH_FILENAME = os.path.basename(STR_FONT_FILE_PATH) |
021 | PATH_BASE_FILENAME = os.path.splitext(PATH_FILENAME)[0] |
022 | STR_SAVE_TEXT_FILENAME = f"{PATH_BASE_FILENAME}.txt" |
023 | PATH_OUTPUT_FILE = os.path.join(PATH_DESKTOP,STR_SAVE_TEXT_FILENAME) |
024 | |
025 | def 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 | |
077 | def 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) |
135 | EXTENSION_LOWER = extension.lower() |
136 | if EXTENSION_LOWER == ".ttc": |
137 | FUNC_TTC(STR_FONT_FILE_PATH) |
138 | elif EXTENSION_LOWER == ".otc": |
139 | FUNC_TTC(STR_FONT_FILE_PATH) |
140 | elif EXTENSION_LOWER == ".otf": |
141 | FUNC_TTF(STR_FONT_FILE_PATH) |
142 | elif EXTENSION_LOWER == ".ttf": |
143 | FUNC_TTF(STR_FONT_FILE_PATH) |
144 | |
AppleScriptで生成しました |
| 固定リンク
「Fonts Python」カテゴリの記事
- [Font]OSにインストールしていないフォントのイメージ描画(日本語フォント向き 文字入力)(2024.12.16)
- [Font]OSにインストールしていないフォントのイメージ描画(カタカナ)(2024.12.16)
- [Font]OSにインストールしていないフォントのイメージ描画(ひらがな)(2024.12.16)
- [Font]OSにインストールしていないフォントのイメージ描画(英数)(2024.12.16)
- [python3]フォントのグリフIDを取得する(2024.11.28)