package com.aspose.words.examples.programming_documents.tableofcontents;
import java.util.ArrayList;
import com.aspose.words.Document;
import com.aspose.words.FieldEnd;
import com.aspose.words.FieldStart;
import com.aspose.words.FieldType;
import com.aspose.words.Node;
import com.aspose.words.NodeType;
import com.aspose.words.examples.Utils;
public class RemoveATableOfContents {
private static final String dataDir = Utils.getSharedDataDir(RemoveATableOfContents.class) + "TableOfContents/";
public static void main(String[] args) throws Exception {
// Open a document which contains a TOC.
Document doc = new Document(dataDir + "Document.TableOfContents.doc");
// Remove the first table of contents from the document.
removeTableOfContents(doc, 0);
// Save the output.
doc.save(dataDir + "Document.TableOfContentsRemoveToc_Out.doc");
}
/**
* Removes the specified table of contents field from the document.
*
* @param doc
* The document to remove the field from.
* @param index
* The zero-based index of the TOC to remove.
*/
public static void removeTableOfContents(Document doc, int index) throws Exception {
// Store the FieldStart nodes of TOC fields in the document for quick access.
ArrayList<FieldStart> fieldStarts = new ArrayList<FieldStart>();
// This is a list to store the nodes found inside the specified TOC. They will be removed
// at the end of this method.
ArrayList<Node> nodeList = new ArrayList<Node>();
for (FieldStart start : (Iterable<FieldStart>) doc.getChildNodes(NodeType.FIELD_START, true)) {
if (start.getFieldType() == FieldType.FIELD_TOC) {
// Add all FieldStarts which are of type FieldTOC.
fieldStarts.add(start);
}
}
// Ensure the TOC specified by the passed index exists.
if (index > fieldStarts.size() - 1)
throw new ArrayIndexOutOfBoundsException("TOC index is out of range");
boolean isRemoving = true;
// Get the FieldStart of the specified TOC.
Node currentNode = fieldStarts.get(index);
while (isRemoving) {
// It is safer to store these nodes and delete them all at once later.
nodeList.add(currentNode);
currentNode = currentNode.nextPreOrder(doc);
// Once we encounter a FieldEnd node of type FieldTOC then we know we are at the end
// of the current TOC and we can stop here.
if (currentNode.getNodeType() == NodeType.FIELD_END) {
FieldEnd fieldEnd = (FieldEnd) currentNode;
if (fieldEnd.getFieldType() == FieldType.FIELD_TOC)
isRemoving = false;
}
}
// Remove all nodes found in the specified TOC.
for (Node node : nodeList) {
node.remove();
}
}
}