<!-- Don't forget to update status.xml too! -->
<release version="3.1.1-alpha1" date="2008-??-??">
- <action dev="POI-DEVELOPERS" type="fix">45720 Fixed HSSFWorkbook.cloneSheet to correctly clone sheets with drawings</action>
- <action dev="POI-DEVELOPERS" type="fix">45728 Fix for SlideShow.reorderSlide in HSLF</action>
+ <action dev="POI-DEVELOPERS" type="add">45738 - Initial HWPF support for Office Art Shapes</action>
+ <action dev="POI-DEVELOPERS" type="fix">45720 - Fixed HSSFWorkbook.cloneSheet to correctly clone sheets with drawings</action>
+ <action dev="POI-DEVELOPERS" type="fix">45728 - Fix for SlideShow.reorderSlide in HSLF</action>
<action dev="POI-DEVELOPERS" type="add">Initial support for embedded movies and controls in HSLF</action>
<action dev="POI-DEVELOPERS" type="fix">45358 - signed/unsigned error when parsing 3-d area refs, performance problem evaluating area refs, and ClassCastExcecption in IF()</action>
<action dev="POI-DEVELOPERS" type="add">Support for HPBF Publisher hyperlinks, including during text extraction</action>
<!-- Don't forget to update changes.xml too! -->
<changes>
<release version="3.1.1-alpha1" date="2008-??-??">
- <action dev="POI-DEVELOPERS" type="fix">45720 Fixed HSSFWorkbook.cloneSheet to correctly clone sheets with drawings</action>
- <action dev="POI-DEVELOPERS" type="fix">45728 Fix for SlideShow.reorderSlide in HSLF</action>
+ <action dev="POI-DEVELOPERS" type="add">45738 - Initial HWPF support for Office Art Shapes</action>
+ <action dev="POI-DEVELOPERS" type="fix">45720 - Fixed HSSFWorkbook.cloneSheet to correctly clone sheets with drawings</action>
+ <action dev="POI-DEVELOPERS" type="fix">45728 - Fix for SlideShow.reorderSlide in HSLF</action>
<action dev="POI-DEVELOPERS" type="add">Initial support for embedded movies and controls in HSLF</action>
<action dev="POI-DEVELOPERS" type="fix">45358 - signed/unsigned error when parsing 3-d area refs, performance problem evaluating area refs, and ClassCastExcecption in IF()</action>
<action dev="POI-DEVELOPERS" type="add">Support for HPBF Publisher hyperlinks, including during text extraction</action>
/** Escher Drawing Group information */
protected EscherRecordHolder _dgg;
+ /** Holds Office Art objects */
+ protected ShapesTable _officeArts;
+
protected HWPFDocument()
{
super(null, null);
// read in the pictures stream
_pictures = new PicturesTable(this, _dataStream, _mainStream, _fspa, _dgg);
+ // And the art shapes stream
+ _officeArts = new ShapesTable(_tableStream, _fib);
_st = new SectionTable(_mainStream, _tableStream, _fib.getFcPlcfsed(), _fib.getLcbPlcfsed(), fcMin, _tpt, _cpSplit);
_ss = new StyleSheet(_tableStream, _fib.getFcStshf());
public PicturesTable getPicturesTable() {
return _pictures;
}
+
+ /**
+ * @return ShapesTable object, that is able to extract office are shapes from this document
+ */
+ public ShapesTable getShapesTable() {
+ return _officeArts;
+ }
/**
* Writes out the word file that is represented by an instance of this class.
--- /dev/null
+/* ====================================================================
+ 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.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.poi.hwpf.usermodel.Shape;
+
+public class ShapesTable {
+ private List _shapes;
+ private List _shapesVisibili; //holds visible shapes
+
+ public ShapesTable(byte [] tblStream, FileInformationBlock fib) {
+ PlexOfCps binTable = new PlexOfCps(tblStream,
+ fib.getFcPlcspaMom(), fib.getLcbPlcspaMom(), 26);
+
+ _shapes = new ArrayList();
+ _shapesVisibili = new ArrayList();
+
+
+ for(int i = 0; i < binTable.length(); i++) {
+ GenericPropertyNode nodo = binTable.getProperty(i);
+
+ Shape sh = new Shape(nodo);
+ _shapes.add(sh);
+ if(sh.isWithinDocument())
+ _shapesVisibili.add(sh);
+ }
+ }
+
+ public List getAllShapes() {
+ return _shapes;
+ }
+
+ public List getVisibleShapes() {
+ return _shapesVisibili;
+ }
+}
--- /dev/null
+/* ====================================================================
+ 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 org.apache.poi.hwpf.model.GenericPropertyNode;
+import org.apache.poi.util.LittleEndian;
+
+public class Shape {
+ int _id, _left, _right, _top, _bottom;
+ /**
+ * true if the Shape bounds are within document (for
+ * example, it's false if the image left corner is outside the doc, like for
+ * embedded documents)
+ */
+ boolean _inDoc;
+
+ public Shape(GenericPropertyNode nodo) {
+ byte [] contenuto = nodo.getBytes();
+ _id = LittleEndian.getInt(contenuto);
+ _left = LittleEndian.getInt(contenuto, 4);
+ _top = LittleEndian.getInt(contenuto, 8);
+ _right = LittleEndian.getInt(contenuto, 12);
+ _bottom = LittleEndian.getInt(contenuto, 16);
+ _inDoc = (_left >= 0 && _right >= 0 && _top >= 0 && _bottom >=
+0);
+ }
+
+ public int getId() {
+ return _id;
+ }
+
+ public int getLeft() {
+ return _left;
+ }
+
+ public int getRight() {
+ return _right;
+ }
+
+ public int getTop() {
+ return _top;
+ }
+
+ public int getBottom() {
+ return _bottom;
+ }
+
+ public int getWidth() {
+ return _right - _left + 1;
+ }
+
+ public int getHeight() {
+ return _bottom - _top + 1;
+ }
+
+ public boolean isWithinDocument() {
+ return _inDoc;
+ }
+}
--- /dev/null
+/*
+* 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.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.poi.hwpf.HWPFDocument;
+
+/**
+ * Test the shapes handling
+ */
+public class TestShapes extends TestCase {
+ private String dirname = System.getProperty("HWPF.testdata.path");
+
+ /**
+ * two shapes, second is a group
+ */
+ public void testShapes() throws Exception {
+ HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/WithArtShapes.doc"));
+
+ List shapes = doc.getShapesTable().getAllShapes();
+ List vshapes = doc.getShapesTable().getVisibleShapes();
+
+ assertEquals(2, shapes.size());
+ assertEquals(2, vshapes.size());
+
+ Shape s1 = (Shape)shapes.get(0);
+ Shape s2 = (Shape)shapes.get(1);
+
+ assertEquals(3616, s1.getWidth());
+ assertEquals(1738, s1.getHeight());
+ assertEquals(true, s1.isWithinDocument());
+
+ assertEquals(4817, s2.getWidth());
+ assertEquals(2164, s2.getHeight());
+ assertEquals(true, s2.isWithinDocument());
+
+
+ // Re-serialisze, check still there
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ doc.write(baos);
+ ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
+ doc = new HWPFDocument(bais);
+
+ shapes = doc.getShapesTable().getAllShapes();
+ vshapes = doc.getShapesTable().getVisibleShapes();
+
+ assertEquals(2, shapes.size());
+ assertEquals(2, vshapes.size());
+
+ s1 = (Shape)shapes.get(0);
+ s2 = (Shape)shapes.get(1);
+
+ assertEquals(3616, s1.getWidth());
+ assertEquals(1738, s1.getHeight());
+ assertEquals(true, s1.isWithinDocument());
+
+ assertEquals(4817, s2.getWidth());
+ assertEquals(2164, s2.getHeight());
+ assertEquals(true, s2.isWithinDocument());
+
+ }
+}