FileDocCategorySizeDatePackage
TestPictures.javaAPI DocApache Poi 3.0.15290Thu May 31 18:45:56 BST 2007org.apache.poi.hwpf.usermodel

TestPictures.java

/*
* 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.hwpf.usermodel;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.util.Iterator;
import java.util.List;

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.model.TextPiece;
import org.apache.poi.hwpf.usermodel.Paragraph;
import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.util.LittleEndian;

import junit.framework.TestCase;

/**
 * Test the picture handling
 *
 * @author Nick Burch (nick at torchbox dot com)
 */
public class TestPictures extends TestCase {
	private String dirname = System.getProperty("HWPF.testdata.path");
	
    protected void setUp() throws Exception {
    }			
    
    /**
     * two jpegs
     */
    public void testTwoImages() throws Exception {
    	HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/two_images.doc"));
    	List pics = doc.getPicturesTable().getAllPictures();
    	
    	assertNotNull(pics);
    	assertEquals(pics.size(), 2);
    	for(int i=0; i<pics.size(); i++) {
    		Object p = pics.get(i);
    		assertTrue(p instanceof Picture);
    		
    		Picture pic = (Picture)p;
    		assertNotNull(pic.suggestFileExtension());
    		assertNotNull(pic.suggestFullFileName());
    	}
    	
    	Picture picA = (Picture)pics.get(0);
    	Picture picB = (Picture)pics.get(1);
    	assertEquals("jpg", picA.suggestFileExtension());
    	assertEquals("jpg", picA.suggestFileExtension());
    }
    
    /**
     * pngs and jpegs
     */
    public void testDifferentImages() throws Exception {
    	HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/testPictures.doc"));
    	List pics = doc.getPicturesTable().getAllPictures();
    	
    	assertNotNull(pics);
    	assertEquals(7, pics.size());
    	for(int i=0; i<pics.size(); i++) {
    		Object p = pics.get(i);
    		assertTrue(p instanceof Picture);
    		
    		Picture pic = (Picture)p;
    		assertNotNull(pic.suggestFileExtension());
    		assertNotNull(pic.suggestFullFileName());
    	}
    	
    	assertEquals("jpg", ((Picture)pics.get(0)).suggestFileExtension());
    	assertEquals("jpg", ((Picture)pics.get(1)).suggestFileExtension());
    	assertEquals("png", ((Picture)pics.get(3)).suggestFileExtension());
    	assertEquals("png", ((Picture)pics.get(4)).suggestFileExtension());
    	assertEquals("wmf", ((Picture)pics.get(5)).suggestFileExtension());
    	assertEquals("jpg", ((Picture)pics.get(6)).suggestFileExtension());
    }
    
    /**
     * emf image, nice and simple
     */
    public void testEmfImage() throws Exception {
    	HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/vector_image.doc"));
    	List pics = doc.getPicturesTable().getAllPictures();
    	
    	assertNotNull(pics);
    	assertEquals(1, pics.size());
    	
    	Picture pic = (Picture)pics.get(0);
    	assertNotNull(pic.suggestFileExtension());
    	assertNotNull(pic.suggestFullFileName());
    	assertTrue(pic.getSize() > 128);
    	
    	// Check right contents
    	byte[] emf = loadImage("vector_image.emf");
    	byte[] pemf = pic.getContent();
    	assertEquals(emf.length, pemf.length);
    	for(int i=0; i<emf.length; i++) {
    		assertEquals(emf[i], pemf[i]);
    	}
    }
    
    /**
     * emf image, with a crazy offset
     */
    public void testEmfComplexImage() throws Exception {
    	HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/emf_2003_image.doc"));
    	List pics = doc.getPicturesTable().getAllPictures();
    	
    	assertNotNull(pics);
    	assertEquals(1, pics.size());

    	Picture pic = (Picture)pics.get(0);
    	assertNotNull(pic.suggestFileExtension());
    	assertNotNull(pic.suggestFullFileName());
    	
    	// This one's tricky
    	// TODO: Fix once we've sorted bug #41898
    	assertNotNull(pic.getContent());
    	assertNotNull(pic.getRawContent());
    	
    	// These are probably some sort of offset, need to figure them out
    	assertEquals(4, pic.getSize());
    	assertEquals(0x80000000l, LittleEndian.getUInt(pic.getContent()));
    	assertEquals(0x80000000l, LittleEndian.getUInt(pic.getRawContent()));
    }
    
    
    private byte[] loadImage(String filename) throws Exception {
    	ByteArrayOutputStream b = new ByteArrayOutputStream();
    	FileInputStream fis = new FileInputStream(dirname + "/" + filename);
    	
    	byte[] buf = new byte[4096];
    	int read = 0;
    	while( (read = fis.read(buf)) > -1 ) {
    		b.write(buf, 0, read);
    	}
    	return b.toByteArray();
    }
}