mirror of https://github.com/apache/poi.git
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:
parent
3ad3a22fd5
commit
ee8125f348
|
@ -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 "";
|
||||||
|
|
Binary file not shown.
|
@ -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();
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue