EXPECTED_FAILURES.add("ddf/47143.dat");
}
+ private static final Set<String> IGNORED = new HashSet<String>();
+ static {
+ // need JDK8+ - https://bugs.openjdk.java.net/browse/JDK-8038081
+ IGNORED.add("slideshow/42474-2.ppt");
+ }
+
@Parameters(name="{index}: {0} using {1}")
public static Iterable<Object[]> files() {
DirectoryScanner scanner = new DirectoryScanner();
List<Object[]> files = new ArrayList<Object[]>();
for(String file : scanner.getIncludedFiles()) {
file = file.replace('\\', '/'); // ... failures/handlers lookup doesn't work on windows otherwise
+ if (IGNORED.contains(file)) continue;
files.add(new Object[] { file, HANDLERS.get(getExtension(file)) });
}
import java.io.InputStream;
import org.apache.poi.hslf.record.Record;
+import org.apache.poi.hslf.usermodel.HSLFSlideShow;
import org.apache.poi.hslf.usermodel.HSLFSlideShowImpl;
import org.junit.Test;
-public class HSLFFileHandler extends POIFSFileHandler {
+public class HSLFFileHandler extends SlideShowHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
HSLFSlideShowImpl slide = new HSLFSlideShowImpl(stream);
}
handlePOIDocument(slide);
+
+ HSLFSlideShow ss = new HSLFSlideShow(slide);
+ handleSlideShow(ss);
}
// a test-case to test this locally without executing the full TestAllFiles
--- /dev/null
+/* ====================================================================\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to You under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+==================================================================== */\r
+package org.apache.poi.stress;\r
+\r
+import static org.junit.Assert.assertNotNull;\r
+\r
+import java.awt.Dimension;\r
+import java.awt.Graphics2D;\r
+import java.awt.RenderingHints;\r
+import java.awt.image.BufferedImage;\r
+import java.io.ByteArrayInputStream;\r
+import java.io.ByteArrayOutputStream;\r
+import java.io.IOException;\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+\r
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;\r
+import org.apache.poi.sl.SlideShowFactory;\r
+import org.apache.poi.sl.draw.Drawable;\r
+import org.apache.poi.sl.usermodel.Notes;\r
+import org.apache.poi.sl.usermodel.Shape;\r
+import org.apache.poi.sl.usermodel.ShapeContainer;\r
+import org.apache.poi.sl.usermodel.Slide;\r
+import org.apache.poi.sl.usermodel.SlideShow;\r
+import org.apache.poi.sl.usermodel.TextParagraph;\r
+import org.apache.poi.sl.usermodel.TextRun;\r
+import org.apache.poi.sl.usermodel.TextShape;\r
+import org.apache.poi.util.JvmBugs;\r
+\r
+public abstract class SlideShowHandler extends POIFSFileHandler {\r
+ public void handleSlideShow(SlideShow ss) throws IOException {\r
+ renderSlides(ss);\r
+\r
+ readContent(ss);\r
+\r
+ // write out the file\r
+ ByteArrayOutputStream out = writeToArray(ss);\r
+ \r
+ readContent(ss);\r
+\r
+ // read in the writen file\r
+ SlideShow read;\r
+ try {\r
+ read = SlideShowFactory.create(new ByteArrayInputStream(out.toByteArray()));\r
+ } catch (InvalidFormatException e) {\r
+ throw new IllegalStateException(e);\r
+ }\r
+ assertNotNull(read);\r
+ \r
+ readContent(read);\r
+ \r
+ }\r
+\r
+ private ByteArrayOutputStream writeToArray(SlideShow ss) throws IOException {\r
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();\r
+ try {\r
+ ss.write(stream);\r
+ } finally {\r
+ stream.close();\r
+ }\r
+ \r
+ return stream;\r
+ }\r
+\r
+ \r
+ private void readContent(SlideShow ss) {\r
+ for (Slide<?,?,? extends Notes<?,?>> s : ss.getSlides()) {\r
+ s.getTitle();\r
+ readText(s);\r
+ readText(s.getNotes());\r
+ readText(s.getMasterSheet());\r
+ }\r
+ }\r
+ \r
+ @SuppressWarnings("unchecked")\r
+ private void readText(ShapeContainer<?> sc) {\r
+ if (sc == null) return;\r
+ for (Shape s : sc) {\r
+ if (s instanceof TextShape) {\r
+ for (TextParagraph<? extends TextRun> tp : (TextShape<TextParagraph<? extends TextRun>>)s) {\r
+ for (TextRun tr : tp) {\r
+ tr.getRawText();\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ private void renderSlides(SlideShow ss) {\r
+ Dimension pgsize = ss.getPageSize();\r
+\r
+ for (Slide<?,?,?> s : ss.getSlides()) {\r
+ BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_ARGB);\r
+ Graphics2D graphics = img.createGraphics();\r
+ fixFonts(graphics);\r
+\r
+ // default rendering options\r
+ graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);\r
+ graphics.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);\r
+ graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);\r
+ graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);\r
+ \r
+ // draw stuff\r
+ s.draw(graphics);\r
+ \r
+ graphics.dispose();\r
+ img.flush();\r
+ }\r
+ }\r
+\r
+ @SuppressWarnings("unchecked")\r
+ private static void fixFonts(Graphics2D graphics) {\r
+ if (!JvmBugs.hasLineBreakMeasurerBug()) return;\r
+ Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(Drawable.FONT_MAP);\r
+ if (fontMap == null) fontMap = new HashMap<String,String>();\r
+ fontMap.put("Calibri", "Lucida Sans");\r
+ fontMap.put("Cambria", "Lucida Bright");\r
+ graphics.setRenderingHint(Drawable.FONT_MAP, fontMap); \r
+ }\r
+\r
+}
\ No newline at end of file
import static org.junit.Assert.assertNotNull;
-import java.awt.Dimension;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.io.IOException;
import java.io.InputStream;
-import org.apache.poi.openxml4j.opc.OPCPackage;
-import org.apache.poi.sl.draw.DrawFactory;
-import org.apache.poi.sl.draw.Drawable;
import org.apache.poi.xslf.XSLFSlideShow;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
-import org.apache.poi.xslf.usermodel.XSLFNotes;
-import org.apache.poi.xslf.usermodel.XSLFShape;
-import org.apache.poi.xslf.usermodel.XSLFSlide;
-import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
-import org.apache.poi.xslf.usermodel.XSLFTextShape;
import org.junit.Test;
-public class XSLFFileHandler extends AbstractFileHandler {
+public class XSLFFileHandler extends SlideShowHandler {
@Override
public void handleFile(InputStream stream) throws Exception {
- XSLFSlideShow slide = new XSLFSlideShow(OPCPackage.open(stream));
- assertNotNull(slide.getPresentation());
- assertNotNull(slide.getSlideMasterReferences());
- assertNotNull(slide.getSlideReferences());
+ XMLSlideShow slide = new XMLSlideShow(stream);
+ XSLFSlideShow slideInner = new XSLFSlideShow(slide.getPackage());
+ assertNotNull(slideInner.getPresentation());
+ assertNotNull(slideInner.getSlideMasterReferences());
+ assertNotNull(slideInner.getSlideReferences());
new POIXMLDocumentHandler().handlePOIXMLDocument(slide);
- ByteArrayOutputStream out = new ByteArrayOutputStream();
- try {
- slide.write(out);
- } finally {
- out.close();
- }
+ handleSlideShow(slide);
- createBitmaps(out);
+ slideInner.close();
+ slide.close();
}
- private void createBitmaps(ByteArrayOutputStream out) throws IOException {
- XMLSlideShow ppt = new XMLSlideShow(new ByteArrayInputStream(out.toByteArray()));
- Dimension pgsize = ppt.getPageSize();
- for (XSLFSlide xmlSlide : ppt.getSlides()) {
-// System.out.println("slide-" + (i + 1));
-// System.out.println("" + xmlSlide[i].getTitle());
-
- BufferedImage img = new BufferedImage(pgsize.width, pgsize.height, BufferedImage.TYPE_INT_RGB);
- Graphics2D graphics = img.createGraphics();
-
- // draw stuff
- xmlSlide.draw(graphics);
-
- // Also try to read notes
- XSLFNotes notes = xmlSlide.getNotes();
- if(notes != null) {
- for (XSLFShape note : notes) {
- DrawFactory df = DrawFactory.getInstance(graphics);
- Drawable d = df.getDrawable(note);
- d.draw(graphics);
-
- if (note instanceof XSLFTextShape) {
- XSLFTextShape txShape = (XSLFTextShape) note;
- for (XSLFTextParagraph xslfParagraph : txShape.getTextParagraphs()) {
- xslfParagraph.getText();
- }
- }
- }
- }
- }
-
- ppt.close();
- }
-
// a test-case to test this locally without executing the full TestAllFiles
@Test
public void test() throws Exception {
import java.awt.Dimension;
import java.io.IOException;
+import java.io.OutputStream;
import java.util.List;
import org.apache.poi.sl.usermodel.PictureData.PictureType;
* @return the new picture reference
*/
PictureData addPicture(byte[] pictureData, PictureType format) throws IOException;
+
+ /**
+ * Writes out the slideshow file the is represented by an instance of this
+ * class
+ *
+ * @param out
+ * The OutputStream to write to.
+ * @throws IOException
+ * If there is an unexpected IOException from the passed in
+ * OutputStream
+ */
+ void write(OutputStream out) throws IOException;
}
import org.apache.poi.sl.usermodel.StrokeStyle.LineCompound;
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogger;
import org.apache.poi.util.Units;
/**
}
public Guide getAdjustValue(String name) {
- if (name == null || !name.matches("adj([1-9]|10)")) {
+ if (name == null || !name.matches("adj([1-9]|10)?")) {
throw new IllegalArgumentException("Adjust value '"+name+"' not supported.");
}
+
+ name = name.replace("adj", "");
+ if ("".equals(name)) name = "1";
+
short escherProp;
- switch (Integer.parseInt(name.substring(3))) {
+ switch (Integer.parseInt(name)) {
case 1: escherProp = EscherProperties.GEOMETRY__ADJUSTVALUE; break;
case 2: escherProp = EscherProperties.GEOMETRY__ADJUST2VALUE; break;
case 3: escherProp = EscherProperties.GEOMETRY__ADJUST3VALUE; break;
}
public CustomGeometry getGeometry() {
+ PresetGeometries dict = PresetGeometries.getInstance();
ShapeType st = getShapeType();
String name = st.getOoxmlName();
-
- PresetGeometries dict = PresetGeometries.getInstance();
CustomGeometry geom = dict.get(name);
if(geom == null) {
- throw new IllegalStateException("Unknown shape geometry: " + name);
+ if (name == null && st != null) name = st.toString();
+ logger.log(POILogger.WARN, "No preset shape definition for shapeType: "+name);
+ return null;
}
return geom;
}
}
- /**
- * Writes out the slideshow file the is represented by an instance of this
- * class
- *
- * @param out
- * The OutputStream to write to.
- * @throws IOException
- * If there is an unexpected IOException from the passed in
- * OutputStream
- */
+ @Override
public void write(OutputStream out) throws IOException {
// check for text paragraph modifications
for (HSLFSlide sl : getSlides()) {
// Build the PictureData object from the data
try {
HSLFPictureData pict = HSLFPictureData.create(pt);
+ pict.setSignature(signature);
// Copy the data, ready to pass to PictureData
byte[] imgdata = new byte[imgsize];