본문 바로가기
프로그래밍/스프링프레임워크

Apache PDFBox 라이브러리를 사용해서 PDF 파일 만들기

by pentode 2018. 4. 20.

Apache PDFBox 라이브러리를 사용해서 PDF 파일을 생성하는 방법을 알아보겠습니다. 간단히 이미지 그리기, 글 쓰기, 라인 그리기 기능을 알아 봅니다. 예제는 스프링 프레임웍을 사용하는 웹프로그램으로 작성했습니다. PDFBox 는 Java 라이브러리이므로 Java 애플리케이션에서 사용할 수 있습니다.


Apache PDFBox 공식 사이트는 https://pdfbox.apache.org/ 입니다. 현재 최신 버전은 2.0.8 입니다.




1. PDFBox를 사용하기 위해서 pom.xml 파일에 의존성을 추가합니다.


<!-- PDFBox -->

<dependency>

    <groupId>org.apache.pdfbox</groupId>

    <artifactId>pdfbox</artifactId>

    <version>2.0.8</version>

</dependency>



2. 문서를 생성하고, 다운로드하기


- PDDcoument 객체의 save() 메소드에 출력  스트림을 인자로 주어 출력합니다.


// 문서 만들기

PDDocument doc = new PDDocument();

...

// 파일 다운로드 설정

response.setContentType("application/pdf");

String fileName = URLEncoder.encode("샘플PDF", "UTF-8");

response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".pdf");


// PDF 파일 출력

doc.save(response.getOutputStream());

doc.close();



3. 페이지 만들고 가져오기


- 새 페이지는 PDPage 객체를 생성하여 doc.addPage(); 메소드를 사용하여 문서에 추가합니다.

- 페이지에 글을 쓰기위해서 가져올 때는 doc.getPage(0); 메소드를 사용합니다.

- 첫 번째 페이지의 인덱스는 0입니다.


PDPage blankPage = new PDPage(PDRectangle.A4);

doc.addPage(blankPage);


// 작업 페이지 설정

PDPage page = doc.getPage(0);



4. 이미지 그리기


- PDImageXObject 객체의 정적 메소드인 createFromFile(); 메소드를 사용하여 이미지를 로드합니다.

- 첫 번째 인자는 이미지의 디스크상의 전체 위치 입니다.

- 두 번째 인자는 문서 객체입니다.

- 페이지에 어떤 작업을 하기 위해서는 PDPageContentStream 객체를 생성합니다. 그리기, 쓰기 모두 이 객체를 통해서 합니다.

- PDPageContentStream 객체의 drawImage(); 메소드로 그림을 그립니다. 이미지 객체, x 좌표, y 좌표, 너비, 높이를 인자로 줍니다.


// 배경이미지 로드

PDImageXObject pdImage = PDImageXObject.createFromFile(webroot + "resources/back.jpg", doc);


// 컨텐츠 스트림 열기

PDPageContentStream contentStream = new PDPageContentStream(doc, page);


// 배경 이미지  그리기

contentStream.drawImage(pdImage, 0, 0, 595, 842);



5. 폰트 로드하기


- ttf 폰트 파일을 로드하기 위해서 PDType0Font 객체의 load(); 메소드를 사용합니다.


// ttf 폰트 사용하기

InputStream fontStream = new FileInputStream("C:/fonts/gulim.ttf");

PDType0Font fontGulim = PDType0Font.load(doc, fontStream);


- ttc 폰트 파일을 로드하기 위해서는 TrueTypeCollection 객체를 생성하고, 거기에서 getFontByName() 메소드를 이용하여 폰트의 이름으로 폰트를 로드합니다.


// ttc 폰트 사용하기

File fontFile = new File("C:/Windows/fonts/gulim.ttc");

PDType0Font fontGulim = PDType0Font.load(doc, new TrueTypeCollection(fontFile).getFontByName("Gulim"), true);



6. 글 쓰기


- 페이지에 글을 쓰기 위해서는 PDPageContentStream 객체의 메소드를 사용합니다.

- 폰트는 한번 지정하면 계속 유효합니다.


// 글쓰기 시작

contentStream.beginText(); 

// 폰트 설정

contentStream.setFont(font, fontSize);

// 글이 쓰여질 위치 지정

contentStream.newLineAtOffset(left, bottom);

// 글쓰기

contentStream.showText(text);

// 글쓰기 종료

contentStream.endText();



7. 선그리기


- 선 그리기도 PDPageContentStream 객체의 메소드를 사용합니다.


// 선 그리기 시작 위치로 이동합니다.

contentStream.moveTo(xStart,yStart);

// 끝 위치를 지정합니다.

contentStream.lineTo(xEnd,yEnd);

// 선을 그립니다.

contentStream.stroke();



8. 출력된 결과 입니다.




이것으로 Apache PDFBox 라이브러리를 사용해서 PDF 파일을 만드는 방법을 알아보았습니다.


※ 전체예제


반응형