]> source.dussan.org Git - poi.git/commitdiff
Apply Trejkax's fix from bug #41653, and do a whole load of tests for the HWPF pictur...
authorNick Burch <nick@apache.org>
Thu, 29 Mar 2007 17:36:37 +0000 (17:36 +0000)
committerNick Burch <nick@apache.org>
Thu, 29 Mar 2007 17:36:37 +0000 (17:36 +0000)
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@523777 13f79535-47bb-0310-9956-ffa450edef68

src/scratchpad/src/org/apache/poi/hwpf/usermodel/Picture.java
src/scratchpad/testcases/org/apache/poi/hwpf/data/emf_2003_image.doc [new file with mode: 0644]
src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java [new file with mode: 0644]

index 535b834cbd8afb29dad6f154186e90d6ab18903a..e9ee228c12693e1b6934e41dbee937d6f5c38250 100644 (file)
@@ -223,11 +223,15 @@ public class Picture
     } else if (matchSignature(_dataStream, TIFF, pictureBytesStartOffset) ||
                matchSignature(_dataStream, TIFF1, pictureBytesStartOffset)) {
       return "tiff";
-    } else if (matchSignature(content, WMF1, 0) ||
-               matchSignature(content, WMF2, 0)) {
-      return "wmf";
-    } else if (matchSignature(content, EMF, 0)) {
-      return "emf";
+       } else {
+        // Need to load the image content before we can try the following tests
+        fillImageContent();
+
+        if (matchSignature(content, WMF1, 0) || matchSignature(content, WMF2, 0)) {
+            return "wmf";
+        } else if (matchSignature(content, EMF, 0)) {
+            return "emf";
+        }
     }
     // TODO: DIB, PICT
     return "";
diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/emf_2003_image.doc b/src/scratchpad/testcases/org/apache/poi/hwpf/data/emf_2003_image.doc
new file mode 100644 (file)
index 0000000..a475813
Binary files /dev/null and b/src/scratchpad/testcases/org/apache/poi/hwpf/data/emf_2003_image.doc differ
diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestPictures.java
new file mode 100644 (file)
index 0000000..686e558
--- /dev/null
@@ -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();
+    }
+}