본문 바로가기
프로그래밍/Web.

[Spring] Apache PDFBox

by _Chavi 2020. 2. 13.

 

 

Apache Project의 PDFBox를 통해 PDF 파일을 만드는 예제입니다.

인터넷 예제중 iText를 이용하여 PDF 파일을 만드는 예제가 많으나, iText는 AGPL라이선스를 따름으로 기업용으로 이용하기에 적합하지 않습니다.

이 때문에 Apache License2.0을 따르는 PDFBox를 이용하였습니다.

 

Maven 설정
<!-- PDFBox -->
<dependency>
  <groupId>org.apache.pdfbox</groupId>
  <artifactId>pdfbox</artifactId>
  <version>2.0.18</version>
</dependency>

 

최신 버전인 2.0.18로 진행하였습니다. pom.xml에 등록하여 메이븐 업데이트를 실행해주세요.

 

PDF 파일 생성 예제
// 문서 생성
PDDocument doc = new PDDocument();

// 한글 폰트 설정
FileInputStream fontS = new FileInputStream(/* 폰트 경로 */+"\\KoPubBatangMedium.ttf");
PDType0Font fontKoPubBatangMedium = PDType0Font.load(doc, fontS);

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

// 첫 페이지 생성
doc.addPage(new PDPage(PDRectangle.A4));

// 첫 페이지 컨텐츠 스트림 얻기(작업문서, 현 작업 페이지, 모드, 압축설정)
PDPageContentStream firstPcs = new PDPageContentStream(doc, doc.getPage(0), PDPageContentStream.AppendMode.APPEND, false);

// 가운데 줄 긋기(X좌표, Y좌표)
pcs.moveTo(PDRectangle.A4.getWidth()/2, PDRectangle.A4.getHeight());
pcs.lineTo(PDRectangle.A4.getWidth()/2, 0);
pcs.stroke();

// 텍스트 출력, 텍스트 출력은 항상 닫아 주어야함
pcs.beginText();
pcs.setFont(fontKoPubBatangMedium, 12); // 폰트 크기 설정
pcs.newLineAtOffset(15f, 15f);
pcs.showText("반갑습니다.");
pcs.endText();

// 이미지 읽기
File image = new File(/* 이미지 경로 */ + "\\image.jpg");
java.awt.Image imageInfo = ImageIO.read(image);

// 원본 이미지 문서에 읽기
PDImageXObject imgObj = PDImageXObject.createFromByteArray(doc, Files.readAllBytes(image.toPath()), null);

// 이미지 출력(이미지, X좌표, Y좌표, 폭, 높이)
pcs.drawImage(imgObj, 15, 300, imageInfo.getWidth(null), imageInfo.getHeight(null));

 

좌표는 모두 float형 데이터를 이용하며 2차원 평면은 용지의 좌측 하단을 기준점으로 제1 사분면 좌표를 이용하시면 됩니다.

직접 좌표를 수치로 계산하기보다는 용지의 Height와 Width 값으로 계산을 하는편이 조금 더 깔끔한 PDF를 얻을 수 있습니다.

좀 더 자세한 설명은 API사이트에 안내되어 있으며, 여러 유용한 메서드가 많으니 사용하시길 바랍니다.

 

 

 

댓글