]> source.dussan.org Git - poi.git/commitdiff
#62319 - handle slide layouts in extractor
authorAndreas Beeker <kiwiwings@apache.org>
Fri, 20 Apr 2018 20:00:46 +0000 (20:00 +0000)
committerAndreas Beeker <kiwiwings@apache.org>
Fri, 20 Apr 2018 20:00:46 +0000 (20:00 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1829677 13f79535-47bb-0310-9956-ffa450edef68

src/java/org/apache/poi/sl/extractor/SlideShowExtractor.java
src/java/org/apache/poi/sl/usermodel/Slide.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFSlide.java
src/ooxml/testcases/org/apache/poi/xslf/extractor/TestXSLFPowerPointExtractor.java
src/scratchpad/src/org/apache/poi/hslf/usermodel/HSLFSlide.java

index a7283acbee0eae1f1592b2e92c54bfe9b7ca5820..ec87c99613c4814fa7a016535c7b4c32472161eb 100644 (file)
@@ -116,30 +116,6 @@ public class SlideShowExtractor<
     public String getText() {
         final StringBuilder sb = new StringBuilder();
         
-        if (masterByDefault) {
-            for (final MasterSheet<S,P> master : slideshow.getSlideMasters()) {
-                for (final Shape<S,P> shape : master) {
-                    if (shape instanceof TextShape) {
-                        final TextShape<S,P> ts = (TextShape<S,P>)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<S, P> slide : slideshow.getSlides()) {
             sb.append(getText(slide));
         }
@@ -154,6 +130,17 @@ public class SlideShowExtractor<
             printShapeText(slide, sb);
         }
 
+        if (masterByDefault) {
+            final MasterSheet<S,P> ms = slide.getMasterSheet();
+            printSlideMaster(ms, sb);
+
+            // only print slide layout, if it's a different instance
+            final MasterSheet<S,P> 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<S,P> master, final StringBuilder sb) {
+        if (master == null) {
+            return;
+        }
+        for (final Shape<S,P> shape : master) {
+            if (shape instanceof TextShape) {
+                final TextShape<S,P> ts = (TextShape<S,P>)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<S,P> sheet, final StringBuilder sb) {
         final Sheet<S, P> m = (sheet instanceof Slide) ? sheet.getMasterSheet() : sheet;
         final StringBuilder footer = new StringBuilder("\n");
index f5aed9273edfdc450170ed9756f7811bb19124ea..00492df5fc757631edf0ad73ee39508210895c2a 100644 (file)
@@ -76,4 +76,11 @@ public interface Slide<
      * @return the comment(s) for this slide
      */
     List<? extends Comment> getComments();
+
+    /**
+     * @return the assigned slide layout
+     *
+     * @since POI 4.0.0
+     */
+    MasterSheet getSlideLayout();
 }
index 7ba272ed63dad306abcb52e457f9cab22fb6af05..4df63e265546ed8f041762011ad19383844a1ba9 100644 (file)
@@ -141,6 +141,7 @@ implements Slide<XSLFShape,XSLFTextParagraph> {
         return getSlideLayout();
     }
 
+    @Override
     public XSLFSlideLayout getSlideLayout(){
         if(_layout == null){
             for (POIXMLDocumentPart p : getRelations()) {
index 353ce7cbd4da1a0cc099dcbcd85945e69b3846c2..96ab24ba4ea4e4d8f6a6d33e67f0b99e6109defc 100644 (file)
@@ -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);
         }
index 2f81b8a8f933848bc3086c63fee27304d91773e6..5bae46a8ad33ed2c6f219c1d33e1c8613ca33491 100644 (file)
@@ -501,4 +501,12 @@ public final class HSLFSlide extends HSLFSheet implements Slide<HSLFShape,HSLFTe
             return false;
         }
     }
+
+    @Override
+    public HSLFMasterSheet getSlideLayout(){
+        // TODO: find out how we can find the mastersheet base on the slide layout type, i.e.
+        // getSlideRecord().getSlideAtom().getSSlideLayoutAtom().getGeometryType()
+        return getMasterSheet();
+    }
+
 }