Development note/Java

[Java] PDF를 출력하는 방법(itextpdf)

v명월v 2019. 10. 31. 09:00

안녕하세요. 명월입니다.


이 글은 자바에서 PDF를 출력하는 방법에 대한 글입니다.

제가 예전에 C#으로 iTextSharp라이브러리를 이용해서 pdf를 출력하는 방법에 대해 글을 작성한 적이 있습니다.

링크 - [C#] iTextSharp을 이용한 PDF 만들기


PDF는 이제 포탈 시스템에서 결과 레포트를 출력하는데 거의 기본이 되는 형식의 문서입니다. 이미지라고 하기에는 좀 문서처럼 보이니깐요..

이걸 자바 언어 환경에서 출력할 수 있게 사용하는 방법에 대해 알아보겠습니다.


먼저 프로젝트를 생성하고 maven을 사용할 수 있는 상태로 만듭니다.

링크 - [Java강좌 - 38] Maven 설치 및 eclipse에 연동하기


그리고 maven을 연결합니다.

레포지토리 - https://mvnrepository.com/artifact/com.itextpdf/itextpdf/5.5.13.1

레포지토리 - https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker/5.5.13.1

...
<!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf -->
<dependency>
  <groupId>com.itextpdf</groupId>
  <artifactId>itextpdf</artifactId>
  <version>5.5.13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker -->
<dependency>
  <groupId>com.itextpdf.tool</groupId>
  <artifactId>xmlworker</artifactId>
  <version>5.5.13.1</version>
</dependency>
...

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.StringReader;
import java.net.URL;
import java.nio.charset.Charset;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorker;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.parser.XMLParser;
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline;
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
public class Main {
  // 실행 함수
  public static void main(String[] args) {
    // PDF를 작성하는 html
    String html = "<html>" + 
                  "<head></head>" + 
                  "<body>" + 
                  "<div>Hello world</div>" + 
                  "<div>명월입니다.</div>" + 
                  "</body>" + 
                  "</html>";
    // 파일 IO 스트림을 취득한다.
    try (FileOutputStream os = new FileOutputStream("d:\\work\\test.pdf")) {
      // Pdf형식의 document를 생성한다.
      Document document = new Document(PageSize.A4, 10, 10, 10, 10);
      // PdfWriter를 취득한다.
      PdfWriter writer = PdfWriter.getInstance(document, os);
      // document Open한다.
      document.open();
      // css를 설정할 resolver 인스턴스 생성
      StyleAttrCSSResolver cssResolver = new StyleAttrCSSResolver();
      // Css 파일 설정 (css1.css 파일 설정)
      try (FileInputStream cssStream = new FileInputStream("d:\\work\\css1.css")) {
        cssResolver.addCss(XMLWorkerHelper.getCSS(cssStream));
      }
      // Css 파일 설정 (css2.css 파일 설정)
      try (FileInputStream cssStream = new FileInputStream("d:\\work\\css2.css")) {
        cssResolver.addCss(XMLWorkerHelper.getCSS(cssStream));
      }
      // 폰트 설정
      XMLWorkerFontProvider font = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS);
      // window 폰트 설정
      font.register("c:/windows/fonts/malgun.ttf", "MalgunGothic");
      // 폰트 인스턴스를 생성한다.
      CssAppliersImpl cssAppliers = new CssAppliersImpl(font);
      //htmlContext의 pipeline 생성. (폰트 인스턴스 생성)
      HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
      htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
      // pdf의 pipeline 생성.
      PdfWriterPipeline pdfPipeline = new PdfWriterPipeline(document, writer);
      // Html의pipeline을 생성 (html 태그, pdf의 pipeline설정)
      HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, pdfPipeline);
      // css의pipeline을 합친다.
      CssResolverPipeline cssResolverPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
      //Work 생성 pipeline 연결
      XMLWorker worker = new XMLWorker(cssResolverPipeline, true);
      //Xml 파서 생성(Html를 pdf로 변환)
      XMLParser xmlParser = new XMLParser(true, worker, Charset.forName("UTF-8"));
      // 출력한다.
      try (StringReader strReader = new StringReader(html)) {
        xmlParser.parse(strReader);
      }
      // document의 리소스 반환
      document.close();
    } catch (Throwable e) {
      e.printStackTrace();
    }
  }
}

위의 소스에서 css를 읽어드립니다.

body {
  /* 폰트 설정 */
  font-family: MalgunGothic;
}
div {
  /* 요소의 배경색 설정, 빨간색 */
  background-color: red;
  /* 글씨색 설정, 파란색 */
  color: blue;
}

위 css파일을 아래의 디렉토리에 설정합니다.

설정이 완료되었습니다.


프로그램을 실행해서 결과를 확인하겠습니다.

작성하면서 보니깐 놀라울 정도로 C#과 비슷하네요. 막상 작성해 놓고 보니 포스팅하기도 민망 할 정도로 비슷합니다. 그래도 필요하실 분이 있을 듯 싶어서 첨부파일까지 남깁니다.

청부 파일 - PdfExample.zip


여기까지 자바에서 PDF를 출력하는 방법에 대한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.