From 83b3ab61241f8cf8860794ede318d365b060385a Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Wed, 8 Feb 2012 13:44:12 +0000 Subject: [PATCH] support caching images in xslf git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1241896 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xslf/usermodel/XMLSlideShow.java | 58 +++++++++++-------- .../poi/xslf/usermodel/XSLFPictureData.java | 7 +++ .../xslf/usermodel/TestXSLFPictureShape.java | 17 ++++++ 3 files changed, 59 insertions(+), 23 deletions(-) diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java index 9ffcee684..22f7ea4a3 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XMLSlideShow.java @@ -19,17 +19,10 @@ package org.apache.poi.xslf.usermodel; import org.apache.poi.POIXMLDocument; import org.apache.poi.POIXMLDocumentPart; import org.apache.poi.POIXMLException; +import org.apache.poi.POIXMLRelation; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; -import org.apache.poi.openxml4j.opc.OPCPackage; -import org.apache.poi.openxml4j.opc.PackagePart; -import org.apache.poi.openxml4j.opc.PackagePartName; -import org.apache.poi.openxml4j.opc.TargetMode; -import org.apache.poi.util.Beta; -import org.apache.poi.util.Internal; -import org.apache.poi.util.POILogFactory; -import org.apache.poi.util.POILogger; -import org.apache.poi.util.PackageHelper; -import org.apache.poi.util.Units; +import org.apache.poi.openxml4j.opc.*; +import org.apache.poi.util.*; import org.apache.poi.xslf.XSLFSlideShow; import org.apache.xmlbeans.XmlException; import org.apache.xmlbeans.XmlObject; @@ -338,21 +331,40 @@ public class XMLSlideShow extends POIXMLDocument { * @see XSLFPictureData#PICTURE_TYPE_DIB */ public int addPicture(byte[] pictureData, int format) { - getAllPictures(); - - int imageNumber = _pictures.size() + 1; - XSLFPictureData img = (XSLFPictureData) createRelationship( - XSLFPictureData.RELATIONS[format], XSLFFactory.getInstance(), imageNumber, true); - _pictures.add(img); - try { - OutputStream out = img.getPackagePart().getOutputStream(); - out.write(pictureData); - out.close(); - } catch (IOException e) { - throw new POIXMLException(e); + XSLFPictureData img = findPictureData(pictureData); + POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format]; + + if(img == null) { + int imageNumber = _pictures.size(); + img = (XSLFPictureData) createRelationship( + XSLFPictureData.RELATIONS[format], XSLFFactory.getInstance(), imageNumber + 1, true); + _pictures.add(img); + try { + OutputStream out = img.getPackagePart().getOutputStream(); + out.write(pictureData); + out.close(); + } catch (IOException e) { + throw new POIXMLException(e); + } + return _pictures.size() - 1; + } else { + return _pictures.indexOf(img); } - return imageNumber - 1; } + + /** + * check if a picture with this picture data already exists in this presentation + */ + XSLFPictureData findPictureData(byte[] pictureData){ + long checksum = IOUtils.calculateChecksum(pictureData); + for(XSLFPictureData pic : getAllPictures()){ + if(pic.getChecksum() == checksum) { + return pic; + } + } + return null; + } + public XSLFTableStyles getTableStyles(){ return _tableStyles; } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java index 6fd151ff1..5bf370362 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFPictureData.java @@ -168,4 +168,11 @@ public final class XSLFPictureData extends POIXMLDocumentPart { return 0; } + long getChecksum(){ + if(checksum == null){ + byte[] pictureData = getData(); + checksum = IOUtils.calculateChecksum(pictureData); + } + return checksum; + } } \ No newline at end of file diff --git a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java index 7d42efa38..bf56481f5 100644 --- a/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java +++ b/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFPictureShape.java @@ -113,4 +113,21 @@ public class TestXSLFPictureShape extends TestCase { assertTrue(Arrays.equals(data1, data.getData())); } } + + public void testImageCaching() { + XMLSlideShow ppt = new XMLSlideShow(); + byte[] img1 = new byte[]{1,2,3}; + byte[] img2 = new byte[]{3,4,5}; + int idx1 = ppt.addPicture(img1, XSLFPictureData.PICTURE_TYPE_PNG); + assertEquals(0, idx1); + assertEquals(0, ppt.addPicture(img1, XSLFPictureData.PICTURE_TYPE_PNG)); + + int idx2 = ppt.addPicture(img2, XSLFPictureData.PICTURE_TYPE_PNG); + assertEquals(1, idx2); + assertEquals(1, ppt.addPicture(img2, XSLFPictureData.PICTURE_TYPE_PNG)); + + XSLFSlide slide1 = ppt.createSlide(); + XSLFSlide slide2 = ppt.createSlide(); + + } } \ No newline at end of file