diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java
index 3683f033ae2..0e6c2d65396 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFPictureData.java
@@ -57,7 +57,7 @@ public static int getMaxImageSize() {
*/
protected static final POIXMLRelation[] RELATIONS;
static {
- RELATIONS = new POIXMLRelation[13];
+ RELATIONS = new POIXMLRelation[15];
RELATIONS[Workbook.PICTURE_TYPE_EMF] = XSSFRelation.IMAGE_EMF;
RELATIONS[Workbook.PICTURE_TYPE_WMF] = XSSFRelation.IMAGE_WMF;
RELATIONS[Workbook.PICTURE_TYPE_PICT] = XSSFRelation.IMAGE_PICT;
@@ -69,6 +69,7 @@ public static int getMaxImageSize() {
RELATIONS[XSSFWorkbook.PICTURE_TYPE_EPS] = XSSFRelation.IMAGE_EPS;
RELATIONS[XSSFWorkbook.PICTURE_TYPE_BMP] = XSSFRelation.IMAGE_BMP;
RELATIONS[XSSFWorkbook.PICTURE_TYPE_WPG] = XSSFRelation.IMAGE_WPG;
+ RELATIONS[XSSFWorkbook.PICTURE_TYPE_SVG] = XSSFRelation.IMAGE_SVG;
}
/**
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRelation.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
index 5012767b598..c827143e959 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRelation.java
@@ -239,6 +239,13 @@ public final class XSSFRelation extends POIXMLRelation {
XSSFPictureData::new, XSSFPictureData::new
);
+ public static final XSSFRelation IMAGE_SVG = new XSSFRelation(
+ PictureData.PictureType.SVG.contentType,
+ PackageRelationshipTypes.IMAGE_PART,
+ "/xl/media/image#.svg",
+ XSSFPictureData::new, XSSFPictureData::new
+ );
+
public static final XSSFRelation HDPHOTO_WDP = new XSSFRelation(
PictureData.PictureType.WDP.contentType,
PackageRelationshipTypes.HDPHOTO_PART,
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSignatureLine.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSignatureLine.java
index 99a6ddd58b2..da81eb9bf1d 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSignatureLine.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFSignatureLine.java
@@ -126,6 +126,8 @@ private static POIXMLRelation mapType(PictureType type) throws InvalidFormatExce
return XSSFRelation.IMAGE_WMF;
case WPG:
return XSSFRelation.IMAGE_WPG;
+ case SVG:
+ return XSSFRelation.IMAGE_SVG;
default:
throw new InvalidFormatException("Unsupported picture format "+type);
}
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
index b1c63c6a983..f92b055b264 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFWorkbook.java
@@ -122,6 +122,8 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook, Date1904Su
public static final int PICTURE_TYPE_EPS = 10;
public static final int PICTURE_TYPE_BMP = 11;
public static final int PICTURE_TYPE_WPG = 12;
+ // Picture Type WDP has ooxmlId 13 but is currently not implemented
+ public static final int PICTURE_TYPE_SVG = 14;
/**
* The underlying XML bean
@@ -592,6 +594,12 @@ public CTWorkbook getCTWorkbook() {
* @see Workbook#PICTURE_TYPE_JPEG
* @see Workbook#PICTURE_TYPE_PNG
* @see Workbook#PICTURE_TYPE_DIB
+ * @see #PICTURE_TYPE_GIF
+ * @see #PICTURE_TYPE_TIFF
+ * @see #PICTURE_TYPE_EPS
+ * @see #PICTURE_TYPE_BMP
+ * @see #PICTURE_TYPE_WPG
+ * @see #PICTURE_TYPE_SVG
* @see #getAllPictures()
*/
@Override
@@ -620,6 +628,12 @@ public int addPicture(byte[] pictureData, int format) {
* @see Workbook#PICTURE_TYPE_JPEG
* @see Workbook#PICTURE_TYPE_PNG
* @see Workbook#PICTURE_TYPE_DIB
+ * @see #PICTURE_TYPE_GIF
+ * @see #PICTURE_TYPE_TIFF
+ * @see #PICTURE_TYPE_EPS
+ * @see #PICTURE_TYPE_BMP
+ * @see #PICTURE_TYPE_WPG
+ * @see #PICTURE_TYPE_SVG
* @see #getAllPictures()
*/
public int addPicture(InputStream is, int format) throws IOException {
diff --git a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java
index fa1cb561369..8b1e68e6df4 100644
--- a/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java
+++ b/poi-ooxml/src/test/java/org/apache/poi/xssf/usermodel/TestXSSFPictureData.java
@@ -143,6 +143,39 @@ void testNewPictFormat() throws IOException {
}
}
+ @Test
+ void testNewSvgFormat() throws IOException {
+ try (XSSFWorkbook wb = new XSSFWorkbook()) {
+ XSSFSheet sheet = wb.createSheet();
+ XSSFDrawing drawing = sheet.createDrawingPatriarch();
+ String svg = "";
+ byte[] data = svg.getBytes(LocaleUtil.CHARSET_1252);
+
+ List pictures = wb.getAllPictures();
+ assertEquals(0, pictures.size());
+
+ int idx = wb.addPicture(data, XSSFWorkbook.PICTURE_TYPE_SVG);
+ assertEquals(1, pictures.size());
+ assertEquals("svg", pictures.get(idx).suggestFileExtension());
+ assertArrayEquals(data, pictures.get(idx).getData());
+
+ //TODO finish usermodel API for XSSFPicture
+ XSSFPicture p1 = drawing.createPicture(new XSSFClientAnchor(), idx);
+ assertNotNull(p1);
+
+ //check that the added pictures are accessible after write
+ try (XSSFWorkbook wbBack = XSSFTestDataSamples.writeOutAndReadBack(wb)) {
+ List pictures2 = wbBack.getAllPictures();
+ assertEquals(1, pictures2.size());
+
+ assertEquals("svg", pictures2.get(idx).suggestFileExtension());
+ assertArrayEquals(data, pictures2.get(idx).getData());
+ }
+ }
+ }
+
/**
* Bug 53568: XSSFPicture.getPictureData() can return null.
*/