diff --git a/src/java/org/apache/poi/sl/extractor/SlideShowExtractor.java b/src/java/org/apache/poi/sl/extractor/SlideShowExtractor.java index a7283acbe..ec87c9961 100644 --- a/src/java/org/apache/poi/sl/extractor/SlideShowExtractor.java +++ b/src/java/org/apache/poi/sl/extractor/SlideShowExtractor.java @@ -116,30 +116,6 @@ public class SlideShowExtractor< public String getText() { final StringBuilder sb = new StringBuilder(); - if (masterByDefault) { - for (final MasterSheet master : slideshow.getSlideMasters()) { - for (final Shape shape : master) { - if (shape instanceof TextShape) { - final TextShape ts = (TextShape)shape; - final String text = ts.getText(); - if (text == null || text.isEmpty() || "*".equals(text)) { - continue; - } - if (ts.isPlaceholder()) { - // don't bother about boiler plate text on master sheets - LOG.log(POILogger.INFO, "Ignoring boiler plate (placeholder) text on slide master:", text); - continue; - } - sb.append(text); - if (!text.endsWith("\n")) { - sb.append("\n"); - } - - } - } - } - } - for (final Slide slide : slideshow.getSlides()) { sb.append(getText(slide)); } @@ -154,6 +130,17 @@ public class SlideShowExtractor< printShapeText(slide, sb); } + if (masterByDefault) { + final MasterSheet ms = slide.getMasterSheet(); + printSlideMaster(ms, sb); + + // only print slide layout, if it's a different instance + final MasterSheet sl = slide.getSlideLayout(); + if (sl != ms) { + printSlideMaster(sl, sb); + } + } + if (commentsByDefault) { printComments(slide, sb); } @@ -165,6 +152,31 @@ public class SlideShowExtractor< return sb.toString(); } + private void printSlideMaster(final MasterSheet master, final StringBuilder sb) { + if (master == null) { + return; + } + for (final Shape shape : master) { + if (shape instanceof TextShape) { + final TextShape ts = (TextShape)shape; + final String text = ts.getText(); + if (text == null || text.isEmpty() || "*".equals(text)) { + continue; + } + if (ts.isPlaceholder()) { + // don't bother about boiler plate text on master sheets + LOG.log(POILogger.INFO, "Ignoring boiler plate (placeholder) text on slide master:", text); + continue; + } + sb.append(text); + if (!text.endsWith("\n")) { + sb.append("\n"); + } + + } + } + } + private String printHeaderReturnFooter(final Sheet sheet, final StringBuilder sb) { final Sheet m = (sheet instanceof Slide) ? sheet.getMasterSheet() : sheet; final StringBuilder footer = new StringBuilder("\n"); diff --git a/src/java/org/apache/poi/sl/usermodel/Slide.java b/src/java/org/apache/poi/sl/usermodel/Slide.java index f5aed9273..00492df5f 100644 --- a/src/java/org/apache/poi/sl/usermodel/Slide.java +++ b/src/java/org/apache/poi/sl/usermodel/Slide.java @@ -76,4 +76,11 @@ public interface Slide< * @return the comment(s) for this slide */ List getComments(); + + /** + * @return the assigned slide layout + * + * @since POI 4.0.0 + */ + MasterSheet getSlideLayout(); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java index 7ba272ed6..4df63e265 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java @@ -141,6 +141,7 @@ implements Slide { return getSlideLayout(); } + @Override public XSLFSlideLayout getSlideLayout(){ if(_layout == null){ for (POIXMLDocumentPart p : getRelations()) { diff --git a/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java b/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java index 353ce7cbd..96ab24ba4 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java @@ -177,7 +177,6 @@ public class TestXSLFPowerPointExtractor { } @Test - @Ignore("currently slidelayouts aren't yet supported") public void testGetMasterText() throws Exception { try (XMLSlideShow xml = openPPTX("WithMaster.pptx"); SlideShowExtractor extractor = new SlideShowExtractor(xml)) { @@ -205,13 +204,10 @@ public class TestXSLFPowerPointExtractor { String wholeText = "First page title\n" + "First page subtitle\n" + - "This is the Master Title\n" + "This text comes from the Master Slide\n" + "\n" + - // TODO Detect we didn't have a title, and include the master one "2nd page subtitle\n" + "Footer from the master slide\n" + - "This is the Master Title\n" + "This text comes from the Master Slide\n"; assertEquals(wholeText, text); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java index 2f81b8a8f..5bae46a8a 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java @@ -501,4 +501,12 @@ public final class HSLFSlide extends HSLFSheet implements Slide