diff options
author | Andreas Beeker <kiwiwings@apache.org> | 2019-09-16 19:55:23 +0000 |
---|---|---|
committer | Andreas Beeker <kiwiwings@apache.org> | 2019-09-16 19:55:23 +0000 |
commit | 8e3286a64cf452dbc3eaf34147083d7f24f2b200 (patch) | |
tree | 3f0b6579b0be6b9768b9b7e2a013a2bb74e4b363 | |
parent | 5245be1733b555f18a52162fd63cd38f064e725e (diff) | |
download | poi-8e3286a64cf452dbc3eaf34147083d7f24f2b200.tar.gz poi-8e3286a64cf452dbc3eaf34147083d7f24f2b200.zip |
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
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<S,P>, P extends TextParagraph<S,P,? extends TextRun> > SlideShow<S,P> 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 |