이전에는 POI와 Jxls를 이용한 템플릿 기반 엑셀 파일을 생성 및 다운로드 하는 게시글을 작성했다. 이번에는 특정 데이터를 템플릿을 기반으로 보여주되 엑셀이 아닌 파워포인트에 내용을 작성하는 작업을 맡게 되었다.
0. 의존성
1) Maven 이용 시
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
2) Gradle 이용 시
implementation 'org.apache.poi:poi:4.1.2'
1. 템플릿 파일 가져오기
File originalFile = new File(servletContext.getRealPath("/WEB-INF/template"), "템플릿 파일명");
2. 가져온 템플릿 파일을 기반으로 새로운 파워포인트 파일 생성
FileInputStream is = new FileInputStream(originalFile);
XMLSlideShow ppt = new XMLSlideShow(is);
is.close();
3. 마스터 슬라이드의 레이아웃 가져오기
템플릿 파워포인트의 슬라이더 마스터들을 가져오고, 각 마스터의 레이아웃을 가져올 수 있다. 내 경우에는 마스터를 여러 개 생성하고, 각 마스터에 하나씩 레이아웃을 지정했기 때문에 아래와 같이 가져올 수 있었다.
List<XSLFSlideMaster> masters = ppt.getSlideMasters();
XSLFSlideLayout layout1 = masters.get(0).getSlideLayouts()[0];
XSLFSlideLayout layout2 = masters.get(1).getSlideLayouts()[0];
4. 파워포인트 텍스트박스 생성
XSLFSlide slide1 = ppt.createSlide([레이아웃]);
XSLFTextBox textBox = slide1.createTextBox(); // 텍스트 박스 생성
textBox.clearText();
XSLFTextParagraph paragraph = textBox.addNewTextParagraph(); // 텍스트 단락 생성
XSLFTextRun text = paragraph.addNewTextRun(); // 텍스트 생성
textBox.setAnchor(new Rectangle(360, 59, 100, 18)); // 텍스트 박스의 좌표 및 크기 설정
text.setText("텍스트 내용"); // 텍스트 데이터 넣기
text.setFontColor(Color.black); // 텍스트 컬러 설정
text.setFontSize((double) 12); // 텍스트 사이즈 설정(double 타입의 값을 인자로 받음)
text.setBold(true);
XSLFSlide : 개개의 슬라이드는 XSLFSlide 타입으로 존재한다.
XSLFTextBox : 텍스트 박스 타입
XSLFTextParagraph : 텍스트 단락 타입
XSLFTextRun : 실제 텍스트
XSLFSlide의 createTextBox() : 해당 슬라이드에 텍스트 박스를 생성할 수 있다.
XSLFTextBox의 addNewTextParagraph() : 텍스트 단락을 생성할 수 있다.
XSLFTextParagraph의 addNewTextRun() : 실제 내용을 작성할 수 있는 텍스트 생성(setText를 통해 내용 입력해줘야 함)
XSLFTextRun의 setText(), setFontColor(), setFontSize(), setBold() : 텍스트의 내용, 글자 색상, 글자 크기, 글자 굵기 등을 설정할 수 있다.
만약 여러 장의 슬라이드에 공통된 내용이 들어간다면(위치와 모양 전부) 아래와 같은 형태로 새 슬라이드를 생성하면서 이전에 만든 슬라이드의 컨텐츠를 가져올 수 있다.
XSLFSlide firstSlide = ppt.createSlide([레이아웃]).importContent([슬라이드]);
5. 슬라이드에 이미지 추가
// DB 에서 조회하는 등 바이너리 데이터로 존재하는 경우
String img = objVO.getImageData();
// 프로젝트 내부 디렉토리에 이미지가 존재하는 경우
File img = new File([파일 경로]);
byte[] picture = IOUtils.toByteArray(new FileInputStream(image));
int pictureIdx = ppt.addPicture(picture, [이미지 파일 타입]);
XSLFPictureShape image = slide.createPicture(pictureIdx);
1) ppt.addPicture() 메소드는 첫 번째 인자로 바이트 배열 타입의 이미지 파일, 두 번째 인자로는 이미지 파일의 타입(확장자)를 받는다.
2) 이미지 파일 타입 : XSLFPictureData.PICTURE_TYPE_PNG, XSLFPictureData.PICTURE_TYPE_.JPEG 등과 같이 이미지 확장자명과 일치하는 타입으로 지정해주면 된다.
6. 파워포인트 파일 생성
File file = new File([새로운 파일 경로]);
FileOutputStream out = new FileOutputStream(file);
ppt.write(out)
out.close();
'Backend > Spring' 카테고리의 다른 글
Spring) 바이너리 파일을 DB에 저장 후 요청에 의해 바로 다운로드하기 (0) | 2021.12.06 |
---|---|
Spring) Poi와 Jxls를 사용해 Template을 이용한 워드 다운로드 (0) | 2021.12.06 |
Spring) Poi와 Jxls를 사용해 Template을 이용한 파워포인트 다운로드 -2. 테이블 작성 (0) | 2021.11.28 |
Spring) JXLS, POI 버전 문제 (0) | 2021.10.17 |
Spring) Poi와 Jxls를 사용해 Template을 이용한 엑셀 다운로드 (0) | 2021.09.06 |