2008-07-29 19:03:25 -04:00
|
|
|
package org.apache.poi.xssf.model;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.io.InputStream;
|
|
|
|
import java.io.OutputStream;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
|
|
|
import org.apache.poi.xssf.usermodel.XSSFPictureData;
|
2008-08-11 15:14:03 -04:00
|
|
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
2008-07-29 19:03:25 -04:00
|
|
|
import org.apache.xmlbeans.XmlException;
|
|
|
|
import org.apache.xmlbeans.XmlOptions;
|
|
|
|
import org.openxml4j.opc.PackagePart;
|
|
|
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDrawing;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* A drawing object in XSSF. May well have raw pictures
|
|
|
|
* attached to it as children.
|
|
|
|
*/
|
|
|
|
public class Drawing implements XSSFChildContainingModel {
|
|
|
|
private CTDrawing drawing;
|
|
|
|
private String originalId;
|
|
|
|
|
|
|
|
/** Raw pictures attached to the drawing */
|
|
|
|
private ArrayList<XSSFPictureData> pictures;
|
|
|
|
|
|
|
|
public Drawing(InputStream is, String originalId) throws IOException {
|
|
|
|
readFrom(is);
|
|
|
|
this.originalId = originalId;
|
|
|
|
this.pictures = new ArrayList<XSSFPictureData>();
|
|
|
|
}
|
|
|
|
|
|
|
|
public String getOriginalId() {
|
|
|
|
return this.originalId;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Drawing() {
|
|
|
|
this.drawing = CTDrawing.Factory.newInstance();
|
|
|
|
}
|
|
|
|
/**
|
|
|
|
* For unit testing only!
|
|
|
|
*/
|
|
|
|
protected Drawing(CTDrawing drawing) {
|
|
|
|
this.drawing = drawing;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void readFrom(InputStream is) throws IOException {
|
|
|
|
try {
|
|
|
|
CTDrawing doc = CTDrawing.Factory.parse(is);
|
|
|
|
drawing = doc;
|
|
|
|
} catch (XmlException e) {
|
|
|
|
throw new IOException(e.getLocalizedMessage());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
public void writeTo(OutputStream out) throws IOException {
|
|
|
|
XmlOptions options = new XmlOptions();
|
|
|
|
options.setSaveOuter();
|
|
|
|
options.setUseDefaultNamespace();
|
|
|
|
// Requests use of whitespace for easier reading
|
|
|
|
options.setSavePrettyPrint();
|
|
|
|
drawing.save(out, options);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2008-07-29 19:37:35 -04:00
|
|
|
* We expect image parts
|
2008-07-29 19:03:25 -04:00
|
|
|
*/
|
2008-07-29 19:37:35 -04:00
|
|
|
public String[] getChildrenRelationshipTypes() {
|
|
|
|
return new String[] {
|
2008-08-11 15:14:03 -04:00
|
|
|
XSSFRelation.IMAGES.getRelation()
|
2008-07-29 19:37:35 -04:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2008-07-29 20:29:55 -04:00
|
|
|
public int getNumberOfChildren() {
|
|
|
|
return pictures.size();
|
|
|
|
}
|
|
|
|
|
2008-07-29 19:37:35 -04:00
|
|
|
/**
|
|
|
|
* Generates and adds XSSFActiveXData children
|
|
|
|
*/
|
|
|
|
public void generateChild(PackagePart childPart, String childRelId) {
|
|
|
|
XSSFPictureData pd = new XSSFPictureData(childPart, childRelId);
|
|
|
|
pictures.add(pd);
|
2008-07-29 19:03:25 -04:00
|
|
|
}
|
2008-07-29 19:37:35 -04:00
|
|
|
|
2008-07-29 20:29:55 -04:00
|
|
|
public WritableChild getChildForWriting(int index) {
|
|
|
|
if(index >= pictures.size()) {
|
|
|
|
throw new IllegalArgumentException("Can't get child at " + index + " when size is " + getNumberOfChildren());
|
2008-07-29 19:03:25 -04:00
|
|
|
}
|
2008-07-29 20:29:55 -04:00
|
|
|
return new WritableChild(
|
|
|
|
pictures.get(index),
|
2008-08-11 15:14:03 -04:00
|
|
|
XSSFRelation.IMAGES
|
2008-07-29 20:29:55 -04:00
|
|
|
);
|
2008-07-29 19:03:25 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
public ArrayList<XSSFPictureData> getPictures()
|
|
|
|
{
|
|
|
|
return this.pictures;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void addPictures(XSSFPictureData picture)
|
|
|
|
{
|
|
|
|
this.pictures.add(picture);
|
|
|
|
}
|
|
|
|
}
|