フォント ファイルからすべてのグリフを個別の SVG として特定の場所にエクスポート し 画像ファイルを作成

2024年10月5日

FontForge

FontForge Open Source Font Editor

スクリプト出力用のサブディレクトリy:\svgを作成し、このサブディレクトリをスクリプトに配置する必要があります
FontForge メニューから: ファイル/開く
[ファイル] / [スクリプトの実行] を使用し、ラジオボックス FF をオンにして、次のように入力します。


SelectAll()
UnlinkReference()
Export("y:/svg/%n-%e.svg")

fonttools

fonttools · PyPI

from fontTools.ttLib import TTFont
import os
from textwrap import dedent
from fontTools.pens.svgPathPen import SVGPathPen

# フォルダの作成
output_path = "y:/output_svg/"
if not os.path.exists(output_path):
    os.mkdir(output_path)

# GlyphをSVGに変換
def save_all_glyph_as_svg(font):    
    glyph_set = font.getGlyphSet()
    cmap = font.getBestCmap()

    # 標準の ASCENT と DESCENT を head テーブルから取得
    ascender = font['head'].yMax  # 標準のASCENT値
    descender = font['head'].yMin  # 標準のDESCENT値
    height = ascender - descender  # ASCENTとDESCENTの範囲で高さを設定

    for c in cmap:
        glyph_name = cmap[c]
        glyph = glyph_set[glyph_name]
        svg_path_pen = SVGPathPen(glyph_set)
        glyph.draw(svg_path_pen)

        # pathデータを取得
        path_data = svg_path_pen.getCommands()

        # pathデータが空の場合はスキップ
        if not path_data.strip():
            print(f"Skipping empty glyph for codepoint: {c}")
            continue

        width = glyph.width

        # SVGコンテンツを生成
        content = dedent(f'''\
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 {-ascender} {width} {height}">
                <g transform="scale(1, -1)">
                    <path d="{path_data}"/>
                </g>
            </svg>
        ''')

        # SVGファイルを出力(ファイル名を "0xコードポイント.svg" の形式に変更)
        with open(output_path + "0x{:04x}.svg".format(c), 'w') as f:
            f.write(content)

# フォントファイルを読み込み、SVG出力
font = TTFont('y:/Regular.ttf')
save_all_glyph_as_svg(font)

参考

TTFの全グリフをPNGにしてみる #Python – Qiita

10進数のファイル名を16進数にする

import os
import shutil, sys

input_folder = 'y:/input_png'
output_folder = 'y:/input_svg'
for filename in os.listdir(input_folder):
    if filename.endswith(('.svg')):
        input_path = os.path.join(input_folder, filename)
        basename_without_ext = os.path.splitext(os.path.basename(filename))[0]

#        output_path = os.path.join(output_folder,"{:#0{width}x}".format(int(basename_without_ext), width=6))+'.svg'
#
        output_path = os.path.join(output_folder,"{:#x}".format(int(basename_without_ext)))+'.svg'
        new_path = shutil.copy(input_path,output_path )

font

Posted by eightban