From 7c1efd4b1a22eb435c073c90344532b9e365a3b8 Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Tue, 19 Sep 2006 22:37:38 +0000 Subject: [PATCH] Improved picture support for HSLF, from Yegor in bug 40388 git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@448001 13f79535-47bb-0310-9956-ffa450edef68 --- .../content/xdocs/hslf/how-to-shapes.xml | 59 +++- .../org/apache/poi/hslf/HSLFSlideShow.java | 33 +- .../src/org/apache/poi/hslf/blip/Bitmap.java | 47 +++ .../src/org/apache/poi/hslf/blip/EMF.java | 92 +++++ .../src/org/apache/poi/hslf/blip/JPEG.java | 43 +++ .../org/apache/poi/hslf/blip/Metafile.java | 123 +++++++ .../src/org/apache/poi/hslf/blip/PICT.java | 117 ++++++ .../src/org/apache/poi/hslf/blip/PNG.java | 68 ++++ .../src/org/apache/poi/hslf/blip/WMF.java | 187 ++++++++++ .../poi/hslf/extractor/ImageExtractor.java | 75 ++++ .../org/apache/poi/hslf/model/Picture.java | 48 ++- .../poi/hslf/usermodel/PictureData.java | 255 +++++++------ .../apache/poi/hslf/usermodel/SlideShow.java | 21 +- .../org/apache/poi/hslf/data/cow.pict | Bin 0 -> 42414 bytes .../org/apache/poi/hslf/data/pictures.ppt | Bin 0 -> 75776 bytes .../org/apache/poi/hslf/data/santa.wmf | Bin 0 -> 28696 bytes .../org/apache/poi/hslf/data/tomcat.png | Bin 0 -> 3043 bytes .../org/apache/poi/hslf/data/wrench.emf | Bin 0 -> 6184 bytes .../poi/hslf/usermodel/TestPictures.java | 334 ++++++++++++++---- 19 files changed, 1251 insertions(+), 251 deletions(-) create mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java create mode 100644 src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java create mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/data/cow.pict create mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/data/pictures.ppt create mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/data/santa.wmf create mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/data/tomcat.png create mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/data/wrench.emf diff --git a/src/documentation/content/xdocs/hslf/how-to-shapes.xml b/src/documentation/content/xdocs/hslf/how-to-shapes.xml index f20bcef03b..fb8229304b 100644 --- a/src/documentation/content/xdocs/hslf/how-to-shapes.xml +++ b/src/documentation/content/xdocs/hslf/how-to-shapes.xml @@ -17,7 +17,7 @@
  • How to retrieve or change slide size
  • How to get shapes contained in a particular slide
  • Drawing a shape on a slide
  • -
  • How to add/retrieve pictures
  • +
  • How to work with pictures
  • How to set slide title
  • @@ -106,7 +106,7 @@ corner of the slide. Distances in the drawing layer are measured in points (72 points = 1 inch).

    - SlideShow ppt = new SlideShow); + SlideShow ppt = new SlideShow(); Slide slide = ppt.createSlide(); @@ -120,10 +120,18 @@ //TextBox TextBox txt = new TextBox(); txt.setText("Hello, World!"); - txt.setAnchor(new java.awt.Rectangle(100, 100, 200, 50)); - txt.setFontSize(32); - txt.setFontName("Arial"); - txt.setBold(true); + txt.setAnchor(new java.awt.Rectangle(300, 100, 300, 50)); + + //use RichTextRun to work with the text format + RichTextRun rt = txt.getRichTextRuns()[0]; + rt.setFontSize(32); + rt.setFontName("Arial"); + rt.setBold(true); + rt.setItalic(true); + rt.setUnderlined(true); + rt.setFontColor(Color.red); + rt.setAlignment(TextBox.AlignRight); + slide.addShape(txt); //Autoshape @@ -140,15 +148,24 @@ slide.addShape(sh2); FileOutputStream out = new FileOutputStream("slideshow.ppt"); - wb.write(out); + ppt.write(out); out.close(); -
    How to add/retrieve pictures -

    - Note, for now only PNG and JPEG formats are supported. -

    +
    How to work with pictures + +

    + Currently, HSLF API supports the following types of pictures: +

      +
    • Windows Metafiles (WMF)
    • +
    • Enhanced Metafiles (EMF)
    • +
    • JPEG Interchange Format
    • +
    • Portable Network Graphics (PNG)
    • +
    • Macintosh PICT
    • +
    +

    + SlideShow ppt = new SlideShow(new HSLFSlideShow("slideshow.ppt")); @@ -157,19 +174,23 @@ for (int i = 0; i < pdata.length; i++){ PictureData pict = pdata[i]; - //raw picture data + // picture data byte[] data = pict.getData(); int type = pict.getType(); - if (type == Picture.JPEG){ - FileOutputStream out = new FileOutputStream("pict"+i+".jpg"); - out.write(data); - out.close(); - } else if (type == Picture.PNG){ - FileOutputStream out = new FileOutputStream("pict"+i+".png"); + String ext; + switch (type){ + case Picture.JPEG: ext=".jpg"; break; + case Picture.PNG: ext=".png"; break; + case Picture.WMF: ext=".wmf"; break; + case Picture.EMF: ext=".emf"; break; + case Picture.PICT: ext=".pict"; break; + default: continue; + } + FileOutputStream out = new FileOutputStream("pict_"+i + ext); out.write(data); out.close(); - } + } // add a new picture to this slideshow and insert it in a new slide diff --git a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java index 9aa5bd9d2a..48121e0c14 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/HSLFSlideShow.java @@ -23,6 +23,7 @@ import java.util.*; import java.io.*; import org.apache.poi.POIDocument; +import org.apache.poi.util.LittleEndian; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.poifs.filesystem.DocumentEntry; import org.apache.poi.poifs.filesystem.DocumentInputStream; @@ -251,13 +252,31 @@ public class HSLFSlideShow extends POIDocument return; } - ArrayList p = new ArrayList(); - int pos = 0; - while (pos < (pictstream.length - PictureData.HEADER_SIZE)) { - PictureData pict = new PictureData(pictstream, pos); - p.add(pict); - pos += PictureData.HEADER_SIZE + pict.getSize(); - } + List p = new ArrayList(); + int pos = 0; + + while (pos < pictstream.length) { + int offset = pos; + + //image signature + int signature = LittleEndian.getUShort(pictstream, pos); + pos += LittleEndian.SHORT_SIZE; + //image type + 0xF018 + int type = LittleEndian.getUShort(pictstream, pos); + pos += LittleEndian.SHORT_SIZE; + //image size + int imgsize = LittleEndian.getInt(pictstream, pos); + pos += LittleEndian.INT_SIZE; + + byte[] imgdata = new byte[imgsize]; + System.arraycopy(pictstream, pos, imgdata, 0, imgdata.length); + + PictureData pict = PictureData.create(type - 0xF018); + pict.setRawData(imgdata); + pict.setOffset(offset); + p.add(pict); + pos += imgsize; + } _pictures = (PictureData[])p.toArray(new PictureData[p.size()]); } diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java b/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java new file mode 100644 index 0000000000..c37674d16a --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/Bitmap.java @@ -0,0 +1,47 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.hslf.blip; + +import org.apache.poi.hslf.usermodel.PictureData; + +import java.io.IOException; +import java.io.ByteArrayOutputStream; + +/** + * Represents a bitmap picture data: JPEG or PNG. + * The data is not compressed and the exact file content is written in the stream. + * + * @author Yegor Kozlov + */ +public abstract class Bitmap extends PictureData { + + public byte[] getData(){ + byte[] rawdata = getRawData(); + byte[] imgdata = new byte[rawdata.length-17]; + System.arraycopy(rawdata, 17, imgdata, 0, imgdata.length); + return imgdata; + } + + public void setData(byte[] data) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + byte[] checksum = getChecksum(data); + out.write(checksum); + out.write(0); + out.write(data); + + setRawData(out.toByteArray()); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java new file mode 100644 index 0000000000..a50240368e --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/EMF.java @@ -0,0 +1,92 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.hslf.blip; + +import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.Shape; + +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.util.zip.InflaterInputStream; +import java.util.zip.DeflaterOutputStream; + +/** + * Represents EMF (Windows Enhanced Metafile) picture data. + * + * @author Yegor Kozlov + */ +public class EMF extends Metafile { + + /** + * Extract compressed EMF data from a ppt + */ + public byte[] getData(){ + try { + byte[] rawdata = getRawData(); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + InputStream is = new ByteArrayInputStream( rawdata ); + Header header = new Header(); + header.read(rawdata, CHECKSUM_SIZE); + is.skip(header.getSize() + CHECKSUM_SIZE); + + InflaterInputStream inflater = new InflaterInputStream( is ); + byte[] chunk = new byte[4096]; + int count; + while ((count = inflater.read(chunk)) >=0 ) { + out.write(chunk,0,count); + } + inflater.close(); + return out.toByteArray(); + } catch (IOException e){ + throw new RuntimeException(e); + } + } + + public void setData(byte[] data) throws IOException { + byte[] compressed = compress(data, 0, data.length); + + Header header = new Header(); + header.wmfsize = data.length; + //we don't have a EMF reader in java, have to set default image size 200x200 + header.bounds = new java.awt.Rectangle(0, 0, 200, 200); + header.size = new java.awt.Dimension(header.bounds.width*Shape.EMU_PER_POINT, header.bounds.height*Shape.EMU_PER_POINT); + header.zipsize = compressed.length; + + byte[] checksum = getChecksum(data); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(checksum); + header.write(out); + out.write(compressed); + + setRawData(out.toByteArray()); + } + + public int getType(){ + return Picture.EMF; + } + + /** + * EMF signature is 0x3D40 + * + * @return EMF signature (0x3D40) + */ + public int getSignature(){ + return 0x3D40; + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java b/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java new file mode 100644 index 0000000000..852e4c6737 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/JPEG.java @@ -0,0 +1,43 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.hslf.blip; + +import org.apache.poi.hslf.model.Picture; + +/** + * Represents a JPEG picture data in a PPT file + * + * @author Yegor Kozlov + */ +public class JPEG extends Bitmap { + + /** + * @return type of this picture + * @see org.apache.poi.hslf.model.Picture#JPEG + */ + public int getType(){ + return Picture.JPEG; + } + + /** + * JPEG signature is 0x46A0 + * + * @return JPEG signature (0x46A0) + */ + public int getSignature(){ + return 0x46A0; + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java b/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java new file mode 100644 index 0000000000..1c00f21c56 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/Metafile.java @@ -0,0 +1,123 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.hslf.blip; + +import org.apache.poi.util.LittleEndian; +import org.apache.poi.hslf.usermodel.PictureData; + +import java.awt.*; +import java.io.*; +import java.util.zip.DeflaterOutputStream; +import java.util.zip.InflaterInputStream; + +/** + * Represents a metafile picture which can be one of the following types: EMF, WMF, or PICT. + * A metafile is stored compressed using the ZIP deflate/inflate algorithm. + * + * @author Yegor Kozlov + */ +public abstract class Metafile extends PictureData { + + /** + * A structure which represents a 34-byte header preceeding the compressed metafile data + * + * @author Yegor Kozlov + */ + public static class Header{ + + /** + * size of the original file + */ + public int wmfsize; + + /** + * Boundary of the metafile drawing commands + */ + public Rectangle bounds; + + /** + * Size of the metafile in EMUs + */ + public Dimension size; + + /** + * size of the compressed metafile data + */ + public int zipsize; + + /** + * Reserved. Always 0. + */ + public int compression; + + /** + * Reserved. Always 254. + */ + public int filter = 254; + + public void read(byte[] data, int offset){ + int pos = offset; + wmfsize = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + + int left = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + int top = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + int right = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + int bottom = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + + bounds = new Rectangle(left, top, right-left, bottom-top); + int width = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + int height = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + + size = new Dimension(width, height); + + zipsize = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + + compression = LittleEndian.getUnsignedByte(data, pos); pos++; + filter = LittleEndian.getUnsignedByte(data, pos); pos++; + } + + public void write(OutputStream out) throws IOException { + byte[] header = new byte[34]; + int pos = 0; + LittleEndian.putInt(header, pos, wmfsize); pos += LittleEndian.INT_SIZE; //hmf + + LittleEndian.putInt(header, pos, bounds.x); pos += LittleEndian.INT_SIZE; //left + LittleEndian.putInt(header, pos, bounds.y); pos += LittleEndian.INT_SIZE; //top + LittleEndian.putInt(header, pos, bounds.x + bounds.width); pos += LittleEndian.INT_SIZE; //right + LittleEndian.putInt(header, pos, bounds.y + bounds.height); pos += LittleEndian.INT_SIZE; //bottom + LittleEndian.putInt(header, pos, size.width); pos += LittleEndian.INT_SIZE; //inch + LittleEndian.putInt(header, pos, size.height); pos += LittleEndian.INT_SIZE; //inch + LittleEndian.putInt(header, pos, zipsize); pos += LittleEndian.INT_SIZE; //inch + + header[pos] = 0; pos ++; + header[pos] = (byte)filter; pos ++; + + out.write(header); + } + + public int getSize(){ + return 34; + } + } + + protected byte[] compress(byte[] bytes, int offset, int length) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + DeflaterOutputStream deflater = new DeflaterOutputStream( out ); + deflater.write(bytes, offset, length); + deflater.close(); + return out.toByteArray(); + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java new file mode 100644 index 0000000000..f79eb197e5 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PICT.java @@ -0,0 +1,117 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.hslf.blip; + +import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.Shape; +import org.apache.poi.util.LittleEndian; + +import java.io.*; +import java.util.zip.InflaterInputStream; +import java.util.zip.DeflaterOutputStream; + +/** + * Represents Macintosh PICT picture data. + * + * @author Yegor Kozlov + */ +public class PICT extends Metafile { + + public PICT(){ + super(); + } + + /** + * Extract compressed PICT data from a ppt + */ + public byte[] getData(){ + byte[] rawdata = getRawData(); + try { + byte[] macheader = new byte[512]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(macheader); + int pos = CHECKSUM_SIZE; + byte[] pict; + try { + pict = read(rawdata, pos); + } catch (IOException e){ + //weird MAC behaviour. + //if failed to read right after the checksum - skip 16 bytes and try again + pict = read(rawdata, pos + 16); + } + out.write(pict); + return out.toByteArray(); + } catch (IOException e){ + throw new RuntimeException(e); + } + } + + private byte[] read(byte[] data, int pos) throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ByteArrayInputStream bis = new ByteArrayInputStream(data); + Header header = new Header(); + header.read(data, pos); + bis.skip(pos + header.getSize()); + InflaterInputStream inflater = new InflaterInputStream( bis ); + byte[] chunk = new byte[4096]; + int count; + while ((count = inflater.read(chunk)) >=0 ) { + out.write(chunk,0,count); + } + inflater.close(); + return out.toByteArray(); + } + + public void setData(byte[] data) throws IOException { + int pos = 512; //skip the first 512 bytes - they are MAC specific crap + byte[] compressed = compress(data, pos, data.length-pos); + + Header header = new Header(); + header.wmfsize = data.length - 512; + //we don't have a PICT reader in java, have to set default image size 200x200 + header.bounds = new java.awt.Rectangle(0, 0, 200, 200); + header.size = new java.awt.Dimension(header.bounds.width*Shape.EMU_PER_POINT, + header.bounds.height*Shape.EMU_PER_POINT); + header.zipsize = compressed.length; + + byte[] checksum = getChecksum(data); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(checksum); + + out.write(new byte[16]); //16-byte prefix which is safe to ignore + header.write(out); + out.write(compressed); + + setRawData(out.toByteArray()); + } + + /** + * @see org.apache.poi.hslf.model.Picture#PICT + */ + public int getType(){ + return Picture.PICT; + } + + /** + * PICT signature is 0x5430 + * + * @return PICT signature (0x5430) + */ + public int getSignature(){ + return 0x5430; + } + +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java b/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java new file mode 100644 index 0000000000..db9c7822a2 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/PNG.java @@ -0,0 +1,68 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.hslf.blip; + +import org.apache.poi.hslf.model.Picture; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayInputStream; +import java.io.IOException; + +/** + * Represents a PNG picture data in a PPT file + * + * @author Yegor Kozlov + */ +public class PNG extends Bitmap { + + /** + * @return PNG data + */ + public byte[] getData(){ + byte[] data = super.getData(); + try { + //PNG created on MAC may have a 16-byte prefix which prevents successful reading. + //Just cut it off!. + BufferedImage bi = ImageIO.read(new ByteArrayInputStream(data)); + if (bi == null){ + byte[] png = new byte[data.length-16]; + System.arraycopy(data, 16, png, 0, png.length); + data = png; + } + } catch (IOException e){ + throw new RuntimeException(e); + } + return data; + } + + /** + * @return type of this picture + * @see org.apache.poi.hslf.model.Picture#PNG + */ + public int getType(){ + return Picture.PNG; + } + + /** + * PNG signature is 0x6E00 + * + * @return PNG signature (0x6E00) + */ + public int getSignature(){ + return 0x6E00; + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java new file mode 100644 index 0000000000..36ca266271 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/blip/WMF.java @@ -0,0 +1,187 @@ +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.hslf.blip; + +import org.apache.poi.util.LittleEndian; +import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.model.Shape; + +import java.io.*; +import java.util.zip.InflaterInputStream; +import java.util.zip.DeflaterOutputStream; + +/** + * Represents a WMF (Windows Metafile) picture data. + * + * @author Yegor Kozlov + */ +public class WMF extends Metafile { + + /** + * Extract compressed WMF data from a ppt + */ + public byte[] getData(){ + try { + byte[] rawdata = getRawData(); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + InputStream is = new ByteArrayInputStream( rawdata ); + Header header = new Header(); + header.read(rawdata, CHECKSUM_SIZE); + is.skip(header.getSize() + CHECKSUM_SIZE); + + AldusHeader aldus = new AldusHeader(); + aldus.left = header.bounds.x; + aldus.top = header.bounds.y; + aldus.right = header.bounds.x + header.bounds.width; + aldus.bottom = header.bounds.y + header.bounds.height; + aldus.write(out); + + InflaterInputStream inflater = new InflaterInputStream( is ); + byte[] chunk = new byte[4096]; + int count; + while ((count = inflater.read(chunk)) >=0 ) { + out.write(chunk,0,count); + } + inflater.close(); + return out.toByteArray(); + } catch (IOException e){ + throw new RuntimeException(e); + } + } + + public void setData(byte[] data) throws IOException { + int pos = 0; + AldusHeader aldus = new AldusHeader(); + aldus.read(data, pos); + pos += aldus.getSize(); + + byte[] compressed = compress(data, pos, data.length-pos); + + Header header = new Header(); + header.wmfsize = data.length - aldus.getSize(); + header.bounds = new java.awt.Rectangle((short)aldus.left, (short)aldus.top, (short)aldus.right-(short)aldus.left, (short)aldus.bottom-(short)aldus.top); + //coefficiaent to translate from WMF dpi to 96pdi + int coeff = 96*Shape.EMU_PER_POINT/aldus.inch; + header.size = new java.awt.Dimension(header.bounds.width*coeff, header.bounds.height*coeff); + header.zipsize = compressed.length; + + byte[] checksum = getChecksum(data); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + out.write(checksum); + header.write(out); + out.write(compressed); + + setRawData(out.toByteArray()); + } + + /** + * We are of type Picture.WMF + */ + public int getType(){ + return Picture.WMF; + } + + /** + * WMF signature is 0x2160 + */ + public int getSignature(){ + return 0x2160; + } + + + /** + * Aldus Placeable Metafile header - 22 byte structure before WMF data. + *
      + *
    • int Key; Magic number (always 9AC6CDD7h) + *
    • short Handle; Metafile HANDLE number (always 0) + *
    • short Left; Left coordinate in metafile units + *
    • short Top; Top coordinate in metafile units + *
    • short Right; Right coordinate in metafile units + *
    • short Bottom; Bottom coordinate in metafile units + *
    • short Inch; Number of metafile units per inch + *
    • int Reserved; Reserved (always 0) + *
    • short Checksum; Checksum value for previous 10 shorts + *
    + */ + public static class AldusHeader{ + public static final int APMHEADER_KEY = 0x9AC6CDD7; + + public int handle; + public int left, top, right, bottom; + public int inch = 72; //default resolution is 72 dpi + public int reserved; + public int checksum; + + public void read(byte[] data, int offset){ + int pos = offset; + int key = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; //header key + if (key != APMHEADER_KEY) throw new RuntimeException("Not a valid WMF file"); + + handle = LittleEndian.getUShort(data, pos); pos += LittleEndian.SHORT_SIZE; + left = LittleEndian.getUShort(data, pos); pos += LittleEndian.SHORT_SIZE; + top = LittleEndian.getUShort(data, pos); pos += LittleEndian.SHORT_SIZE; + right = LittleEndian.getUShort(data, pos); pos += LittleEndian.SHORT_SIZE; + bottom = LittleEndian.getUShort(data, pos); pos += LittleEndian.SHORT_SIZE; + + inch = LittleEndian.getUShort(data, pos); pos += LittleEndian.SHORT_SIZE; + reserved = LittleEndian.getInt(data, pos); pos += LittleEndian.INT_SIZE; + + checksum = LittleEndian.getShort(data, pos); pos += LittleEndian.SHORT_SIZE; + if (checksum != getChecksum()) + throw new RuntimeException("WMF checksum does not match the header data"); + } + + /** + * Returns a checksum value for the previous 10 shorts in the header. + * The checksum is calculated by XORing each short value to an initial value of 0: + */ + public int getChecksum(){ + int checksum = 0; + checksum ^= (APMHEADER_KEY & 0x0000FFFF); + checksum ^= ((APMHEADER_KEY & 0xFFFF0000) >> 16); + checksum ^= left; + checksum ^= top; + checksum ^= right; + checksum ^= bottom; + checksum ^= inch; + return checksum; + } + + public void write(OutputStream out) throws IOException { + byte[] header = new byte[22]; + int pos = 0; + LittleEndian.putInt(header, pos, APMHEADER_KEY); pos += LittleEndian.INT_SIZE; //header key + LittleEndian.putUShort(header, pos, 0); pos += LittleEndian.SHORT_SIZE; //hmf + LittleEndian.putUShort(header, pos, left); pos += LittleEndian.SHORT_SIZE; //left + LittleEndian.putUShort(header, pos, top); pos += LittleEndian.SHORT_SIZE; //top + LittleEndian.putUShort(header, pos, right); pos += LittleEndian.SHORT_SIZE; //right + LittleEndian.putUShort(header, pos, bottom); pos += LittleEndian.SHORT_SIZE; //bottom + LittleEndian.putUShort(header, pos, inch); pos += LittleEndian.SHORT_SIZE; //inch + LittleEndian.putInt(header, pos, 0); pos += LittleEndian.INT_SIZE; //reserved + + checksum = getChecksum(); + LittleEndian.putUShort(header, pos, checksum); + + out.write(header); + } + + public int getSize(){ + return 22; + } + } + +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java new file mode 100644 index 0000000000..85fd16fae9 --- /dev/null +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/ImageExtractor.java @@ -0,0 +1,75 @@ + +/* ==================================================================== + Copyright 2002-2004 Apache Software Foundation + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +==================================================================== */ +package org.apache.poi.hslf.extractor; + +import org.apache.poi.hslf.usermodel.SlideShow; +import org.apache.poi.hslf.usermodel.PictureData; +import org.apache.poi.hslf.HSLFSlideShow; +import org.apache.poi.hslf.model.Picture; + +import java.io.IOException; +import java.io.FileOutputStream; + +/** + * Utility to extract pictures from a PowerPoint file. + * + * @author Yegor Kozlov + */ +public class ImageExtractor { + public static void main(String args[]) throws IOException { + if (args.length < 1) { + System.err.println("Usage:"); + System.err.println("\tImageExtractor "); + return; + } + SlideShow ppt = new SlideShow(new HSLFSlideShow(args[0])); + + //extract all pictures contained in the presentation + PictureData[] pdata = ppt.getPictureData(); + for (int i = 0; i < pdata.length; i++) { + PictureData pict = pdata[i]; + + // picture data + byte[] data = pict.getData(); + + int type = pict.getType(); + String ext; + switch (type) { + case Picture.JPEG: + ext = ".jpg"; + break; + case Picture.PNG: + ext = ".png"; + break; + case Picture.WMF: + ext = ".wmf"; + break; + case Picture.EMF: + ext = ".emf"; + break; + case Picture.PICT: + ext = ".pict"; + break; + default: + continue; + } + FileOutputStream out = new FileOutputStream("pict_" + i + ext); + out.write(data); + out.close(); + } + } +} diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java b/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java index 34f560c111..f1b9b3a4df 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/Picture.java @@ -4,9 +4,11 @@ import org.apache.poi.ddf.*; import org.apache.poi.hslf.usermodel.PictureData; import org.apache.poi.hslf.usermodel.SlideShow; import org.apache.poi.hslf.record.Document; +import org.apache.poi.hslf.blip.Bitmap; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; +import java.awt.*; import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.List; @@ -22,33 +24,23 @@ import java.util.Arrays; * type, image index to refer by slides etc. *
  • "Pictures" OLE stream holds the actual data of the image. *

    - *

    - * Data in the "Pictures" OLE stream is organized as follows:
    - * For each image there is an entry: 25 byte header + image data. - * Image data is the exact content of the JPEG file, i.e. PowerPoint - * puts the whole jpeg file there without any modifications.
    - * Header format: - *

  • 2 byte: image type. For JPEGs it is 0x46A0, for PNG it is 0x6E00. - *
  • 2 byte: unknown. - *
  • 4 byte : image size + 17. Looks like shift from the end of - * header but why to add it to the image size? - *
  • next 16 bytes. Unique identifier of this image which is used by - * EscherBSE record. - *

    * * @author Yegor Kozlov */ public class Picture extends SimpleShape { /** - * Windows Metafile - * ( NOT YET SUPPORTED ) + * Windows Enhanced Metafile (EMF) + */ + public static final int EMF = 2; + + /** + * Windows Metafile (WMF) */ public static final int WMF = 3; /** * Macintosh PICT - * ( NOT YET SUPPORTED ) */ public static final int PICT = 4; @@ -63,10 +55,10 @@ public class Picture extends SimpleShape { public static final int PNG = 6; /** - * Windows DIB (BMP) - */ - public static final int DIB = 7; - + * Windows DIB (BMP) + */ + public static final byte DIB = 7; + /** * Create a new Picture * @@ -129,11 +121,17 @@ public class Picture extends SimpleShape { */ public void setDefaultSize(){ PictureData pict = getPictureData(); - try { - BufferedImage img = ImageIO.read(new ByteArrayInputStream(pict.getData())); - setAnchor(new java.awt.Rectangle(0, 0, img.getWidth(), img.getHeight())); - } catch (IOException e){ - throw new RuntimeException(e); + if (pict instanceof Bitmap){ + try { + BufferedImage img = ImageIO.read(new ByteArrayInputStream(pict.getData())); + if(img != null) setAnchor(new java.awt.Rectangle(0, 0, img.getWidth(), img.getHeight())); + else setAnchor(new java.awt.Rectangle(0, 0, 200, 200)); + } catch (IOException e){ + ; + } + } else { + //default size of a metafile picture is 200x200 + setAnchor(new java.awt.Rectangle(50, 50, 200, 200)); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java index 7eacac5938..c8d6f02660 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/PictureData.java @@ -17,6 +17,7 @@ package org.apache.poi.hslf.usermodel; import org.apache.poi.util.LittleEndian; import org.apache.poi.hslf.model.Picture; +import org.apache.poi.hslf.blip.*; import java.io.OutputStream; import java.io.IOException; @@ -24,172 +25,95 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** - * A class that represents the image data contained in the Presentation. - * + * A class that represents image data contained in a slide show. * * @author Yegor Kozlov */ -public class PictureData { +public abstract class PictureData { - /** - * The size of the header - */ - public static final int HEADER_SIZE = 25; - - protected static final int JPEG_HEADER = -266516832; - protected static final int PNG_HEADER = -266441216; + /** + * Size of the image checksum calculated using MD5 algorithm. + */ + protected static final int CHECKSUM_SIZE = 16; /** * Binary data of the picture */ - protected byte[] pictdata; - - /** - * Header which holds information about this picture - */ - protected byte[] header; - + private byte[] rawdata; /** * The offset to the picture in the stream */ protected int offset; - public PictureData(){ - header = new byte[PictureData.HEADER_SIZE]; - } - - /** - * Read a picture from "Pictures" OLE stream - * - * @param pictstream the bytes to read - * @param offset the index of the first byte to read - */ - public PictureData(byte[] pictstream, int offset){ - header = new byte[PictureData.HEADER_SIZE]; - System.arraycopy(pictstream, offset, header, 0, header.length); - - // Get the size of the picture, and make sure it's sane - // Size is stored unsigned, since it must always be positive - int size = (int)LittleEndian.getUInt(header, 4) - 17; - int startPos = offset + PictureData.HEADER_SIZE; - if(size < 0) { size = 0; } - if(size > (pictstream.length - startPos)) { - int remaining = pictstream.length - startPos; - System.err.println("Warning: PictureData claimed picture was of length " + size + ", but only " + remaining + " remained!"); - size = remaining; - } - - // Save the picture data - pictdata = new byte[size]; - this.offset = offset; - System.arraycopy(pictstream, startPos, pictdata, 0, pictdata.length); - } + /** + * Returns type of this picture. + * Must be one of the static constants defined in the Picture class. + * + * @return type of this picture. + */ + public abstract int getType(); - /** - * @return the binary data of this picture - */ - public byte[] getData(){ - return pictdata; - } + /** + * Returns the binary data of this Picture + * @return picture data + */ + public abstract byte[] getData(); /** * Set picture data */ - public void setData(byte[] data) { - pictdata = data; - LittleEndian.putInt(header, 4, data.length + 17); - } - - /** - * Return image size in bytes - * - * @return the size of the picture in bytes - */ - public int getSize(){ - return pictdata.length; - } + public abstract void setData(byte[] data) throws IOException; - /** - * Returns the unique identifier (UID) of this picture. - * The UID is a checksum of the picture data. Its length is 16 bytes - * and it must be unique across the presentation. - * - * @return the unique identifier of this picture - */ - public byte[] getUID(){ - byte[] uid = new byte[16]; - System.arraycopy(header, 8, uid, 0, uid.length); - return uid; - } + /** + * Blip signature. + */ + protected abstract int getSignature(); /** - * Set the unique identifier (UID) of this picture. + * Returns the raw binary data of this Picture excluding the first 8 bytes + * which hold image signature and size of the image data. * - * @param uid checksum of the picture data + * @return picture data */ - public void setUID(byte[] uid){ - System.arraycopy(uid, 0, header, 8, uid.length); + public byte[] getRawData(){ + return rawdata; } - /** - * Set the type of this picture. - * - * @return type of this picture. - * Must be one of the static constans defined in the Picture class. - */ - public void setType(int format){ - switch (format){ - case Picture.JPEG: LittleEndian.putInt(header, 0, PictureData.JPEG_HEADER); break; - case Picture.PNG: LittleEndian.putInt(header, 0, PictureData.PNG_HEADER); break; - } - } + public void setRawData(byte[] data){ + rawdata = data; + } /** - * Returns type of this picture. - * Must be one of the static constans defined in the Picture class. + * File offset in the 'Pictures' stream * - * @return type of this picture. + * @return offset in the 'Pictures' stream */ - public int getType(){ - int format = 0; - int val = LittleEndian.getInt(header, 0); - switch (val){ - case PictureData.JPEG_HEADER: format = Picture.JPEG; break; - case PictureData.PNG_HEADER: format = Picture.PNG; break; - } - return format; + public int getOffset(){ + return offset; } /** - * Returns the header of the Picture + * Set offset of this picture in the 'Pictures' stream. + * We need to set it when a new picture is created. * - * @return the header of the Picture + * @param offset in the 'Pictures' stream */ - public byte[] getHeader(){ - return header; + public void setOffset(int offset){ + this.offset = offset; } - /** - * File offset in the 'Pictures' stream - * - * @return offset in the 'Pictures' stream - */ - public int getOffset(){ - return offset; - } + /** + * Returns 16-byte checksum of this picture + */ + public byte[] getUID(){ + byte[] uid = new byte[16]; + System.arraycopy(rawdata, 0, uid, 0, uid.length); + return uid; + } - /** - * Set offset of this picture in the 'Pictures' stream. - * We need to set it when a new picture is created. - * - * @param offset in the 'Pictures' stream - */ - public void setOffset(int offset){ - this.offset = offset; - } /** - * Compute 16-byte checksum of this picture + * Compute 16-byte checksum of this picture using MD5 algorithm. */ public static byte[] getChecksum(byte[] data) { MessageDigest sha; @@ -206,8 +130,81 @@ public class PictureData { * Write this picture into OutputStream */ public void write(OutputStream out) throws IOException { - out.write(header); - out.write(pictdata); + byte[] data; + + data = new byte[LittleEndian.SHORT_SIZE]; + LittleEndian.putUShort(data, 0, getSignature()); + out.write(data); + + data = new byte[LittleEndian.SHORT_SIZE]; + LittleEndian.putUShort(data, 0, getType() + 0xF018); + out.write(data); + + byte[] rawdata = getRawData(); + + data = new byte[LittleEndian.INT_SIZE]; + LittleEndian.putInt(data, 0, rawdata.length); + out.write(data); + + out.write(rawdata); + } + + /** + * Create an instance of PictureData by type. + * + * @param type type of the picture data. + * Must be one of the static constants defined in the Picture class. + * @return concrete instance of PictureData + */ + public static PictureData create(int type){ + PictureData pict; + switch (type){ + case Picture.EMF: + pict = new EMF(); + break; + case Picture.WMF: + pict = new WMF(); + break; + case Picture.PICT: + pict = new PICT(); + break; + case Picture.JPEG: + pict = new JPEG(); + break; + case Picture.PNG: + pict = new PNG(); + break; + default: + throw new RuntimeException("Unsupported picture type: " + type); + } + return pict; + } + + /** + * Return 24 byte header which preceeds the actual picture data. + *

    + * The header consists of 2-byte signature, 2-byte type, + * 4-byte image size and 16-byte checksum of the image data. + *

    + * + * @return the 24 byte header which preceeds the actual picture data. + */ + public byte[] getHeader() { + byte[] header = new byte[16 + 8]; + LittleEndian.putInt(header, 0, getSignature()); + LittleEndian.putInt(header, 4, getRawData().length); + System.arraycopy(rawdata, 0, header, 8, 16); + return header; + } + + /** + * Return image size in bytes + * + * @return the size of the picture in bytes + * @deprecated Use getData().length instead. + */ + public int getSize(){ + return getData().length; } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java index 090ebb0566..f12b0cfdb3 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/SlideShow.java @@ -620,7 +620,7 @@ public class SlideShow * @param format the format of the picture. One of constans defined in the Picture class. * @return the index to this picture (1 based). */ - public int addPicture(byte[] data, int format) { + public int addPicture(byte[] data, int format) throws IOException { byte[] uid = PictureData.getChecksum(data); EscherContainerRecord bstore; @@ -652,14 +652,23 @@ public class SlideShow } } + PictureData pict = PictureData.create(format); + pict.setData(data); + pict.setOffset(offset); + EscherBSERecord bse = new EscherBSERecord(); bse.setRecordId(EscherBSERecord.RECORD_ID); bse.setOptions( (short) ( 0x0002 | ( format << 4 ) ) ); - bse.setSize(data.length + PictureData.HEADER_SIZE); + bse.setSize(pict.getRawData().length + 8); bse.setUid(uid); + bse.setBlipTypeMacOS((byte)format); bse.setBlipTypeWin32((byte)format); + if (format == Picture.EMF) bse.setBlipTypeMacOS((byte)Picture.PICT); + else if (format == Picture.WMF) bse.setBlipTypeMacOS((byte)Picture.PICT); + else if (format == Picture.PICT) bse.setBlipTypeWin32((byte)Picture.WMF); + bse.setRef(1); bse.setOffset(offset); @@ -667,12 +676,6 @@ public class SlideShow int count = bstore.getChildRecords().size(); bstore.setOptions((short)( (count << 4) | 0xF )); - PictureData pict = new PictureData(); - pict.setUID(uid); - pict.setData(data); - pict.setType(format); - pict.setOffset(offset); - _hslfSlideShow.addPicture(pict); return count; @@ -685,7 +688,7 @@ public class SlideShow * @param format the format of the picture. One of constans defined in the Picture class. * @return the index to this picture (1 based). */ - public int addPicture(File pict, int format) { + public int addPicture(File pict, int format) throws IOException { int length = (int)pict.length(); byte[] data = new byte[length]; try { diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/cow.pict b/src/scratchpad/testcases/org/apache/poi/hslf/data/cow.pict new file mode 100644 index 0000000000000000000000000000000000000000..71b81d25408fb32f60dd6fb29960abdbbc84db48 GIT binary patch literal 42414 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%0Ae>R=9YaRRL@ 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 literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java index 3a3133a952..861be0c2c6 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestPictures.java @@ -17,106 +17,316 @@ package org.apache.poi.hslf.usermodel; import org.apache.poi.hslf.*; -import org.apache.poi.hslf.usermodel.PictureData; -import org.apache.poi.hslf.usermodel.SlideShow; -import org.apache.poi.hslf.model.Slide; -import org.apache.poi.hslf.model.Shape; -import org.apache.poi.hslf.model.Picture; -import org.apache.poi.util.LittleEndian; +import org.apache.poi.hslf.blip.*; +import org.apache.poi.hslf.model.*; import junit.framework.TestCase; -import javax.imageio.ImageIO; -import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; +import java.io.*; +import java.util.Arrays; /** - * Test extracting images from a ppt file + * Test adding/reading pictures * * @author Yegor Kozlov */ public class TestPictures extends TestCase{ - public static String dirname = System.getProperty("HSLF.testdata.path"); - public static String filename = dirname + "/ppt_with_png.ppt"; - public void testReadPictures() throws Exception { + protected File cwd; - HSLFSlideShow ppt = new HSLFSlideShow(filename); - PictureData[] pict = ppt.getPictures(); - assertNotNull(pict); - for (int i = 0; i < pict.length; i++) { - byte[] data = pict[i].getData(); - - BufferedImage img = ImageIO.read(new ByteArrayInputStream(data)); - assertNotNull(img); - assertEquals(Picture.PNG, pict[i].getType()); - } - ppt.close(); + public void setUp() throws Exception { + cwd = new File(System.getProperty("HSLF.testdata.path")); } - public void testReadPicturesForSlide() throws Exception { + /** + * Test read/write Macintosh PICT + */ + public void testPICT() throws Exception { + SlideShow ppt = new SlideShow(); + + Slide slide = ppt.createSlide(); + File img = new File(cwd, "cow.pict"); + int idx = ppt.addPicture(img, Picture.PICT); + Picture pict = new Picture(idx); + assertEquals(idx, pict.getPictureIndex()); + slide.addShape(pict); - SlideShow ppt = new SlideShow(new HSLFSlideShow(filename)); + //serialize and read again + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ppt.write(out); + out.close(); - Slide[] slide = ppt.getSlides(); - for (int i = 0; i < slide.length; i++) { - Slide sl = slide[i]; - Shape[] sh = sl.getShapes(); - for (int j = 0; j < sh.length; j++) { - Shape shape = sh[j]; - if (shape instanceof Picture){ - Picture picture = (Picture)shape; + ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); - PictureData pictdata = picture.getPictureData(); - assertEquals(Picture.PNG, pictdata.getType()); + //make sure we can read this picture shape and it refers to the correct picture data + Shape[] sh = ppt.getSlides()[0].getShapes(); + assertEquals(1, sh.length); + pict = (Picture)sh[0]; + assertEquals(idx, pict.getPictureIndex()); - //raw data. - byte[] data = pictdata.getData(); - BufferedImage img = ImageIO.read(new ByteArrayInputStream(data)); - assertNotNull(img); - } - } + //check picture data + PictureData[] pictures = ppt.getPictureData(); + //the Picture shape refers to the PictureData object in the Presentation + assertEquals(pict.getPictureData(), pictures[0]); - } + assertEquals(1, pictures.length); + assertEquals(Picture.PICT, pictures[0].getType()); + assertTrue(pictures[0] instanceof PICT); + //compare the content of the initial file with what is stored in the PictureData + byte[] src_bytes = read(img); + byte[] ppt_bytes = pictures[0].getData(); + assertEquals(src_bytes.length, ppt_bytes.length); + //in PICT the first 512 bytes are MAC specific and may not be preserved, ignore them + byte[] b1 = new byte[src_bytes.length-512]; + System.arraycopy(src_bytes, 512, b1, 0, b1.length); + byte[] b2 = new byte[ppt_bytes.length-512]; + System.arraycopy(ppt_bytes, 512, b2, 0, b2.length); + assertTrue(Arrays.equals(b1, b2)); } - public void testSerializePictures() throws Exception { - HSLFSlideShow ppt = new HSLFSlideShow(filename); - PictureData[] pict = ppt.getPictures(); - assertNotNull(pict); + /** + * Test read/write WMF + */ + public void testWMF() throws Exception { + SlideShow ppt = new SlideShow(); + + Slide slide = ppt.createSlide(); + File img = new File(cwd, "santa.wmf"); + int idx = ppt.addPicture(img, Picture.WMF); + Picture pict = new Picture(idx); + assertEquals(idx, pict.getPictureIndex()); + slide.addShape(pict); + //serialize and read again ByteArrayOutputStream out = new ByteArrayOutputStream(); ppt.write(out); out.close(); - ppt = new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray())); - pict = ppt.getPictures(); - assertNotNull(pict); + ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + + //make sure we can read this picture shape and it refers to the correct picture data + Shape[] sh = ppt.getSlides()[0].getShapes(); + assertEquals(1, sh.length); + pict = (Picture)sh[0]; + assertEquals(idx, pict.getPictureIndex()); + + //check picture data + PictureData[] pictures = ppt.getPictureData(); + //the Picture shape refers to the PictureData object in the Presentation + assertEquals(pict.getPictureData(), pictures[0]); + + assertEquals(1, pictures.length); + assertEquals(Picture.WMF, pictures[0].getType()); + assertTrue(pictures[0] instanceof WMF); + //compare the content of the initial file with what is stored in the PictureData + byte[] src_bytes = read(img); + byte[] ppt_bytes = pictures[0].getData(); + assertEquals(src_bytes.length, ppt_bytes.length); + //in WMF the first 22 bytes - is a metafile header + byte[] b1 = new byte[src_bytes.length-22]; + System.arraycopy(src_bytes, 22, b1, 0, b1.length); + byte[] b2 = new byte[ppt_bytes.length-22]; + System.arraycopy(ppt_bytes, 22, b2, 0, b2.length); + assertTrue(Arrays.equals(b1, b2)); } - public void testAddPictures() throws Exception { - int idx; - Slide slide; - Picture pict; + /** + * Test read/write EMF + */ + public void testEMF() throws Exception { + SlideShow ppt = new SlideShow(); + + Slide slide = ppt.createSlide(); + File img = new File(cwd, "wrench.emf"); + int idx = ppt.addPicture(img, Picture.EMF); + Picture pict = new Picture(idx); + assertEquals(idx, pict.getPictureIndex()); + slide.addShape(pict); + + //serialize and read again + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ppt.write(out); + out.close(); + ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + + //make sure we can get this picture shape and it refers to the correct picture data + Shape[] sh = ppt.getSlides()[0].getShapes(); + assertEquals(1, sh.length); + pict = (Picture)sh[0]; + assertEquals(idx, pict.getPictureIndex()); + + //check picture data + PictureData[] pictures = ppt.getPictureData(); + //the Picture shape refers to the PictureData object in the Presentation + assertEquals(pict.getPictureData(), pictures[0]); + + assertEquals(1, pictures.length); + assertEquals(Picture.EMF, pictures[0].getType()); + assertTrue(pictures[0] instanceof EMF); + //compare the content of the initial file with what is stored in the PictureData + byte[] src_bytes = read(img); + byte[] ppt_bytes = pictures[0].getData(); + assertTrue(Arrays.equals(src_bytes, ppt_bytes)); + } + + /** + * Test read/write PNG + */ + public void testPNG() throws Exception { SlideShow ppt = new SlideShow(); - idx = ppt.addPicture(new File(dirname + "/clock.jpg"), Picture.JPEG); - slide = ppt.createSlide(); - pict = new Picture(idx); + Slide slide = ppt.createSlide(); + File img = new File(cwd, "tomcat.png"); + int idx = ppt.addPicture(img, Picture.PNG); + Picture pict = new Picture(idx); + assertEquals(idx, pict.getPictureIndex()); slide.addShape(pict); - idx = ppt.addPicture(new File(dirname + "/painting.png"), Picture.PNG); - pict = new Picture(idx); + //serialize and read again + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ppt.write(out); + out.close(); + + ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); + + //make sure we can read this picture shape and it refers to the correct picture data + Shape[] sh = ppt.getSlides()[0].getShapes(); + assertEquals(1, sh.length); + pict = (Picture)sh[0]; + assertEquals(idx, pict.getPictureIndex()); + + //check picture data + PictureData[] pictures = ppt.getPictureData(); + //the Picture shape refers to the PictureData object in the Presentation + assertEquals(pict.getPictureData(), pictures[0]); + + assertEquals(1, pictures.length); + assertEquals(Picture.PNG, pictures[0].getType()); + assertTrue(pictures[0] instanceof PNG); + //compare the content of the initial file with what is stored in the PictureData + byte[] src_bytes = read(img); + byte[] ppt_bytes = pictures[0].getData(); + assertTrue(Arrays.equals(src_bytes, ppt_bytes)); + } + + /** + * Test read/write JPEG + */ + public void testJPEG() throws Exception { + SlideShow ppt = new SlideShow(); + + Slide slide = ppt.createSlide(); + File img = new File(cwd, "clock.jpg"); + int idx = ppt.addPicture(img, Picture.JPEG); + Picture pict = new Picture(idx); + assertEquals(idx, pict.getPictureIndex()); slide.addShape(pict); + //serialize and read again ByteArrayOutputStream out = new ByteArrayOutputStream(); ppt.write(out); out.close(); ppt = new SlideShow(new HSLFSlideShow(new ByteArrayInputStream(out.toByteArray()))); - assertTrue(ppt.getPictureData().length == 2 ); + + //make sure we can read this picture shape and it refers to the correct picture data + Shape[] sh = ppt.getSlides()[0].getShapes(); + assertEquals(1, sh.length); + pict = (Picture)sh[0]; + assertEquals(idx, pict.getPictureIndex()); + + //check picture data + PictureData[] pictures = ppt.getPictureData(); + //the Picture shape refers to the PictureData object in the Presentation + assertEquals(pict.getPictureData(), pictures[0]); + + assertEquals(1, pictures.length); + assertEquals(Picture.JPEG, pictures[0].getType()); + assertTrue(pictures[0] instanceof JPEG); + //compare the content of the initial file with what is stored in the PictureData + byte[] src_bytes = read(img); + byte[] ppt_bytes = pictures[0].getData(); + assertTrue(Arrays.equals(src_bytes, ppt_bytes)); } + /** + * Read file into a byte array + */ + protected byte[] read(File f) throws IOException { + byte[] bytes = new byte[(int)f.length()]; + FileInputStream is = new FileInputStream(f); + is.read(bytes); + is.close(); + return bytes; + } + + /** + * Read pictures in different formats from a reference slide show + */ + public void testReadPictures() throws Exception { + + byte[] src_bytes, ppt_bytes, b1, b2; + Picture pict; + PictureData pdata; + + SlideShow ppt = new SlideShow(new HSLFSlideShow(new File(cwd, "pictures.ppt").getPath())); + Slide[] slides = ppt.getSlides(); + PictureData[] pictures = ppt.getPictureData(); + assertEquals(5, pictures.length); + + pict = (Picture)slides[0].getShapes()[0]; //the first slide contains JPEG + pdata = pict.getPictureData(); + assertTrue(pdata instanceof JPEG); + assertEquals(Picture.JPEG, pdata.getType()); + src_bytes = pdata.getData(); + ppt_bytes = read(new File(cwd, "clock.jpg")); + assertTrue(Arrays.equals(src_bytes, ppt_bytes)); + + pict = (Picture)slides[1].getShapes()[0]; //the second slide contains PNG + pdata = pict.getPictureData(); + assertTrue(pdata instanceof PNG); + assertEquals(Picture.PNG, pdata.getType()); + src_bytes = pdata.getData(); + ppt_bytes = read(new File(cwd, "tomcat.png")); + assertTrue(Arrays.equals(src_bytes, ppt_bytes)); + + pict = (Picture)slides[2].getShapes()[0]; //the third slide contains WMF + pdata = pict.getPictureData(); + assertTrue(pdata instanceof WMF); + assertEquals(Picture.WMF, pdata.getType()); + src_bytes = pdata.getData(); + ppt_bytes = read(new File(cwd, "santa.wmf")); + assertEquals(src_bytes.length, ppt_bytes.length); + //ignore the first 22 bytes - it is a WMF metafile header + b1 = new byte[src_bytes.length-22]; + System.arraycopy(src_bytes, 22, b1, 0, b1.length); + b2 = new byte[ppt_bytes.length-22]; + System.arraycopy(ppt_bytes, 22, b2, 0, b2.length); + assertTrue(Arrays.equals(b1, b2)); + + pict = (Picture)slides[3].getShapes()[0]; //the forth slide contains PICT + pdata = pict.getPictureData(); + assertTrue(pdata instanceof PICT); + assertEquals(Picture.PICT, pdata.getType()); + src_bytes = pdata.getData(); + ppt_bytes = read(new File(cwd, "cow.pict")); + assertEquals(src_bytes.length, ppt_bytes.length); + //ignore the first 512 bytes - it is a MAC specific crap + b1 = new byte[src_bytes.length-512]; + System.arraycopy(src_bytes, 512, b1, 0, b1.length); + b2 = new byte[ppt_bytes.length-512]; + System.arraycopy(ppt_bytes, 512, b2, 0, b2.length); + assertTrue(Arrays.equals(b1, b2)); + + pict = (Picture)slides[4].getShapes()[0]; //the fifth slide contains EMF + pdata = pict.getPictureData(); + assertTrue(pdata instanceof EMF); + assertEquals(Picture.EMF, pdata.getType()); + src_bytes = pdata.getData(); + ppt_bytes = read(new File(cwd, "wrench.emf")); + assertTrue(Arrays.equals(src_bytes, ppt_bytes)); + + } + + } -- 2.39.5