import org.apache.poi.POIDocument;
import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.POILogFactory;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.DocumentInputStream;
public class HSLFSlideShow extends POIDocument
{
+ // For logging
+ protected POILogger logger = POILogFactory.getLogger(this.getClass());
+
private InputStream istream;
// Holds metadata on where things are in our document
try {
currentUser = new CurrentUserAtom(filesystem);
} catch(IOException ie) {
- System.err.println("Error finding Current User Atom:\n" + ie);
+ logger.log(POILogger.ERROR, "Error finding Current User Atom:\n" + ie);
currentUser = new CurrentUserAtom();
}
}
// If they type (including the bonus 0xF018) is 0, skip it
if(type == 0) {
- System.err.println("Problem reading picture: Invalid image type 0, on picture with length " + imgsize + ".\nYou document will probably become corrupted if you save it!");
- System.err.println(pos);
+ logger.log(POILogger.ERROR, "Problem reading picture: Invalid image type 0, on picture with length " + imgsize + ".\nYou document will probably become corrupted if you save it!");
+ logger.log(POILogger.ERROR, "" + pos);
} else {
// Copy the data, ready to pass to PictureData
byte[] imgdata = new byte[imgsize];
pict.setOffset(offset);
p.add(pict);
} catch(IllegalArgumentException e) {
- System.err.println("Problem reading picture: " + e + "\nYou document will probably become corrupted if you save it!");
+ logger.log(POILogger.ERROR, "Problem reading picture: " + e + "\nYou document will probably become corrupted if you save it!");
}
}
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hslf.record.Document;
import org.apache.poi.hslf.blip.Bitmap;
+import org.apache.poi.util.POILogger;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
public int getPictureIndex(){
EscherOptRecord opt = (EscherOptRecord)getEscherChild(_escherContainer, EscherOptRecord.RECORD_ID);
EscherSimpleProperty prop = (EscherSimpleProperty)getEscherProperty(opt, EscherProperties.BLIP__BLIPTODISPLAY + 0x4000);
- return prop.getPropertyValue();
+ return prop == null ? 0 : prop.getPropertyValue();
}
/**
EscherContainerRecord bstore = (EscherContainerRecord)Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
List lst = bstore.getChildRecords();
- int idx = getPictureIndex()-1;
- EscherBSERecord bse = (EscherBSERecord)lst.get(idx);
- for ( int i = 0; i < pict.length; i++ ) {
- if (pict[i].getOffset() == bse.getOffset()){
- return pict[i];
+ int idx = getPictureIndex();
+ if (idx == 0){
+ logger.log(POILogger.ERROR, "no reference to picture data found ");
+ } else {
+ EscherBSERecord bse = (EscherBSERecord)lst.get(idx-1);
+ for ( int i = 0; i < pict.length; i++ ) {
+ if (pict[i].getOffset() == bse.getOffset()){
+ return pict[i];
+ }
}
+ logger.log(POILogger.ERROR, "no picture found for our BSE offset " + bse.getOffset());
}
- System.err.println("Warning - no picture found for our BSE offset " + bse.getOffset());
return null;
}
import org.apache.poi.ddf.*;
import org.apache.poi.hslf.model.ShapeTypes;
import org.apache.poi.hslf.record.ColorSchemeAtom;
+import org.apache.poi.util.POILogger;
+import org.apache.poi.util.POILogFactory;
import java.util.Iterator;
import java.awt.*;
*/
public abstract class Shape {
+ // For logging
+ protected POILogger logger = POILogFactory.getLogger(this.getClass());
+
/**
* In Escher absolute distances are specified in
* English Metric Units (EMUs), occasionally referred to as A units;
* @return name of the shape.
*/
public String getShapeName(){
- EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
- return ShapeTypes.typeName(spRecord.getOptions() >> 4);
+ return ShapeTypes.typeName(getShapeType());
}
/**
import org.apache.poi.ddf.*;
import org.apache.poi.util.LittleEndian;
+import org.apache.poi.util.POILogger;
import java.util.ArrayList;
import java.util.List;
} else {
// Should we do anything special with these non
// Container records?
- System.err.println("Shape contained non container escher record, was " + r.getClass().getName());
+ logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName());
}
}
anchor.height = (spgr.getRectY2() - spgr.getRectY1())*POINT_DPI/MASTER_DPI;
return anchor;
}
+
+ /**
+ * Return type of the shape.
+ * In most cases shape group type is {@link org.apache.poi.hslf.model.ShapeTypes#NotPrimitive}
+ *
+ * @return type of the shape.
+ */
+ public int getShapeType(){
+ EscherContainerRecord groupInfoContainer = (EscherContainerRecord)_escherContainer.getChild(0);
+ EscherSpRecord spRecord = groupInfoContainer.getChildById(EscherSpRecord.RECORD_ID);
+ return spRecord.getOptions() >> 4;
+ }
+
}
import org.apache.poi.hslf.record.*;
import org.apache.poi.hslf.usermodel.RichTextRun;
import org.apache.poi.hslf.exceptions.HSLFException;
+import org.apache.poi.util.POILogger;
import java.awt.*;
import java.awt.font.FontRenderContext;
_txtrun = new TextRun(tha,tca,sta);
} else {
// Empty text box
- System.err.println("Warning - no text records found for TextBox");
+ logger.log(POILogger.WARN, "no text records found for TextBox");
}
}
}
}\r
\r
private void verify(Sheet sheet){\r
+ assertNotNull(sheet.getSlideShow());\r
+\r
ColorSchemeAtom colorscheme = sheet.getColorScheme();\r
assertNotNull(colorscheme);\r
\r
Shape[] shape = sheet.getShapes();\r
assertTrue(shape != null);\r
for (int i = 0; i < shape.length; i++) {\r
+ assertNotNull(shape[i].getSpContainer());\r
assertNotNull(shape[i].getSheet());\r
+ assertNotNull(shape[i].getShapeName());\r
+ assertNotNull(shape[i].getAnchor());\r
}\r
\r
- assertNotNull(sheet.getSlideShow());\r
}\r
}\r
import junit.framework.TestCase;\r
import org.apache.poi.hslf.HSLFSlideShow;\r
import org.apache.poi.hslf.model.*;\r
+import org.apache.poi.hslf.model.Shape;\r
\r
import java.io.*;\r
import java.util.HashSet;\r
import java.util.HashMap;\r
+import java.awt.*;\r
\r
/**\r
* Testcases for bugs entered in bugzilla\r
\r
}\r
\r
+ /**\r
+ * Bug 42524: NPE in Shape.getShapeType()\r
+ */\r
+ public void test42524 () throws Exception {\r
+ FileInputStream is = new FileInputStream(new File(cwd, "42486.ppt")); //test file is the same as for Bug 42486\r
+ HSLFSlideShow hslf = new HSLFSlideShow(is);\r
+ is.close();\r
+\r
+ SlideShow ppt = new SlideShow(hslf);\r
+ //walk down the tree and see if there were no errors while reading\r
+ Slide[] slide = ppt.getSlides();\r
+ for (int i = 0; i < slide.length; i++) {\r
+ Shape[] shape = slide[i].getShapes();\r
+ for (int j = 0; j < shape.length; j++) {\r
+ assertNotNull(shape[j].getShapeName());\r
+ if (shape[j] instanceof ShapeGroup){\r
+ ShapeGroup group = (ShapeGroup)shape[j];\r
+ Shape[] comps = group.getShapes();\r
+ for (int k = 0; k < comps.length; k++) {\r
+ assertNotNull(comps[k].getShapeName());\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+ assertTrue("No Exceptions while reading file", true);\r
+\r
+ }\r
+\r
+ /**\r
+ * Bug 42520: NPE in Picture.getPictureData()\r
+ */\r
+ public void test42520 () throws Exception {\r
+ FileInputStream is = new FileInputStream(new File(cwd, "42520.ppt")); //test file is the same as for Bug 42486\r
+ HSLFSlideShow hslf = new HSLFSlideShow(is);\r
+ is.close();\r
+\r
+ SlideShow ppt = new SlideShow(hslf);\r
+\r
+ //test case from the bug report\r
+ ShapeGroup shapeGroup = (ShapeGroup)ppt.getSlides()[11].getShapes()[10];\r
+ Picture picture = (Picture)shapeGroup.getShapes()[0];\r
+ picture.getPictureData();\r
+\r
+ //walk down the tree and see if there were no errors while reading\r
+ Slide[] slide = ppt.getSlides();\r
+ for (int i = 0; i < slide.length; i++) {\r
+ Shape[] shape = slide[i].getShapes();\r
+ for (int j = 0; j < shape.length; j++) {\r
+ if (shape[j] instanceof ShapeGroup){\r
+ ShapeGroup group = (ShapeGroup)shape[j];\r
+ Shape[] comps = group.getShapes();\r
+ for (int k = 0; k < comps.length; k++) {\r
+ Shape comp = comps[k];\r
+ if (comp instanceof Picture){\r
+ PictureData pict = ((Picture)comp).getPictureData();\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ }\r
+ assertTrue("No Exceptions while reading file", true);\r
+\r
+ }\r
+\r
}\r