<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>
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);
package org.apache.poi.xwpf.usermodel;
-import org.apache.poi.POIXMLDocumentPart;
/**
* 9 Jan 2010
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
protected XWPFDocument document;
protected List<XWPFRun> runs;
- private StringBuffer pictureText = new StringBuffer();
private StringBuffer footnoteText = new StringBuffer();
-
public XWPFParagraph(CTP prgrph) {
this(prgrph, null);
}
// 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::*");
}
}
}
-
- // 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());
- }
- }
- }
- }
}
}
for(XWPFRun run : runs) {
out.append(run.toString());
}
- out.append(footnoteText).append(pictureText);
+ out.append(footnoteText);
return out.toString();
}
* 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();
}
/**
/**
* @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;
}
this.paragraph = paragraph;
this.ctPic = ctPic;
}
+
/**
* Link Picture with PictureData
* @param rel
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();
return null;
}
-}//end class
+}
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;
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
*/
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
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
+ ));
+ }
+ }
+ }
}
/**
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
* @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());
}
/**
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
}
}
+ // Any picture text?
+ if(pictureText != null && pictureText.length() > 0) {
+ text.append("\n").append(pictureText);
+ }
+
return text.toString();
}
}
assertEquals("10", p.getNumID().toString());
}
+ public void testPictures() throws Exception {
+ // TODO
+ }
}