Hello,
I am trying to use a template with my docx4j. In my template I am using a placeholder like
#SessionDate#
but when I traverse the docx it is traversing it like that
#
SessionDate
#
How can I fix it ? Thank you.
package com.sap.tap4s.rest;
import java.io.File;
import java.net.URL;
import java.util.List;
import javax.xml.bind.JAXBContext;
import org.docx4j.TraversalUtil;
import org.docx4j.XmlUtils;
import org.docx4j.TraversalUtil.Callback;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.samples.AbstractSample;
import org.docx4j.wml.Body;
/**
* To see what parts comprise your docx, try the PartsList sample.
*
* There will always be a MainDocumentPart, usually called document.xml.
* This sample shows you what objects are in that part.
*
* It also shows a general approach for traversing the JAXB object tree in
* the Main Document part. It can also be applied to headers, footers etc.
*
* It is an alternative to XSLT, and doesn't require marshalling/unmarshalling.
*
* If many cases, the method getJAXBNodesViaXPath would be more convenient,
* but there are 3 JAXB bugs which detract from that (see Getting Started).
*
* See related classes SingleTraversalUtilVisitorCallback
* and CompoundTraversalUtilVisitorCallback
*
* @author jharrop
*
*/
public class OpenMainDocumentAndTraverse extends AbstractSample {
public static JAXBContext context = org.docx4j.jaxb.Context.jc;
public static void main(String[] args) throws Exception {
/*
* You can invoke this from an OS command line with something like:
*
* java -cp dist/docx4j.jar:dist/log4j-1.2.15.jar
* org.docx4j.samples.OpenMainDocumentAndTraverse inputdocx
*
* Note the minimal set of supporting jars.
*
* If there are any images in the document, you will also need:
*
* dist/xmlgraphics-commons-1.4.jar:dist/commons-logging-1.1.1.jar
*/
try {
getInputFilePath(args);
} catch (IllegalArgumentException e) {
inputfilepath = "C:\\Temp\\temp1.docx";
}
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
.load(new java.io.File(inputfilepath));
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
// Uncomment to see the raw XML
//System.out.println(XmlUtils.marshaltoString(documentPart.getJaxbElement(), true, true));
org.docx4j.wml.Document wmlDocumentEl = (org.docx4j.wml.Document) documentPart
.getJaxbElement();
Body body = wmlDocumentEl.getBody();
new TraversalUtil(body,
new Callback() {
String indent = "";
@Override
public List<Object> apply(Object o) {
String text = "";
if (o instanceof org.docx4j.wml.Text)
text = ((org.docx4j.wml.Text) o).getValue();
System.out.println(indent + o.getClass().getName() + " \""
+ text + "\"");
return null;
}
@Override
public boolean shouldTraverse(Object o) {
return true;
}
// Depth first
@Override
public void walkJAXBElements(Object parent) {
indent += " ";
List children = getChildren(parent);
if (children != null) {
for (Object o : children) {
// if its wrapped in javax.xml.bind.JAXBElement, get its
// value
o = XmlUtils.unwrap(o);
this.apply(o);
if (this.shouldTraverse(o)) {
walkJAXBElements(o);
}
}
}
indent = indent.substring(0, indent.length() - 4);
}
@Override
public List<Object> getChildren(Object o) {
return TraversalUtil.getChildrenImpl(o);
}
}
);
}
}
protected List<Object> getAllElementsFromObject(Object obj, Class<?> toSearch) {
List<Object> result = new ArrayList<Object>();
if (obj instanceof JAXBElement) {
obj = ((JAXBElement<?>) obj).getValue();
}
if (obj instanceof SdtElement) {
obj = ((SdtElement)obj).getSdtContent(); // implements ContentAccessor
}
if (obj.getClass().equals(toSearch)) {
result.add(obj);
} else if (obj instanceof ContentAccessor) {
List<?> children = ((ContentAccessor) obj).getContent();
for (Object child : children) {
result.addAll(getAllElementsFromObject(child, toSearch));
}
}
return result;
}
Users browsing this forum: Google [Bot] and 43 guests