Apply Trejkax's fix from bug #41653, and do a whole load of tests for the HWPF picture stuff. Includes a stub test for the problem identified in bug #41898

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@523777 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2007-03-29 17:36:37 +00:00
parent 3ad3a22fd5
commit ee8125f348
3 changed files with 163 additions and 5 deletions

View File

@ -223,11 +223,15 @@ public class Picture
} else if (matchSignature(_dataStream, TIFF, pictureBytesStartOffset) || } else if (matchSignature(_dataStream, TIFF, pictureBytesStartOffset) ||
matchSignature(_dataStream, TIFF1, pictureBytesStartOffset)) { matchSignature(_dataStream, TIFF1, pictureBytesStartOffset)) {
return "tiff"; return "tiff";
} else if (matchSignature(content, WMF1, 0) || } else {
matchSignature(content, WMF2, 0)) { // Need to load the image content before we can try the following tests
return "wmf"; fillImageContent();
} else if (matchSignature(content, EMF, 0)) {
return "emf"; if (matchSignature(content, WMF1, 0) || matchSignature(content, WMF2, 0)) {
return "wmf";
} else if (matchSignature(content, EMF, 0)) {
return "emf";
}
} }
// TODO: DIB, PICT // TODO: DIB, PICT
return ""; return "";

View File

@ -0,0 +1,154 @@
/*
* 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();
}
}