From a276d5d3f6b3c332cde1d2cf586379c6af4e3a0b Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Fri, 20 Apr 2018 20:00:46 +0000 Subject: [PATCH] #62319 - handle slide layouts in extractor git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1829677 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/sl/extractor/SlideShowExtractor.java | 60 +++++++++++-------- .../org/apache/poi/sl/usermodel/Slide.java | 7 +++ .../apache/poi/xslf/usermodel/XSLFSlide.java | 1 + .../TestXSLFPowerPointExtractor.java | 4 -- .../apache/poi/hslf/usermodel/HSLFSlide.java | 8 +++ 5 files changed, 52 insertions(+), 28 deletions(-) diff --git a/src/java/org/apache/poi/sl/extractor/SlideShowExtractor.java b/src/java/org/apache/poi/sl/extractor/SlideShowExtractor.java index a7283acbee..ec87c99613 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 f5aed9273e..00492df5fc 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 7ba272ed63..4df63e2655 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 353ce7cbd4..96ab24ba4e 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 2f81b8a8f9..5bae46a8ad 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