본문 바로가기

파일 형식 백과사전

이 폰트, PDF에 끼워 넣어 남에게 보내도 될까요? 코드로 확인하는 법

발표 자료를 PDF로 내보내거나 인쇄소에 파일을 넘길 때, "폰트가 안 깨지게 끼워 넣기(임베딩)" 옵션을 켜는 경우가 많습니다. 그런데 이 폰트를 그렇게 문서에 박아서 남에게 넘겨도 괜찮은 폰트인지, 다들 켜니까 켜는 분이 대부분일 겁니다.

사실 폰트 파일 안에는 이 질문에 대한 답이 미리 적혀 있습니다. 폰트 파일 하나에 얼마나 많은 정보가 담겨 있는지는 용량을 뜯어봤던 글에서도 다룬 적이 있는데, 이번엔 용량이 아니라 이 임베딩 허용 값을 윈도우에 이미 깔려 있는 폰트 몇 개에서 직접 읽어 봤습니다.

 

 

실제 설치된 폰트 5종의 fsType 값. 맑은 고딕, Arial, Consolas는 0x0008(편집 가능 임베딩), Pretendard Bold와 Noto Sans는 0x0000(제한 없음)으로 측정됨

fsType이라는 이름의 스위치

OpenType과 TrueType 폰트 규격에는 OS/2라는 테이블이 있고, 그 안에 fsType이라는 2바이트짜리 값이 들어 있습니다. 폰트를 만든 쪽이 "이 폰트를 문서에 끼워 넣는 걸 얼마나 허용할지" 미리 설정해 둔 값입니다.

딱 잘라 말해 두면, 이 값은 문서 임베딩에 대한 허용 범위를 나타낼 뿐이지 그 폰트를 로고나 웹사이트, 인쇄물 디자인에 자유롭게 써도 되는지를 판가름하는 값은 아닙니다. 그 부분은 별도의 라이선스 문서를 봐야 합니다. 다만 "이 PDF, 파워포인트를 남에게 넘겨도 되는지"라는 좁지만 실무에서 자주 걸리는 질문 하나는 이 값만 읽어도 바로 답이 나옵니다.


실제로 읽어 보니

파이썬 fontTools 4.63.0으로 윈도우 11에 설치된 폰트 파일과, 오픈소스로 배포되는 폰트 파일을 각각 열어 fsType 값을 뽑아 봤습니다.

from fontTools.ttLib import TTFont
f = TTFont("malgun.ttf")
print(hex(f["OS/2"].fsType))
폰트 fsType 값
맑은 고딕 0x0008 편집 가능 임베딩(bit3)
Arial 0x0008 편집 가능 임베딩(bit3)
Consolas 0x0008 편집 가능 임베딩(bit3)
Pretendard Bold 0x0000 제한 없음(오픈소스 배포 폰트)
Noto Sans 0x0000 제한 없음(오픈소스 배포 폰트)

세 개의 윈도우 시스템 폰트가 나란히 bit3(0x0008)로 나왔습니다. 이 비트는 "문서에 끼워 넣은 채로 배포해도 되고, 받은 사람이 그 폰트로 문서를 열어 수정까지 해도 된다"는 뜻입니다. 반대로 오픈소스로 풀린 두 폰트는 값 자체가 0이라 별도의 임베딩 제한이 없습니다.

 

값이 다르면 무엇이 갈릴까

fsType이 가질 수 있는 값은 정해진 몇 가지 비트의 조합입니다. 이번에 측정한 값 외에 규격에 정의된 항목을 참고용으로 정리하면 이렇습니다.

비트 의미
없음 0x0000 제한 없음, 자유롭게 임베딩 가능
bit1 0x0002 임베딩 자체를 제한(Restricted License)
bit2 0x0004 미리보기와 인쇄 목적으로만 임베딩 허용
bit3 0x0008 편집 가능한 형태로 임베딩 허용
bit8 0x0100 일부 글자만 뽑아 넣는 서브셋 금지

이번 측정에서 0x0002(임베딩 제한)로 뜨는 폰트는 보지 못했지만, 유료로 구매한 폰트라면 이 값이 나올 가능성이 있으니 배포용 문서를 만들기 전에 한 번 확인해 볼 만합니다.


지금 쓰는 폰트로 직접 확인하려면

확인하고 싶은 폰트 파일 경로만 바꾸면 그대로 돌아갑니다. 별도 프로그램 설치 없이 fontTools 하나만 있으면 됩니다.

pip install fonttools

from fontTools.ttLib import TTFont

path = r"C:\Windows\Fonts\여기에_폰트파일.ttf"
f = TTFont(path)
fstype = f["OS/2"].fsType
print(f"fsType = 0x{fstype:04X}")

ttc처럼 여러 서체가 한 파일에 묶인 경우는 TTFont(path, fontNumber=0)처럼 번호를 지정해야 특정 서체를 골라 열 수 있습니다.

파이썬 코드를 짜기 귀찮다면, 명령 한 줄로도 됩니다

fontTools를 설치하면 ttx라는 명령줄 도구도 함께 깔립니다. 이 도구로 OS/2 테이블만 뽑아 XML로 출력하면, 파이썬 코드를 따로 쓰지 않고도 값을 볼 수 있습니다.

ttx -t OS/2 -o - malgun.ttf

실제로 맑은 고딕에 실행해 보면 이런 줄이 나옵니다.

<fsType value="00000000 00001000"/>

이진수로 표시된 값이라 낯설어 보이지만, 뒤에서부터 0번, 1번, 2번... 순서로 자리를 셉니다. 오른쪽에서 4번째 자리(0001000에서 1이 있는 자리)가 켜져 있으니 bit3이고, 앞서 코드로 확인한 0x0008과 정확히 같은 결과입니다. 여러 폰트를 훑어봐야 할 때는 파이썬 코드가 편하지만, 폰트 하나만 빠르게 확인할 때는 이 명령 한 줄이 더 간단합니다.

웹사이트에 올리는 웹폰트에도 같은 값이 적용될까

여기서 다룬 fsType은 정확히는 "문서 프로그램이 폰트를 파일 안에 끼워 넣어도 되는가"를 위해 만들어진 값입니다. 워드, 파워포인트, PDF 내보내기가 이 값을 참고합니다.

웹사이트에 올리는 @font-face 웹폰트는 사정이 다릅니다. 브라우저는 fsType 값을 강제로 검사하지 않기 때문에, fsType이 임베딩을 제한하는 값이더라도 실제로는 웹폰트로 올라가는 걸 막지 못합니다. 그래서 웹폰트를 배포할 때는 fsType보다 그 폰트의 별도 라이선스 문서(웹폰트 사용을 허용하는지)를 확인하는 쪽이 더 확실합니다. fsType은 문서 임베딩이라는 한 가지 상황에만 해당하는 값이라는 점을 다시 한번 기억해 두시면 좋습니다.

자주 묻는 질문

Q. fsType이 0이면 아무 데나 써도 되나요?
문서 임베딩 제한이 없다는 뜻일 뿐입니다. 상업적 이용, 재배포, 수정 가능 여부는 폰트별 라이선스(SIL OFL, 자체 EULA 등) 원문을 따로 확인해야 합니다.

Q. 윈도우에 기본으로 깔린 폰트는 회사 발표 자료에 써도 되나요?
윈도우 사용권에 포함된 범위 안에서는 통상 문제가 없지만, 그 폰트 파일 자체를 추출해 다른 제품에 넣어 배포하는 행위는 별도 문제입니다. fsType과는 다른 차원의 이야기입니다.

Q. 값을 읽었는데 도구마다 표기(10진수, 16진수)가 다릅니다.
같은 값을 다르게 표기했을 뿐입니다. 0x0008과 8은 같은 숫자입니다.

Q. ttx로 뽑은 이진수 표기는 어떻게 읽나요?
공백으로 나뉜 두 묶음이 상위 바이트와 하위 바이트입니다. 오른쪽 묶음의 오른쪽에서부터 0번째 자리로 세어, 1로 켜진 자리 번호가 곧 앞서 표에서 본 bit 번호입니다.

 

폰트 라이선스는 보통 긴 약관 문서를 읽어야 감이 잡히는데, fsType 하나만 봐도 "적어도 문서 임베딩은 어디까지 허용되는지"는 코드 몇 줄로 바로 나옵니다. 다음 발표 자료를 PDF로 내보내기 전에, 쓰고 있는 폰트의 fsType부터 한 번 찍어 보시길 권합니다.

 

위 fsType 값은 실제 폰트 파일을 fontTools로 직접 열어 OS/2 테이블에서 읽은 값입니다.

 

 

 

JPG 저장할 때 화질(quality)을 몇으로 두면 좋을까, 옵션별 용량 실측 방법

사진을 JPG로 저장할 때 화질 값을 묻는 프로그램이 많습니다.보통 0부터 100 사이의 숫자인데, 이 값을 얼마로 두느냐에 따라 파일 크기가 몇 배씩 달라집니다.무작정 100으로 두면 용량이 커지고,

richyeon.com

 

 

큰 CSV를 엑셀 대신 SQL로 다루기, SQLite에 불러와 조회하는 방법

수천 행짜리 CSV에서 도시별 매출 합계나 특정 조건의 주문만 뽑아내려면, 엑셀에서는 피벗 테이블과 필터를 여러 번 거쳐야 합니다. 이럴 때 CSV를 SQLite라는 가벼운 데이터베이스에 한 번 넣어

richyeon.com

 

 

커진 CSV를 gzip으로 압축하기, 얼마나 줄고 압축한 채로 바로 읽을 수 있을까?

로그나 내역 데이터를 CSV로 쌓다 보면 파일이 수십 메가바이트까지 불어납니다.텍스트라 압축이 잘 먹는데, 그렇다고 매번 압축을 풀었다 다시 읽자니 번거롭습니다. 그래서 두 가지가 궁금해

richyeon.com