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 = "" + + "10" + + ""; + 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. */