Link XWPFPicture to XWPFRun, so that embedded pictures can be access from where they live in the text stream
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@996927 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
7fad16fd1b
commit
6c8a90d054
@ -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>
|
||||
|
@ -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);
|
||||
|
@ -17,7 +17,6 @@
|
||||
|
||||
package org.apache.poi.xwpf.usermodel;
|
||||
|
||||
import org.apache.poi.POIXMLDocumentPart;
|
||||
|
||||
/**
|
||||
* 9 Jan 2010
|
||||
|
@ -17,16 +17,16 @@
|
||||
|
||||
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
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -17,11 +17,15 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -249,4 +249,7 @@ public final class TestXWPFParagraph extends TestCase {
|
||||
assertEquals("10", p.getNumID().toString());
|
||||
}
|
||||
|
||||
public void testPictures() throws Exception {
|
||||
// TODO
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user