iText에서 한글 폰트 사용방법


배경

PDF, PPT 문서의 페이지 별로 하나의 이미지로 변환해야 하는 경우가 생겼다.

Office 문서인 경우는 별 이슈 없이 apache-poi 를 사용하여 처리하였다.
그러나 PDF인 경우는 apache apache-pdfbox 와 iText 에 대해서 고민하고 검토하게 되었는데
apache-pdfbox 은 PDF 파일을 이미지로 변환하는 것이 매우 쉽다는 장점이 있지만
한글 처리 방법(한글 폰트)을 찾지 못하였다.

반면에 그리고 iText 는 한글 폰트를 embeded 하기 편리하였고 샘플코드 및 레퍼런스 문서가 풍부하였다.

TTF (True Type Font) 파일 사용

물리적 ttf 파일을 통하여 BaseFont 클래스를 생성

package kr.co.squarenet.study.itext;
import com.itextpdf.text.*;
public class FontSample {
 
    public static void main(String[] args) throws Exception {
        BaseFont bfont = BaseFont.createFont("fonts/malgun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bfont,12);
        Phrase phrase = new Phrase("text string", font);
    }
}

BaseFont 폰트명은 “getFullFontName” 함수를 사용하여 얻을 수 있으며 리턴값은 “Platform ID, Platform Encoding ID, Language ID,font name” 별 값의 2차원 배열로 구성되어 있다

import com.itextpdf.text.*;
public class FontSample {
    public static void main(String[] args) throws Exception {
        BaseFont bfont = BaseFont.createFont("fonts/malgun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        for (int i = 0; i < bfont.getFullFontName().length; i++) {
            System.out.println(bfont.getFullFontName()[i][0]);  // Platform ID
            System.out.println(bfont.getFullFontName()[i][1]);  // Platform Encoding ID
            System.out.println(bfont.getFullFontName()[i][2]);  // Language ID
            System.out.println(bfont.getFullFontName()[i][3]);  // font name
        }
    }
}

TTC (True Type Compressed Font) 파일 사용

TTC는 TTF 가 2개 이상 존재하는 것이다. 그렇기 때문에 n 개의 BaseFont가 존재하고 1개의 BaseFont 는 위에서 살펴보았단 TTF에서 BaseFont를 다루는 법과 동일하다

조회방법도 폰트파일 path 에 “’,’ + index” (0 부터 시작) 을 넣어주면 된다.
즉 아래 예제 처럼 “fonts/batang.ttc,0”, fonts/batang.ttc,1” 과 같이 조회할 수 있다.

BaseFont bfont1 = BaseFont.createFont("fonts/batang.ttc,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
BaseFont bfont2 = BaseFont.createFont("fonts/batang.ttc,1", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

다음과 같이 BaseFont 의 “enumerateTTCNames” 함수를 사용하여 존재하는 폰트명 및 index를 조회할 수 있다.

import com.itextpdf.text.*;
public class FontSample {
    public static void main(String[] args) throws Exception {
         
        String[] names = BaseFont.enumerateTTCNames("fonts/batang.ttc");
         
        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
            BaseFont bfont = BaseFont.createFont(String.format("%s,%s", "fonts/batang.ttc", i), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        }
    }
}