FontTools
A library to manipulate font files from Python
FontTools는 글꼴 파일을 조작하기 위한 오픈 소스 라이브러리로, 파이썬으로 작성되었습니다.
이 라이브러리는 TrueType, OpenType, AFM, 기타 많은 글꼴 형식을 지원하며, 글꼴의 분석, 수정, 생성 및 변환 작업을 위해 광범위하게 사용됩니다.
FontTools는 특히 글꼴 엔지니어링과 웹 글꼴 최적화 과정에서 필수적인 도구로 자리 잡고 있습니다.
주요 기능
- 다양한 글꼴 형식 지원: TrueType, OpenType, AFM 등 다양한 글꼴 파일 형식을 처리할 수 있습니다.
- 글꼴 서브셋 생성: 필요한 글리프만 포함하는 서브셋 글꼴 파일을 생성하여 파일 크기를 최적화할 수 있습니다.
- TTF/OTF 변환: TrueType과 OpenType 글꼴 간 변환이 가능합니다.
- XML 기반 글꼴 수정: 글꼴 데이터를 XML로 추출하고, 수정 후 다시 글꼴 파일로 컴파일할 수 있습니다.
- 글리프 데이터 조작: 글리프의 형태나 메타데이터를 직접 수정할 수 있습니다.
Install
글리프 정보 추출
다음은 FontTools를 사용하여 글꼴 파일에서 특정 글리프의 정보를 추출하는 예제 코드입니다.
from fontTools.ttLib import TTFont
# Arial 폰트의 'A'와 맑은 고딕의 '가' 글리프 정보 출력
for font_name, sample_glyph in [('arial', 'A'), ('malgun', 'uniAC00')]:
# 글리프의 정보 출력
font = TTFont(rf'C:\Windows\Fonts\{font_name}.ttf')
glyph = font['glyf'].get(sample_glyph)
print(f"{font_name=}, {sample_glyph=}")
print(f" 글리프 좌표 정보: {glyph.coordinates}")
print(f" 윤곽선 수: {glyph.numberOfContours}\n")
# 글꼴 파일 닫기
font.close()
유니코드 캐릭터 맵핑 확인하기
from fontTools.ttLib import TTFont
# TTF 파일 읽기
font_path = "NanumGothicCoding-Bold.ttf"
font = TTFont(font_path)
# 글리프 이름 가져오기
glyph_names = font.getGlyphOrder()
# 글리프 개수 출력
print("Total glyphs:", len(glyph_names))
# 글리프 목록 출력 (매우 많음)
# print("Glyph names:", glyph_names)
# cmap 테이블에서 유니코드 맵핑 확인
unicode_map = font['cmap'].getBestCmap()
# 유니코드와 글리프 이름 쌍 출력
for codepoint, glyph_name in unicode_map.items():
print(f"U+{codepoint:04X}: {glyph_name}")
cmap (Character Map) Table
cmap(Character Map) 테이블은 TrueType 및 OpenType 폰트 파일에서 각 유니코드 코드포인트와 글리프(글자 모양) 간의 매핑 정보를 저장하는 테이블입니다.
이 매핑 정보는 텍스트 데이터를 화면에 올바르게 렌더링하는 데 필수적입니다. 즉, 특정 유니코드 코드포인트가 주어졌을 때 폰트가 해당 문자를 어떻게 표시할지를 결정하는 데 사용됩니다.
cmap 테이블의 역할
- 문자 코드 매핑: cmap 테이블은 폰트 파일 내의 유니코드 코드포인트(예: U+0041, U+AC00)와 실제 글리프 이름 또는 글리프 ID를 매핑합니다.
- 글리프 렌더링: 운영체제나 애플리케이션이 특정 문자를 렌더링할 때, cmap 테이블을 참조하여 코드포인트에 해당하는 글리프를 찾아 렌더링합니다.
- 다양한 문자 인코딩 지원: 폰트는 여러 종류의 cmap 서브테이블을 가질 수 있어, 유니코드 외에도 다양한 인코딩(예: ASCII, Shift-JIS 등)을 지원할 수 있습니다.
cmap 테이블 구조
- cmap 테이블은 여러 개의 서브테이블로 구성되며, 각 서브테이블은 특정 문자 인코딩 형식과 매핑 방식을 나타냅니다.
- 각 서브테이블은 매핑 방식에 따라 간단한 매핑 테이블, 범위 매핑, 포맷별 매핑(Format 4, Format 12 등)으로 구분됩니다.
- Format 4: 가장 많이 사용되는 형식으로, BMP(Basic Multilingual Plane) 영역의 글리프를 매핑합니다.
- Format 12: 확장된 유니코드(예: 이모지나 희귀 문자) 매핑을 지원하며, 32비트 값을 사용하여 여러 언어와 문자 집합을 포함합니다.
확인 방법
getBestCmap()
은 cmap 테이블 내에서 가장 적합한 유니코드 맵핑 테이블을 찾아줍니다.
pyftsubset
OpenType font subsetter and optimizer
사용 사례
- 웹 글꼴 최적화: 웹 페이지의 로딩 속도를 향상시키기 위해 필요한 글리프만 포함하는 글꼴 서브셋을 생성할 수 있습니다.
- 글꼴 개발 및 테스트: 새로운 글꼴을 개발하거나 기존 글꼴을 수정할 때 유용합니다.
- 교육 및 연구: 글꼴 구조와 글리프 데이터를 분석하고 연구하는 데 도움을 줄 수 있습니다.
See also
- Web Font Loader gives you added control when using linked fonts via @font-face.
- webfont
- CSS:font
- CSS:@font-face
Favorite site
- Github - fonttools/fonttools
- —fontTools Documentation— — fontTools Documentation
- FontTools: 글꼴 파일 조작 라이브러리 - 함께해요 파이썬 생태계
- [추천] 웹폰트 경량화: 폰트툴즈(fontTools)의 pyftsubset을 사용한 폰트 서브셋 만들기 | 44BITS 1
References
-
44BITS_-_optimization_webfont_with_pyftsubnet.pdf ↩