tl;dr:

  1. cat /path/to/pdf.pdf | grep -a Ordering for know nation
  2. LANG=C LC_ALL=C sed -i '' s'|/Registry (Adobe) /Ordering (NationName) /Supplement [0-9]|/Registry(Adobe) /Ordering(Identity) /Supplement 0|g' filename.pdf

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:1로 정확히 대응된다고는 확언할 수 없기 때문에 이 명령어는 안전하다고 보장할 수 없습니다.

정말 되긴 합니까?

궁금하신분들을 위해 미리보기를 준비했습니다.

커맨드라인이 어려워요

제 생각에도 너무 귀찮고 어려운 작업이라고 보기에, 빠른 시일내에 해당 변환을 처리해주는 웹 서비스를 만들겠습니다. (...)