폰트 패밀리 이름 변경 및 파일 변환 자동화 스크립트

폰트 패밀리 이름 변경 및 파일 변환 자동화 스크립트
Photo by Marek Levák / Unsplash

On this page

폰트 파일의 패밀리 이름을 변경하고, 변환된 파일들을 일괄적으로 처리하는 방법을 알아보겠습니다. 이번 포스트에서는 .otf 파일을 .woff2 파일로 변환하고, 패밀리 이름을 변경하는 스크립트를 작성합니다.

준비 사항

  1. 폴더 내의 모든 .otf 파일을 처리하도록 스크립트를 작성합니다.

fonttoolswoff2 패키지가 필요합니다. 다음 명령어로 설치할 수 있습니다:

pip3 install fonttools
sudo apt-get install woff2

스크립트 설명

1. 폰트 패밀리 이름 변경 함수

폰트 파일의 패밀리 이름을 변경하는 함수입니다. 폰트 이름의 여러 레코드를 업데이트합니다.

def change_font_family(input_path, output_path, new_family_name):
    font = TTFont(input_path)
    name_records = font['name'].names

    for record in name_records:
        if record.nameID == 1:  # Family
            record.string = new_family_name.encode('utf-16-be')
        elif record.nameID == 4:  # Full name
            record.string = new_family_name.encode('utf-16-be')
        elif record.nameID == 16:  # Preferred Family
            record.string = new_family_name.encode('utf-16-be')
        elif record.nameID == 21:  # WWS Family
            record.string = new_family_name.encode('utf-16-be')

    font.save(output_path)

2. OTF를 TTF로 변환하는 함수

OTF 파일을 TTF 파일로 변환하는 함수입니다.

def otf_to_ttf(otf_path, ttf_path):
    font = TTFont(otf_path)
    font.save(ttf_path)

3. TTF를 WOFF2로 변환하는 함수

TTF 파일을 WOFF2 파일로 변환하는 함수입니다.

def ttf_to_woff2(ttf_path, woff2_path):
    subprocess.run(["woff2_compress", ttf_path], check=True)
    base_name = os.path.splitext(ttf_path)[0]
    os.rename(base_name + ".woff2", woff2_path)

4. 폴더 내의 모든 OTF 파일을 처리하는 함수

폴더 내의 모든 .otf 파일을 처리하여 각각의 파일명 뒤에 -modified를 붙인 후, 폰트 패밀리 이름을 변경하고, otfwoff2 파일로 변환합니다.

def process_fonts():
    input_folder = os.getcwd() # 인풋 폴더설정
    for filename in os.listdir(input_folder):
        if filename.lower().endswith('.otf'):
            input_font_file = os.path.join(input_folder, filename)
            base_name = os.path.splitext(filename)[0]
            new_family_name = base_name.replace('-', ' ')

            temp_ttf = os.path.join(input_folder, f"{base_name}-temp.ttf")
            temp_otf = os.path.join(input_folder, f"{base_name}-temp.otf")
            output_otf = os.path.join(input_folder, f"{base_name}-modified.otf")
            output_woff2 = os.path.join(input_folder, f"{base_name}-modified.woff2")

            # Change font family in the OTF file
            change_font_family(input_font_file, temp_otf, new_family_name)

            # Convert OTF to TTF
            otf_to_ttf(temp_otf, temp_ttf)

            # Convert TTF to WOFF2
            ttf_to_woff2(temp_ttf, output_woff2)

            # Move the modified OTF file to the final output location
            os.rename(temp_otf, output_otf)

            # Clean up temporary TTF file
            os.remove(temp_ttf)

            print(f"Processed {filename}: OTF and WOFF2 files created with new family name '{new_family_name}'.")

실행 방법

  1. 스크립트 저장: 위 코드를 process_fonts.py 파일로 저장합니다.

스크립트 실행:

python3 process_fonts.py

필요한 패키지 설치:

pip3 install fonttools
sudo apt-get install woff2

이 스크립트를 실행하면 현재 경로 내의 모든 .otf 파일이 처리되어, 폰트 패밀리 이름이 변경된 otfwoff2 파일이 생성됩니다. 각 파일명 뒤에는 -modified가 붙습니다.


전체코드

import subprocess
from fontTools.ttLib import TTFont
import os

def change_font_family(input_path, output_path, new_family_name):
    font = TTFont(input_path)
    name_records = font['name'].names

    for record in name_records:
        if record.nameID == 1:  # Family
            record.string = new_family_name.encode('utf-16-be')
        elif record.nameID == 4:  # Full name
            record.string = new_family_name.encode('utf-16-be')
        elif record.nameID == 16:  # Preferred Family
            record.string = new_family_name.encode('utf-16-be')
        elif record.nameID == 21:  # WWS Family
            record.string = new_family_name.encode('utf-16-be')

    font.save(output_path)

def otf_to_ttf(otf_path, ttf_path):
    # Convert OTF to TTF using fontTools
    font = TTFont(otf_path)
    font.save(ttf_path)

def ttf_to_woff2(ttf_path, woff2_path):
    # Convert TTF to WOFF2
    subprocess.run(["woff2_compress", ttf_path], check=True)
    # Rename the compressed file to the target WOFF2 path
    base_name = os.path.splitext(ttf_path)[0]
    os.rename(base_name + ".woff2", woff2_path)

def process_fonts():
    input_folder = os.getcwd()
    for filename in os.listdir(input_folder):
        if filename.lower().endswith('.otf'):
            input_font_file = os.path.join(input_folder, filename)
            base_name = os.path.splitext(filename)[0]
            new_family_name = base_name.replace('-', ' ')

            temp_ttf = os.path.join(input_folder, f"{base_name}-temp.ttf")
            temp_otf = os.path.join(input_folder, f"{base_name}-temp.otf")
            output_otf = os.path.join(input_folder, f"{base_name}-modified.otf")
            output_woff2 = os.path.join(input_folder, f"{base_name}-modified.woff2")

            # Change font family in the OTF file
            change_font_family(input_font_file, temp_otf, new_family_name)

            # Convert OTF to TTF
            otf_to_ttf(temp_otf, temp_ttf)

            # Convert TTF to WOFF2
            ttf_to_woff2(temp_ttf, output_woff2)

            # Move the modified OTF file to the final output location
            os.rename(temp_otf, output_otf)

            # Clean up temporary TTF file
            os.remove(temp_ttf)

            print(f"Processed {filename}: OTF and WOFF2 files created with new family name '{new_family_name}'.")

if __name__ == "__main__":
    process_fonts()


OTF 폰트패밀리만 변경하기

1. fontTools 설치

아래 명령어로 fontTools 패키지를 설치합니다. Amazon Linux 2 환경에서 Python 패키지를 설치하려면 pip를 사용해야 합니다.

sudo yum install python3-pip
pip3 install fonttools

2. 스크립트 실행

Python 스크립트를 실행할 때 python3 명령어를 사용하여 올바른 Python 환경에서 실행되도록 합니다.

# Ensure the script is executable
chmod +x change_font_family.py

# Run the script with python3
python3 change_font_family.py Pretendard-Bold.otf Pretendard-Bold-modified.otf "PretendardBold"

아래는 Python 스크립트 change_font_family.py의 내용입니다.

change_font_family.py 스크립트

from fontTools.ttLib import TTFont
import sys

def change_font_family(input_path, output_path, new_family_name):
    font = TTFont(input_path)
    name_records = font['name'].names

    for record in name_records:
        if record.nameID == 1:  # Family
            record.string = new_family_name.encode('utf-16-be')
        elif record.nameID == 16:  # Preferred Family
            record.string = new_family_name.encode('utf-16-be')
        elif record.nameID == 21:  # WWS Family
            record.string = new_family_name.encode('utf-16-be')

    font.save(output_path)

if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Usage: python3 change_font_family.py <input_font_file.otf> <output_font_file.otf> <new_family_name>")
        sys.exit(1)

    input_font_file = sys.argv[1]
    output_font_file = sys.argv[2]
    new_family_name = sys.argv[3]

    change_font_family(input_font_file, output_file, new_family_name)

Subscribe to Keun's Story newsletter and stay updated.

Don't miss anything. Get all the latest posts delivered straight to your inbox. It's free!
Great! Check your inbox and click the link to confirm your subscription.
Error! Please enter a valid email address!