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사이트에 안내되어 있으며, 여러 유용한 메서드가 많으니 사용하시길 바랍니다.
'프로그래밍 > Web.' 카테고리의 다른 글
[JSTL] replace - 개행문자 처리하기 (0) | 2020.03.09 |
---|---|
[Tomcat] it set 'X-Frame-Options' to 'deny'. 오류 해결법 (0) | 2020.02.18 |
[Spring] Maven - 501 Error (0) | 2020.02.10 |
[JavaScript] Cookie (0) | 2020.01.21 |
[Spring] AOP(Aspect Oriented Programming) (0) | 2020.01.16 |
댓글