import java.io.IOException;
import java.util.List;
+import java.util.stream.Collectors;
+import org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream;
+import org.apache.poi.xddf.usermodel.text.XDDFTextParagraph;
+import org.apache.poi.xddf.usermodel.text.XDDFTextRun;
import org.apache.poi.xslf.XSLFTestDataSamples;
import org.junit.jupiter.api.Test;
import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;
@Test
void testReadTextShapes() throws IOException {
- XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
- List<XSLFSlide> slides = ppt.getSlides();
-
- XSLFSlide slide1 = slides.get(0);
- List<XSLFShape> shapes1 = slide1.getShapes();
- assertEquals(7, shapes1.size());
- assertEquals("TextBox 3", shapes1.get(0).getShapeName());
- XSLFAutoShape sh0 = (XSLFAutoShape) shapes1.get(0);
- assertEquals("Learning PPTX", sh0.getText());
- List<XSLFTextParagraph> paragraphs0 = sh0.getTextParagraphs();
- assertEquals(1, paragraphs0.size());
- XSLFTextParagraph p0 = paragraphs0.get(0);
- assertEquals("Learning PPTX", p0.getText());
- assertEquals(1, p0.getTextRuns().size());
- XSLFTextRun r0 = p0.getTextRuns().get(0);
- assertEquals("Learning PPTX", r0.getRawText());
-
- XSLFSlide slide2 = slides.get(1);
- List<XSLFShape> shapes2 = slide2.getShapes();
- assertTrue(shapes2.get(0) instanceof XSLFAutoShape);
- assertEquals("PPTX Title", ((XSLFAutoShape) shapes2.get(0)).getText());
- XSLFAutoShape sh1 = (XSLFAutoShape) shapes2.get(0);
- List<XSLFTextParagraph> paragraphs1 = sh1.getTextParagraphs();
- assertEquals(1, paragraphs1.size());
- XSLFTextParagraph p1 = paragraphs1.get(0);
- assertEquals("PPTX Title", p1.getText());
- List<XSLFTextRun> r2 = paragraphs1.get(0).getTextRuns();
- assertEquals(2, r2.size());
- assertEquals("PPTX ", r2.get(0).getRawText());
- assertEquals("Title", r2.get(1).getRawText());
- // Title is underlined
- assertEquals(STTextUnderlineType.SNG, r2.get(1).getRPr(false).getU());
-
-
- assertTrue(shapes2.get(1) instanceof XSLFAutoShape);
- assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape) shapes2.get(1)).getText());
- XSLFAutoShape sh2 = (XSLFAutoShape) shapes2.get(1);
- List<XSLFTextParagraph> paragraphs2 = sh2.getTextParagraphs();
- assertEquals(2, paragraphs2.size());
- assertEquals("Subtitle", paragraphs2.get(0).getText());
- assertEquals("And second line", paragraphs2.get(1).getText());
-
- assertEquals(1, paragraphs2.get(0).getTextRuns().size());
- assertEquals(1, paragraphs2.get(1).getTextRuns().size());
-
- assertEquals("Subtitle", paragraphs2.get(0).getTextRuns().get(0).getRawText());
- assertTrue(paragraphs2.get(0).getTextRuns().get(0).getRPr(false).getB());
- assertEquals("And second line", paragraphs2.get(1).getTextRuns().get(0).getRawText());
+ try (XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx")) {
+ List<XSLFSlide> slides = ppt.getSlides();
- ppt.close();
+ XSLFSlide slide1 = slides.get(0);
+ List<XSLFShape> shapes1 = slide1.getShapes();
+ assertEquals(7, shapes1.size());
+ assertEquals("TextBox 3", shapes1.get(0).getShapeName());
+ XSLFAutoShape sh0 = (XSLFAutoShape) shapes1.get(0);
+ assertEquals("Learning PPTX", sh0.getText());
+ List<XSLFTextParagraph> paragraphs0 = sh0.getTextParagraphs();
+ assertEquals(1, paragraphs0.size());
+ XSLFTextParagraph p0 = paragraphs0.get(0);
+ assertEquals("Learning PPTX", p0.getText());
+ assertEquals(1, p0.getTextRuns().size());
+ XSLFTextRun r0 = p0.getTextRuns().get(0);
+ assertEquals("Learning PPTX", r0.getRawText());
+
+ XSLFSlide slide2 = slides.get(1);
+ List<XSLFShape> shapes2 = slide2.getShapes();
+ assertTrue(shapes2.get(0) instanceof XSLFAutoShape);
+ assertEquals("PPTX Title", ((XSLFAutoShape) shapes2.get(0)).getText());
+ XSLFAutoShape sh1 = (XSLFAutoShape) shapes2.get(0);
+ List<XSLFTextParagraph> paragraphs1 = sh1.getTextParagraphs();
+ assertEquals(1, paragraphs1.size());
+ XSLFTextParagraph p1 = paragraphs1.get(0);
+ assertEquals("PPTX Title", p1.getText());
+ List<XSLFTextRun> r2 = paragraphs1.get(0).getTextRuns();
+ assertEquals(2, r2.size());
+ assertEquals("PPTX ", r2.get(0).getRawText());
+ assertEquals("Title", r2.get(1).getRawText());
+ // Title is underlined
+ assertEquals(STTextUnderlineType.SNG, r2.get(1).getRPr(false).getU());
+
+
+ assertTrue(shapes2.get(1) instanceof XSLFAutoShape);
+ assertEquals("Subtitle\nAnd second line", ((XSLFAutoShape) shapes2.get(1)).getText());
+ XSLFAutoShape sh2 = (XSLFAutoShape) shapes2.get(1);
+ List<XSLFTextParagraph> paragraphs2 = sh2.getTextParagraphs();
+ assertEquals(2, paragraphs2.size());
+ assertEquals("Subtitle", paragraphs2.get(0).getText());
+ assertEquals("And second line", paragraphs2.get(1).getText());
+
+ assertEquals(1, paragraphs2.get(0).getTextRuns().size());
+ assertEquals(1, paragraphs2.get(1).getTextRuns().size());
+
+ assertEquals("Subtitle", paragraphs2.get(0).getTextRuns().get(0).getRawText());
+ assertTrue(paragraphs2.get(0).getTextRuns().get(0).getRPr(false).getB());
+ assertEquals("And second line", paragraphs2.get(1).getTextRuns().get(0).getRawText());
+ }
+ }
+
+ @Test
+ void testReplaceTextInShapes() throws IOException {
+ try (
+ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
+ UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream()
+ ) {
+ assertEquals(6, ppt.getSlides().size());
+ XSLFSlide slide0 = ppt.getSlides().get(0);
+ for (XSLFShape shape : slide0.getShapes()) {
+ if (shape instanceof XSLFTextShape) {
+ XSLFTextShape textShape = (XSLFTextShape) shape;
+ List<XSLFTextParagraph> textBoxParagraphs = textShape.getTextParagraphs();
+ List<XSLFTextRun> textBoxParagraphTextRuns = textBoxParagraphs.stream()
+ .map(XSLFTextParagraph::getTextRuns)
+ .flatMap(List::stream)
+ .collect(Collectors.toList());
+ int pos = 0;
+ for (XSLFTextRun r : textBoxParagraphTextRuns) {
+ r.setText("Replaced" + pos++);
+ }
+ }
+ }
+ ppt.write(bos);
+
+ try (XMLSlideShow ppt2 = new XMLSlideShow(bos.toInputStream())) {
+ assertEquals(6, ppt2.getSlides().size());
+ XSLFSlide updatedSlide = ppt2.getSlides().get(0);
+ for (XSLFShape shape : updatedSlide.getShapes()) {
+ if (shape instanceof XSLFTextShape) {
+ XSLFTextShape textShape = (XSLFTextShape) shape;
+ List<XSLFTextParagraph> textBoxParagraphs = textShape.getTextParagraphs();
+ List<XSLFTextRun> textBoxParagraphTextRuns = textBoxParagraphs.stream()
+ .map(XSLFTextParagraph::getTextRuns)
+ .flatMap(List::stream)
+ .collect(Collectors.toList());
+ int pos = 0;
+ for (XSLFTextRun r : textBoxParagraphTextRuns) {
+ assertEquals("Replaced" + pos++, r.getRawText());
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ void testReplaceTextInShapesXDDF() throws IOException {
+ try (
+ XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("shapes.pptx");
+ UnsynchronizedByteArrayOutputStream bos = new UnsynchronizedByteArrayOutputStream()
+ ) {
+ assertEquals(6, ppt.getSlides().size());
+ XSLFSlide slide0 = ppt.getSlides().get(0);
+ for (XSLFShape shape : slide0.getShapes()) {
+ if (shape instanceof XSLFTextShape) {
+ XSLFTextShape textShape = (XSLFTextShape) shape;
+ List<XDDFTextParagraph> textBoxParagraphs = textShape.getTextBody().getParagraphs();
+ List<XDDFTextRun> textBoxParagraphTextRuns = textBoxParagraphs.stream()
+ .map(XDDFTextParagraph::getTextRuns)
+ .flatMap(List::stream)
+ .collect(Collectors.toList());
+ int pos = 0;
+ for (XDDFTextRun r : textBoxParagraphTextRuns) {
+ r.setText("Replaced" + pos++);
+ }
+ }
+ }
+ ppt.write(bos);
+
+ try (XMLSlideShow ppt2 = new XMLSlideShow(bos.toInputStream())) {
+ assertEquals(6, ppt2.getSlides().size());
+ XSLFSlide updatedSlide = ppt2.getSlides().get(0);
+ for (XSLFShape shape : updatedSlide.getShapes()) {
+ if (shape instanceof XSLFTextShape) {
+ XSLFTextShape textShape = (XSLFTextShape) shape;
+ List<XDDFTextParagraph> textBoxParagraphs = textShape.getTextBody().getParagraphs();
+ List<XDDFTextRun> textBoxParagraphTextRuns = textBoxParagraphs.stream()
+ .map(XDDFTextParagraph::getTextRuns)
+ .flatMap(List::stream)
+ .collect(Collectors.toList());
+ int pos = 0;
+ for (XDDFTextRun r : textBoxParagraphTextRuns) {
+ assertEquals("Replaced" + pos++, r.getText());
+ }
+ }
+ }
+ }
+ }
}
@Test