123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- /* ====================================================================
- Licensed to the Apache Software Foundation (ASF) under one or more
- contributor license agreements. See the NOTICE file distributed with
- this work for additional information regarding copyright ownership.
- The ASF licenses this file to You 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.hslf.exceptions.HSLFException;
-
- import java.io.ByteArrayOutputStream;
- import java.io.InputStream;
- import java.io.ByteArrayInputStream;
- import java.io.IOException;
- import java.util.zip.InflaterInputStream;
-
- /**
- * Represents EMF (Windows Enhanced Metafile) picture data.
- *
- * @author Yegor Kozlov
- */
- public final 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 HSLFException(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 {@code 0x3D40} or {@code 0x3D50}
- *
- * @return EMF signature ({@code 0x3D40} or {@code 0x3D50})
- */
- public int getSignature() {
- return (uidInstanceCount == 1 ? 0x3D40 : 0x3D50);
- }
-
- /**
- * Sets the EMF signature - either {@code 0x3D40} or {@code 0x3D50}
- */
- public void setSignature(int signature) {
- switch (signature) {
- case 0x3D40:
- uidInstanceCount = 1;
- break;
- case 0x3D50:
- uidInstanceCount = 2;
- break;
- default:
- throw new IllegalArgumentException(signature+" is not a valid instance/signature value for EMF");
- }
- }
- }
|