package com.aspose.words.examples.featurescomparison.documents.inserttableofcontents;
import javax.xml.bind.JAXBElement;
import javax.xml.namespace.QName;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.openpackaging.parts.relationships.Namespaces;
import org.docx4j.wml.Body;
import org.docx4j.wml.FldChar;
import org.docx4j.wml.ObjectFactory;
import org.docx4j.wml.P;
import org.docx4j.wml.R;
import org.docx4j.wml.STFldCharType;
import org.docx4j.wml.Text;
import com.aspose.words.examples.Utils;
/**
* This is an example of adding the TOC field instruction to
* a document.
*
* It then relies on a user to open the document in Word to
* generate the actual table of contents.
*
* Unfortunately, Word can't be made to update the TOC
* automatically and without user interaction.
*
* So its useful to be able to insert the table content via
* docx4j.
*
* The challenge lies in getting page numbering correct, since
* for that you need a page layout model. That bit is in Plutext's
* commercial enterprise edition of docx4j.
*
*/
public class Docx4jTableOfContents
{
// The path to the documents directory.
static String dataDir = Utils.getDataDir(Docx4jTableOfContents.class);
public static void main(String[] args) throws Exception {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
org.docx4j.wml.Document wmlDocumentEl = (org.docx4j.wml.Document)documentPart.getJaxbElement();
Body body = wmlDocumentEl.getBody();
ObjectFactory factory = Context.getWmlObjectFactory();
/* Create the following:
*
<w:p>
<w:r>
<w:fldChar w:dirty="true" w:fldCharType="begin"/>
<w:instrText xml:space="preserve">TOC \o "1-3" \h \z \ u \h</w:instrText>
</w:r>
<w:r/>
<w:r>
<w:fldChar w:fldCharType="end"/>
</w:r>
</w:p> */
P paragraphForTOC = factory.createP();
R r = factory.createR();
FldChar fldchar = factory.createFldChar();
fldchar.setFldCharType(STFldCharType.BEGIN);
fldchar.setDirty(true);
r.getContent().add(getWrappedFldChar(fldchar));
paragraphForTOC.getContent().add(r);
R r1 = factory.createR();
Text txt = new Text();
txt.setSpace("preserve");
txt.setValue("TOC \\o \"1-3\" \\h \\z \\u \\h");
r.getContent().add(factory.createRInstrText(txt) );
paragraphForTOC.getContent().add(r1);
FldChar fldcharend = factory.createFldChar();
fldcharend.setFldCharType(STFldCharType.END);
R r2 = factory.createR();
r2.getContent().add(getWrappedFldChar(fldcharend));
paragraphForTOC.getContent().add(r2);
body.getContent().add(paragraphForTOC);
documentPart.addStyledParagraphOfText("Heading1", "Hello 1");
documentPart.addStyledParagraphOfText("Heading2", "Hello 2");
documentPart.addStyledParagraphOfText("Heading3", "Hello 3");
documentPart.addStyledParagraphOfText("Heading1", "Hello 1");
wordMLPackage.save(new java.io.File(dataDir + "OUT_TableOfContentsAdd.docx") );
}
public static JAXBElement getWrappedFldChar(FldChar fldchar) {
return new JAXBElement( new QName(Namespaces.NS_WORD12, "fldChar"),
FldChar.class, fldchar);
}
}