--- /dev/null
+/* ====================================================================
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+==================================================================== */
+package org.apache.poi.xslf;
+
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
+import org.apache.poi.POIDataSamples;
+import org.apache.poi.xslf.usermodel.*;
+import org.junit.jupiter.api.Test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+
+public class TestXSLFSlideCopy {
+ private static final POIDataSamples slTests = POIDataSamples.getSlideShowInstance();
+
+ @Test
+ public void testCopySlide() throws IOException {
+ final String shapeName = "title";
+ try (
+ InputStream stream = slTests.openResourceAsStream("copy-slide-demo.pptx");
+ XMLSlideShow slideShow = new XMLSlideShow(stream);
+ UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream()
+ ) {
+ XSLFSlide defaultSlide = getSlideByShapeName(slideShow, shapeName);
+ int slideIndex = defaultSlide.getSlideNumber() - 1;
+ List<Integer> slideIndexList = new ArrayList<>();
+ for (int i = 0; i < 3; i ++) {
+ if (i == 0) {
+ // pass
+ } else {
+ XSLFSlide newSlide = copySlide(slideShow, slideIndex);
+ slideIndex = newSlide.getSlideNumber() - 1;
+ }
+ slideIndexList.add(slideIndex);
+ }
+ for (Integer index : slideIndexList) {
+ XSLFSlide slide = slideShow.getSlides().get(index);
+ replaceText(slide, shapeName, "this is slide " + slide.getSlideNumber());
+ }
+ slideShow.write(bos);
+ try (XMLSlideShow slideShow1 = new XMLSlideShow(bos.toInputStream())) {
+ List<XSLFSlide> slides = slideShow1.getSlides();
+ assertEquals(3, slides.size());
+ for (XSLFSlide slide : slides) {
+ XSLFShape shape = getShape(slide, shapeName);
+ assertInstanceOf(XSLFTextShape.class, shape);
+ XSLFTextShape textShape = (XSLFTextShape) shape;
+ StringBuilder textBuffer = new StringBuilder();
+ List<XSLFTextParagraph> textParagraphs = textShape.getTextParagraphs();
+ for (XSLFTextParagraph textParagraph : textParagraphs) {
+ List<XSLFTextRun> textRuns = textParagraph.getTextRuns();
+ for (XSLFTextRun textRun : textRuns) {
+ textBuffer.append(textRun.getRawText());
+ }
+ }
+ assertEquals("this is slide " + slide.getSlideNumber(), textBuffer.toString());
+ }
+ }
+ }
+ }
+
+ private void replaceText(XSLFSlide slide, String shapeName, String value) {
+ XSLFShape shape = getShape(slide, shapeName);
+ if (shape == null) {
+ return;
+ }
+ assertInstanceOf(XSLFTextShape.class, shape);
+ XSLFTextShape textShape = (XSLFTextShape) shape;
+ List<XSLFTextParagraph> textParagraphs = textShape.getTextParagraphs();
+ for (XSLFTextParagraph textParagraph : textParagraphs) {
+ List<XSLFTextRun> textRuns = textParagraph.getTextRuns();
+ for (XSLFTextRun textRun : textRuns) {
+ textRun.setText(value);
+ }
+ }
+ }
+
+ private static XSLFSlide copySlide(XMLSlideShow ppt, int index) {
+ XSLFSlideLayout defaultSlideLayout = null;
+ List<XSLFSlideMaster> slideMasters = ppt.getSlideMasters();
+ for (XSLFSlideMaster slideMaster : slideMasters) {
+ for (XSLFSlideLayout slideLayout : slideMaster.getSlideLayouts()) {
+ if (Objects.equals(SlideLayout.TITLE_AND_CONTENT, slideLayout.getType())) {
+ defaultSlideLayout = slideLayout;
+ break;
+ }
+ }
+ }
+ XSLFSlide slide = ppt.getSlides().get(index);
+ XSLFSlide newSlide = ppt.createSlide(defaultSlideLayout).importContent(slide);
+ ppt.setSlideOrder(newSlide, slide.getSlideNumber());
+ return newSlide;
+ }
+
+ private static XSLFSlide getSlideByShapeName(XMLSlideShow ppt, String shapeName) {
+ List<XSLFSlide> slides = ppt.getSlides();
+ for (XSLFSlide slide : slides) {
+ List<XSLFShape> shapes = slide.getShapes();
+ for (XSLFShape shape : shapes) {
+ if (shape.getShapeName().equals(shapeName)) {
+ return slide;
+ }
+ }
+ }
+ throw new InvalidParameterException("shape not exist");
+ }
+
+ public XSLFShape getShape(XSLFSlide slide, String shapeName) {
+ List<XSLFShape> shapes = slide.getShapes();
+ for (XSLFShape shape : shapes) {
+ if (shape.getShapeName().equals(shapeName)) {
+ return shape;
+ }
+ }
+ throw new InvalidParameterException("shape not exist in slide");
+ }
+}