2012년 8월 21일 화요일

iTextSharp에서 한글-CJK 사용하기

iTextSharp을 이용해서 한글을 삽입하는 방법

  1. dll로 감싸여져 있는 iTextSharp에서 제공하는 폰트를 이용하는 방법

    Embedding 방식이 아닌 것으로 추정되며 생성된 PDF의 파일 크기가 작은 특징을 가지고 있다.

    iTextSharp에서 제공하는 Font 이름은
    HYGoThic-Medium
    HYSMyeongJo-Medium
    HYSMyeongJoStd-Medium
    이다.

    글자의 쓰기 방향을 결정하는 CMap은
    UniKS-UCS2-H
    UniKS-UCS2-V
    이 있다.
    (H로 끝나는 것은 가로 쓰기, V는 세로쓰기)

    (사용방식)
    BaseFont.AddToResourceSearch("iTextAsian.dll");
    BaseFont bf = BaseFont.CreateFont("HYSMyeongJoStd-Medium", "UniKS-UCS2-H", BaseFont.NOT_EMBEDDED);
    Font font = new Font(bf, 12, Font.BOLD|Font.UNDERLINE, BaseColor.RED);
    위와 같이 사용을 하면 된다. 그리고 iTextAsian.dll 파일은 debug 폴더(또는 만들어진 프로그램이 설치되는 폴더)에 위치하면 된다.
  2. PC에 존재하는 폰트를 불러 들이는 방법
    Embedding 방식으로 추정이 된다. 동일한 내용에 대해서 1번에 의해 생성된 파일보다  4배 정도의 사이즈 차가 발생한다.

    (사용방식)
    BaseFont bf = BaseFont.CreateFont("malgun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);OrBaseFont bf = BaseFont.CreateFont("HMFMMUEX.TTC,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    Font font = new Font(bf, 12, Font.BOLD|Font.UNDERLINE, BaseColor.RED);
    의 방식으로 사용한다.
    PC에 존재하는 폰트를 사용하기 위해서는 다음의 폰트 유형 중에 하나이어야 한다.

    * Type1 font files (.afm, .pfm, .pfb)로서 잘 알지는 못하지만 Adobe에서 만들어진 폰트로 알고 있다.
    * TrueType font files - .ttf (Adobe의 Type1 폰트와 경쟁하기 위해서 Apple에서 개발된 폰트)
    * OpenType font files - .otf, .ttf, .tttc (Unicode에 근간한 cross-platform 폰트 파일 포맷)

    ttf 형식의 폰트는 폰트명을 "malgun.ttf"로 지정하지만 ttc 형식의 폰트는 폰트명을"HMFMMUEX.TTC,0"와 같이 ",0"이 추가된다. 이것은 ttc는 ttf의 collection을 위해서 사용되는 것이기 때문에 ttf 중에서 첫번째 ttf를 사용하도록 하기 위한 것이다.

    폰트명을 지정할 때, 해당 폰트가 debug 폴더(또는 만들어진 프로그램이 설치되는 폴더)에 위치하는 경우에는 경로없이 폰트 파일 이름을 기재하면 되지만 직접 경로를 기재해도 된다. 예를 들어서, C:/windows/fonts/malgun.ttf와 같이 기재할 수 있다.

    여기서 주의할 것은 한글이 제대로 표시되려면 한글전용폰트를 사용해야 한다는 것이다. courier, arial과 같은 폰트도 윈도우에서는 지원되지만 iTextSharp에서는 해당 폰트를 사용하면 한글이 표시 되지 않는다. (이 부분은 내가 잘못 알고 있는 부분일지도 모른다.)adobe의 폰트인 afm 파일도 마찬가지로 Courier.afm등의 파일을 iTextSharp을 통해서
    불러들이면 한글이 표시되지 않는 현상이 발생한다.


    (대략적인 사용방법)
    using iTextSharp.text;
    using iTextSharp.text.pdf;

    ......

    //iTextSharp의 폰트를 사용할 경우
    BaseFont.AddToResourceSearch("iTextAsian.dll");
    BaseFont bf = BaseFont.CreateFont("HYSMyeongJoStd-Medium", "UniKS-UCS2-H", BaseFont.NOT_EMBEDDED);

    //폰트 파일을 사용하는 경우 - ttf
    BaseFont bf = BaseFont.CreateFont("malgun.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    //폰트 파일을 사용하는 경우 - ttc
    BaseFont bf = BaseFont.CreateFont("HMFMMUEX.TTC,0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

    Font font = new Font(bf, 12, Font.BOLD|Font.UNDERLINE, BaseColor.RED);
                     
    writer.CompressionLevel = 0;
    UTF8Encoding utf8 = new UTF8Encoding();
    Byte[] utf8String = utf8.GetBytes("Hello World 안녕하세요");
    Phrase hello = new Phrase();
    Chunk chunk = new Chunk(utf8.GetString(utf8String), font);

    hello.Add(chunk);
    PdfContentByte canvas = writer.DirectContentUnder;
    ColumnText.ShowTextAligned(canvas, Element.ALIGN_LEFT, hello, 100, 100, 0);

    위의 코드에서 PDFWrite와 Document에 대한 참조는 생략되었으므로 주의하라.

댓글 없음:

댓글 쓰기