From 8e3286a64cf452dbc3eaf34147083d7f24f2b200 Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Mon, 16 Sep 2019 19:55:23 +0000 Subject: [PATCH] Catch missing scratchpad state for EMF / WMF rendering git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1867025 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/sl/usermodel/SlideShowFactory.java | 7 ++++- .../org/apache/poi/xslf/util/PPTX2PNG.java | 27 ++++++++++++++++++- .../poi/xslf/usermodel/TestPPTX2PNG.java | 4 +-- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java b/src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java index bda928cfce..76f08dabe8 100644 --- a/src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java +++ b/src/java/org/apache/poi/sl/usermodel/SlideShowFactory.java @@ -295,8 +295,13 @@ public class SlideShowFactory { S extends Shape, P extends TextParagraph > SlideShow createSlideShow(String factoryClass, Object[] args) throws IOException, EncryptedDocumentException { + final Class clazz; + try { + clazz = SlideShowFactory.class.getClassLoader().loadClass(factoryClass); + } catch (ClassNotFoundException e) { + throw new IOException(factoryClass+" not found - check if poi-scratchpad.jar is on the classpath."); + } try { - Class clazz = SlideShowFactory.class.getClassLoader().loadClass(factoryClass); Class[] argsClz = new Class[args.length]; int i=0; for (Object o : args) { diff --git a/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java b/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java index 435de7a33d..4c7e27d558 100644 --- a/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java +++ b/src/ooxml/java/org/apache/poi/xslf/util/PPTX2PNG.java @@ -50,6 +50,7 @@ import java.util.stream.StreamSupport; import javax.imageio.ImageIO; import org.apache.poi.common.usermodel.GenericRecord; +import org.apache.poi.sl.draw.BitmapImageRenderer; import org.apache.poi.sl.draw.DrawPictureShape; import org.apache.poi.sl.draw.Drawable; import org.apache.poi.sl.draw.ImageRenderer; @@ -196,6 +197,7 @@ public class PPTX2PNG { } final Dimension2D pgsize = proxy.getSize(); + final double lenSide; switch (fixSide) { default: @@ -268,6 +270,9 @@ public class PPTX2PNG { graphics.dispose(); img.flush(); } + } catch (NoScratchpadException e) { + usage("'"+file.getName()+"': Format not supported - try to include poi-scratchpad.jar into the CLASSPATH."); + return; } if (!quiet) { @@ -322,7 +327,15 @@ public class PPTX2PNG { @Override public void parse(File file) throws IOException { - ppt = SlideShowFactory.create(file, null, true); + try { + ppt = SlideShowFactory.create(file, null, true); + } catch (IOException e) { + if (e.getMessage().contains("scratchpad")) { + throw new NoScratchpadException(e); + } else { + throw e; + } + } slide = ppt.getSlides().get(0); } @@ -403,6 +416,10 @@ public class PPTX2PNG { @Override public void parse(File file) throws IOException { imgr = DrawPictureShape.getImageRenderer(null, getContentType()); + if (imgr instanceof BitmapImageRenderer) { + throw new NoScratchpadException(); + } + // stream needs to be kept open is = file.toURI().toURL().openStream(); imgr.loadImage(is, getContentType()); @@ -452,4 +469,12 @@ public class PPTX2PNG { } } + private static class NoScratchpadException extends IOException { + public NoScratchpadException() { + } + + public NoScratchpadException(Throwable cause) { + super(cause); + } + } } diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java index 3002dd2832..718ed888d4 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestPPTX2PNG.java @@ -76,8 +76,8 @@ public class TestPPTX2PNG { @Test public void render() throws Exception { - assumeFalse("ignore HSLF / .ppt files in no-scratchpad run", xslfOnly && pptFile.toLowerCase(Locale.ROOT).endsWith("ppt")); - + assumeFalse("ignore HSLF (.ppt) / HEMF (.emf) / HWMF (.wmf) files in no-scratchpad run", xslfOnly && pptFile.matches(".*\\.(ppt|emf|wmf)$")); + String[] args = { "-format", "null", // png,gif,jpg or null for test "-slide", "-1", // -1 for all -- 2.39.5