tl;dr:
cat /path/to/pdf.pdf | grep -a Ordering
for know nationLANG=C LC_ALL=C sed -i '' s'|/Registry (Adobe) /Ordering (NationName) /Supplement [0-9]|/Registry(Adobe) /Ordering(Identity) /Supplement 0|g' filename.pdf
- if you feel hard to use command line operation, please use SlideShare Korean Font missing Fixer instead.
SlideShare에서 폰트 사용이 잘 안 된다는 이유로 고민하던 jayjin님께서 손수 일일히 실험을 한 자료를 보았습니다.
슬라이드에서 매우 깊은 빡침을 느낄 수 있었죠.
그런데, raccoony님께서 이런 글을 공유해주셨습니다. 이 글 말미에선 명령어를 하나 소개해주고 있었는데, 한국어로는 안 된다는 덧붙임이 있었습니다. 정말 그런지 궁금해서 실험해봤고, 한국어로 사용하는 방법을 찾았습니다.
방법은 간단합니다.
1. Font 국가 찾기.
pdf파일은 바이너리를 포함하지만, 모든 정보가 바이너리 형태로 되어있진 않아서 읽을 수 있는 부분이 존재합니다.
cat
명령어로 첨부된 폰트가 어떤 형식으로 추가되어있는지를 볼 수 있습니다.
cat /path/to/pdf.pdf | grep -a Ordering
<< /Registry (Adobe) /Ordering (Korea1) /Supplement 0 >> /W 238 0 R /DW 1000
<< /Registry (Adobe) /Ordering (Korea1) /Supplement 0 >> /W 243 0 R /DW 1000
/CIDSystemInfo << /Registry (Adobe) /Ordering (Korea1) /Supplement 0 >> /W
<< /Registry (Adobe) /Ordering (Korea1) /Supplement 0 >> /W 253 0 R /DW 1000
<< /Registry (Adobe) /Ordering (Korea1) /Supplement 2 >> /W 258 0 R /DW 1000
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 265 0 R /DW
<< /Registry (Adobe) /Ordering (Korea1) /Supplement 0 >> /W 272 0 R /DW 1000
/CIDSystemInfo << /Registry (Adobe) /Ordering (Korea1) /Supplement 0 >> /W
/CIDSystemInfo << /Registry (Adobe) /Ordering (Korea1) /Supplement 0 >> /W
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 289 0 R /DW
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 298 0 R /DW
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 307 0 R /DW
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 316 0 R /DW
<< /Registry (Adobe) /Ordering (Korea1) /Supplement 2 >> /W 323 0 R /DW 1000
<< /Registry (Adobe) /Ordering (Korea1) /Supplement 0 >> /W 328 0 R /DW 1000
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 335 0 R /DW
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 344 0 R /DW
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 353 0 R /DW
<< /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /W 362 0 R /DW
여기서 괄호 속 Korea1
에 주목합시다.
2. 일괄치환.
우리가 해야할 일은 Korea1
을 비롯한 국가명이 적힌 폰트 정보를 Identity
로 바꿔버리는 것입니다.
하지만 바이너리 파일을 text editor로 수정하는 것은 무리가 있습니다.
이를 위해 sed 명령어를 이용해 일괄치환합니다.
LANG=C LC_ALL=C sed -i '' s'|/Registry (Adobe) /Ordering (Korea1) /Supplement [0-9]|/Registry(Adobe) /Ordering(Identity) /Supplement 0|g' /path/to/pdf.pdf
이러면 끝납니다.
왜 되는가?.
사실 저는 이미 일본분이 연구해두신 결과에 숟가락을 얹었을 뿐입니다.
연구하신 분의 블로그 글을 일부 번역해서 설명하자면 다음과 같습니다.
글꼴을 표현하려면 문자 코드 → CID(Character ID) → GID (Glyph ID) → 글꼴 (Graph)의 절차를 밟습니다.
문자 코드와 CID간의 관계는 CMap이란 것이 관리하는데, CMap으로는 Adobe-Identity-0, Adobe-Korea1-2 같은 것들이 존재합니다.
PDF의 CIDSystemInfo에는 Registry, Ordering, Supplement (머리 글자를 따서 ROS)의 정보가 포함되어 있습니다.
가령 Adobe-Korea1-2의 경우는 Registry (Adobe) /Ordering (Korea1) /Supplement 2
같은 형태로 저장됩니다.
그런데 SlideShare는 Adobe-Korea1-2
등의 ROS 테이블을 가지고 있지 않은 것 같습니다.
그 결과 글씨가 안 나오고 텅 빈 페이지를 보게 되는 것이죠.
위 명령어를 통해 PDF의 ROS를 Adobe-Identity-0
으로 강제변경해서 볼 수 있도록 합니다.
하지만 Adobe-Identity-0
와 한국어 ROS가 1 정확히 대응된다고는 확언할 수 없기 때문에 이 명령어는 안전하다고 보장할 수 없습니다.
정말 되긴 합니까?.
궁금하신분들을 위해 미리보기를 준비했습니다.
커맨드라인이 어려워요.
제 생각에도 너무 귀찮고 어려운 작업이라 생각하고 있었습니다. 이걸 이준범님께서 보시고는 웹 서비스로 만들어주셨습니다. 커맨드라인 명령어가 불편하신분들은 SlideShare Korean Font missing Fixer를 이용해주세요!