]> source.dussan.org Git - poi.git/commitdiff
Link XWPFPicture to XWPFRun, so that embedded pictures can be access from where they...
authorNick Burch <nick@apache.org>
Tue, 14 Sep 2010 14:52:35 +0000 (14:52 +0000)
committerNick Burch <nick@apache.org>
Tue, 14 Sep 2010 14:52:35 +0000 (14:52 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@996927 13f79535-47bb-0310-9956-ffa450edef68

src/documentation/content/xdocs/status.xml
src/ooxml/java/org/apache/poi/xwpf/extractor/XWPFWordExtractor.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/IBodyElement.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFFactory.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFParagraph.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFPicture.java
src/ooxml/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
src/ooxml/testcases/org/apache/poi/xwpf/usermodel/TestXWPFParagraph.java

index 014a0856524271a307770228736e67c9710786ef..1f0db4a167ab91b5471458f102fdaa777507a2ac 100644 (file)
@@ -34,6 +34,7 @@
 
     <changes>
         <release version="3.7-beta3" date="2010-??-??">
+           <action dev="poi-developers" type="add">Link XWPFPicture to XWPFRun, so that embedded pictures can be access from where they live in the text stream</action>
            <action dev="poi-developers" type="fix">Improve handling of Hyperlinks inside XWPFParagraph objects through XWPFHyperlinkRun</action>
            <action dev="poi-developers" type="fix">Make XWPFParagraph make more use of XWPFRun, and less on internal StringBuffers</action>
            <action dev="poi-developers" type="add">Add a getBodyElements() method to XWPF IBody, to make access to embedded paragraphs and tables easier</action>
index c990776daf8912cfa969f1a131578efb7e7f6e2d..d11511757a1ca6509e3ca1a98672034c532bcd8b 100644 (file)
@@ -120,14 +120,11 @@ public class XWPFWordExtractor extends POIXMLTextExtractor {
                                XWPFCommentsDecorator decorator = new XWPFCommentsDecorator(paragraph, null);
                                text.append(decorator.getCommentText()).append('\n');
                                
-                               // Do endnotes, footnotes and pictures
-                               for(String str : new String[] {
-                                     paragraph.getFootnoteText(), paragraph.getPictureText()
-                               }) {
-                                  if(str != null && str.length() > 0) {
-                                     text.append(str + "\n");
-                                  }
-                               }
+                               // Do endnotes and footnotes
+                               String footnameText = paragraph.getFootnoteText();
+                          if(footnameText != null && footnameText.length() > 0) {
+                             text.append(footnameText + "\n");
+                          }
 
                                if (ctSectPr!=null) {
                                        extractFooters(text, headerFooterPolicy);
index 03d133b37f83ec54fb10161faacc83cb74213bc5..527eb7ae4dc64e2d83901ca48a66e0c7947cef4a 100644 (file)
@@ -17,7 +17,6 @@
 
 package org.apache.poi.xwpf.usermodel;
 
-import org.apache.poi.POIXMLDocumentPart;
 
 /**
  * 9 Jan 2010
index dfa67d95f68e325e331bb5fd2cdd0f65733ad207..b6c641b4adad7e5b690fccc1598a3ab868138f08 100644 (file)
 
 package org.apache.poi.xwpf.usermodel;
 
-import org.apache.poi.POIXMLFactory;
+import java.lang.reflect.Constructor;
+
 import org.apache.poi.POIXMLDocumentPart;
 import org.apache.poi.POIXMLException;
+import org.apache.poi.POIXMLFactory;
 import org.apache.poi.POIXMLRelation;
-import org.apache.poi.util.POILogger;
-import org.apache.poi.util.POILogFactory;
-import org.apache.poi.openxml4j.opc.PackageRelationship;
 import org.apache.poi.openxml4j.opc.PackagePart;
-
-import java.lang.reflect.Constructor;
+import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.util.POILogFactory;
+import org.apache.poi.util.POILogger;
 
 /**
  * @author Yegor Kozlov
index 2a57f6988ef50a9e56a768862769e3dc619815c5..dccdc44073bf9681eeebe0832786d960bcc9eb1e 100644 (file)
@@ -64,10 +64,8 @@ public class XWPFParagraph implements IBodyElement{
     protected XWPFDocument document;
     protected List<XWPFRun> runs;
     
-    private StringBuffer pictureText = new StringBuffer();
     private StringBuffer footnoteText = new StringBuffer();
 
-
     public XWPFParagraph(CTP prgrph) {
         this(prgrph, null);
     }
@@ -125,6 +123,7 @@ public class XWPFParagraph implements IBodyElement{
           
           // Check for bits that only apply when
           //  attached to a core document
+          // TODO Make this nicer by tracking the XWPFFootnotes directly
           if(document != null) {
              c = r.newCursor();
              c.selectPath("child::*");
@@ -151,22 +150,6 @@ public class XWPFParagraph implements IBodyElement{
                 }
              }
           }
-
-          // Loop over pictures inside our
-          // paragraph, looking for text in them
-          for(CTPicture pict : r.getPictList()) {
-              XmlObject[] t = pict
-                      .selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//w:t");
-              for (int m = 0; m < t.length; m++) {
-                  NodeList kids = t[m].getDomNode().getChildNodes();
-                  for (int n = 0; n < kids.getLength(); n++) {
-                      if (kids.item(n) instanceof Text) {
-                          pictureText.append("\n");
-                          pictureText.append(kids.item(n).getNodeValue());
-                      }
-                  }
-              }
-          }
       }
     }
 
@@ -196,7 +179,7 @@ public class XWPFParagraph implements IBodyElement{
         for(XWPFRun run : runs) {
            out.append(run.toString());
         }
-        out.append(footnoteText).append(pictureText);
+        out.append(footnoteText);
         return out.toString();
     }
        
@@ -261,7 +244,11 @@ public class XWPFParagraph implements IBodyElement{
      * Returns any text from any suitable pictures in the paragraph
      */
     public String getPictureText() {
-        return pictureText.toString();
+       StringBuffer out = new StringBuffer();
+       for(XWPFRun run : runs) {
+          out.append(run.getPictureText());
+       }
+       return out.toString();
     }
 
     /**
index 4b1cea3fc35a6ece290c58053e119cbbc701860d..eaeb78072009342989368addc16f7526138d0ee8 100644 (file)
@@ -25,14 +25,13 @@ import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture;
 
 /**
  * @author Philipp Epp
- *
  */
 public class XWPFPicture {
-       private static final POILogger logger = POILogFactory.getLogger(XWPFPicture.class); 
+       private static final POILogger logger = POILogFactory.getLogger(XWPFPicture.class);
+       
        protected XWPFParagraph paragraph;
        private CTPicture ctPic;
         
-        
         public XWPFParagraph getParagraph(){
                 return paragraph;
         }
@@ -41,6 +40,7 @@ public class XWPFPicture {
                 this.paragraph = paragraph;
                 this.ctPic = ctPic;
         }
+        
         /**
          * Link Picture with PictureData
          * @param rel
@@ -57,9 +57,10 @@ public class XWPFPicture {
     public CTPicture getCTPicture(){
         return ctPic;
     }
+    
     /**
-     * Get the PictureData of the Picture
-     * @return
+     * Get the PictureData of the Picture, if present.
+     * Note - not all kinds of picture have data
      */
     public XWPFPictureData getPictureData(){
        String blipId = ctPic.getBlipFill().getBlip().getEmbed();
@@ -71,4 +72,4 @@ public class XWPFPicture {
        return null;
     }
     
-}//end class
+}
index 2b37383b3dd12d53d645b7c7ffe5e723215bf8cc..d7fbd2d6a903ad967a0cfb4fff5b73ae70f0b0c1 100644 (file)
 package org.apache.poi.xwpf.usermodel;
 
 import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.namespace.QName;
 
 import org.apache.poi.util.Internal;
+import org.apache.xmlbeans.XmlCursor;
 import org.apache.xmlbeans.XmlObject;
 import org.apache.xmlbeans.XmlString;
-import org.apache.xmlbeans.XmlCursor;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBr;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTEmpty;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts;
@@ -39,8 +43,8 @@ import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBrType;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STOnOff;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STUnderline;
 import org.openxmlformats.schemas.wordprocessingml.x2006.main.STVerticalAlignRun;
-
-import javax.xml.namespace.QName;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
 
 /**
  * XWPFRun object defines a region of text with a common set of properties
@@ -49,7 +53,9 @@ import javax.xml.namespace.QName;
  */
 public class XWPFRun {
     private CTR run;
+    private String pictureText;
     private XWPFParagraph paragraph;
+    private List<XWPFPicture> pictures;
 
     /**
      * @param r the CTR bean which holds the run attributes
@@ -58,6 +64,42 @@ public class XWPFRun {
     public XWPFRun(CTR r, XWPFParagraph p) {
         this.run = r;
         this.paragraph = p;
+        
+        // Look for any text in any of our pictures or drawings
+        StringBuffer text = new StringBuffer();
+        List<XmlObject> pictTextObjs = new ArrayList<XmlObject>();
+        pictTextObjs.addAll(r.getPictList());
+        pictTextObjs.addAll(r.getDrawingList());
+        for(XmlObject o : pictTextObjs) {
+           XmlObject[] t = o
+                 .selectPath("declare namespace w='http://schemas.openxmlformats.org/wordprocessingml/2006/main' .//w:t");
+           for (int m = 0; m < t.length; m++) {
+              NodeList kids = t[m].getDomNode().getChildNodes();
+              for (int n = 0; n < kids.getLength(); n++) {
+                 if (kids.item(n) instanceof Text) {
+                    if(text.length() > 0)
+                       text.append("\n");
+                    text.append(kids.item(n).getNodeValue());
+                 }
+              }
+           }
+        }
+        pictureText = text.toString();
+        
+        // Do we have any embedded pictures?
+        // (They're a different CTPicture, under the drawingml namespace)
+        pictures = new ArrayList<XWPFPicture>();
+        for(XmlObject o : pictTextObjs) {
+           XmlObject[] picts = o
+                 .selectPath("declare namespace pic='http://schemas.openxmlformats.org/drawingml/2006/picture' .//pic:pic");
+           for(XmlObject pict : picts) {
+              if(pict instanceof org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture) {
+                 pictures.add(new XWPFPicture(
+                       (org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture)pict, p
+                 ));
+              }
+           }
+        }
     }
 
     /**
@@ -127,6 +169,13 @@ public class XWPFRun {
         return run.sizeOfTArray() == 0 ? null : run.getTArray(pos)
                 .getStringValue();
     }
+    
+    /**
+     * Returns text embedded in pictures
+     */
+    public String getPictureText() {
+        return pictureText;
+    }
 
     /**
      * Sets the text of this text run
@@ -134,7 +183,7 @@ public class XWPFRun {
      * @param value the literal text which shall be displayed in the document
      */
     public void setText(String value) {
-       setText(value,run.getTList().size());
+       setText(value,run.getTList().size());
     }
 
     /**
@@ -479,6 +528,15 @@ public class XWPFRun {
     public void removeCarriageReturn() {
        //TODO
     }    
+    
+    /**
+     * Returns the embedded pictures of the run. These
+     *  are pictures which reference an external, 
+     *  embedded picture image such as a .png or .jpg
+     */
+    public List<XWPFPicture> getEmbeddedPictures() {
+       return pictures;
+    }
 
     /**
      * Add the xml:spaces="preserve" attribute if the string has leading or trailing white spaces
@@ -534,6 +592,11 @@ public class XWPFRun {
            }
        }
        
+       // Any picture text?
+       if(pictureText != null && pictureText.length() > 0) {
+          text.append("\n").append(pictureText);
+       }
+       
        return text.toString();
     }
 }
index ac7e4f7a5c3d4f8619ad0766894924053255a723..5abc6a20055cb5d89139d814ccb0a91eb4bc731f 100644 (file)
@@ -249,4 +249,7 @@ public final class TestXWPFParagraph extends TestCase {
         assertEquals("10", p.getNumID().toString());
     }
     
+    public void testPictures() throws Exception {
+       // TODO
+    }
 }