package org.docx4j.toc; import java.io.File; import junit.framework.Assert; import org.docx4j.Docx4J; import org.docx4j.TraversalUtil; import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart; import org.docx4j.wml.Body; import org.docx4j.wml.Document; import org.docx4j.wml.SdtBlock; import org.junit.Test; public class TocGenerateTest { public static final String TOC_STYLE_MASK = "TOC%s"; @Test public void testGeneral() throws TocException, Exception { WordprocessingMLPackage wordMLPackage = createPkg(); TocGenerator tocGenerator = new TocGenerator(wordMLPackage); tocGenerator.generateToc( 0, " TOC \\o \"1-3\" \\h \\z \\u ", true); SdtBlock sdt = getTocSDT(wordMLPackage); // System.out.println(sdt.getSdtContent().getContent().size()); // System.out.println(wordMLPackage.getMainDocumentPart().getXML()); // Title p + instruction p + 3 entries + end p Assert.assertEquals(6, sdt.getSdtContent().getContent().size()); } @Test public void testHeading() throws TocException, Exception { WordprocessingMLPackage wordMLPackage = createPkg(); TocGenerator tocGenerator = new TocGenerator(wordMLPackage); tocGenerator.generateToc( 0, "TOC \\o \"1-3\"", true); SdtBlock sdt = getTocSDT(wordMLPackage); // System.out.println(sdt.getSdtContent().getContent().size()); System.out.println(wordMLPackage.getMainDocumentPart().getXML()); // Title p + instruction p + 3 entries + end p Assert.assertEquals(6, sdt.getSdtContent().getContent().size()); } // @Test // public void testHyperlink() throws TocException, Exception { // // WordprocessingMLPackage wordMLPackage = createPkg(); // // TocGenerator.generateToc(wordMLPackage, 0, "TOC \\h", true); // // SdtBlock sdt = getTocSDT(wordMLPackage); // // // Title p + instruction p + 3 entries + end p // Assert.assertEquals(6, sdt.getSdtContent().getContent().size()); // } @Test public void testOutlineLevel() throws TocException, Exception { WordprocessingMLPackage wordMLPackage = createPkg(); TocGenerator tocGenerator = new TocGenerator(wordMLPackage); tocGenerator.generateToc( 0, "TOC \\u", true); SdtBlock sdt = getTocSDT(wordMLPackage); // System.out.println(sdt.getSdtContent().getContent().size()); // System.out.println(wordMLPackage.getMainDocumentPart().getXML()); // System.out.println(wordMLPackage.getMainDocumentPart().getStyleDefinitionsPart().getXML()); // Title p + instruction p + 3 entries + end p Assert.assertEquals(6, sdt.getSdtContent().getContent().size()); } @Test public void testHeadingTrumpsOutline() throws TocException, Exception { WordprocessingMLPackage wordMLPackage = createPkg(); TocGenerator tocGenerator = new TocGenerator(wordMLPackage); tocGenerator.generateToc( 0, "TOC \\o \"1-2\" \\u", true); SdtBlock sdt = getTocSDT(wordMLPackage); // System.out.println(sdt.getSdtContent().getContent().size()); System.out.println(wordMLPackage.getMainDocumentPart().getXML()); // Title p + instruction p + 2 entries + end p Assert.assertEquals(5, sdt.getSdtContent().getContent().size()); } // @Test // public void testToCHeadingNull() throws TocException, Exception { // // Toc.setTocHeadingText(null); // Word is ok with this // // WordprocessingMLPackage wordMLPackage = createPkg(); // // TocGenerator tocGenerator = new TocGenerator(wordMLPackage); // tocGenerator.generateToc( 0, " TOC \\o \"1-3\" \\h \\z \\u ", true); // // SdtBlock sdt = getTocSDT(wordMLPackage); // //// System.out.println(sdt.getSdtContent().getContent().size()); // System.out.println(wordMLPackage.getMainDocumentPart().getXML()); // // Docx4J.save(wordMLPackage, new File("testToCHeadingNull.docx")); // } // // @Test // public void testToCHeadingEmpty() throws TocException, Exception { // // Toc.setTocHeadingText(""); // Word is ok with this // // WordprocessingMLPackage wordMLPackage = createPkg(); // // TocGenerator tocGenerator = new TocGenerator(wordMLPackage); // tocGenerator.generateToc( 0, " TOC \\o \"1-3\" \\h \\z \\u ", true); // // SdtBlock sdt = getTocSDT(wordMLPackage); // //// System.out.println(sdt.getSdtContent().getContent().size()); // System.out.println(wordMLPackage.getMainDocumentPart().getXML()); // // Docx4J.save(wordMLPackage, new File("testToCHeadingEmpty.docx")); // } // // @Test // public void testToCHeadingSet() throws TocException, Exception { // // Toc.setTocHeadingText("Alpha"); // // WordprocessingMLPackage wordMLPackage = createPkg(); // // TocGenerator tocGenerator = new TocGenerator(wordMLPackage); // tocGenerator.generateToc( 0, " TOC \\o \"1-3\" \\h \\z \\u ", true); // // SdtBlock sdt = getTocSDT(wordMLPackage); // //// System.out.println(sdt.getSdtContent().getContent().size()); // System.out.println(wordMLPackage.getMainDocumentPart().getXML()); // // Docx4J.save(wordMLPackage, new File("testToCHeadingSet.docx")); // } private SdtBlock getTocSDT(WordprocessingMLPackage wordMLPackage) { MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); Document wmlDocumentEl = (Document)documentPart.getJaxbElement(); Body body = wmlDocumentEl.getBody(); TocFinder finder = new TocFinder(); new TraversalUtil(body.getContent(), finder); return finder.tocSDT; } private WordprocessingMLPackage createPkg() throws Exception{ WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage(); MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart(); for(int i = 1; i < 10; i++){ documentPart.getPropertyResolver().activateStyle(String.format(TOC_STYLE_MASK, i)); } documentPart.addStyledParagraphOfText("Heading1", "Hello 1"); fillPageWithContent(documentPart, "Hello 1"); documentPart.addStyledParagraphOfText("Heading1", ""); // Word omits empty entries from ToC fillPageWithContent(documentPart, "Hello 1"); documentPart.addStyledParagraphOfText("Heading2", "Hello 2"); fillPageWithContent(documentPart, "Hello 2"); documentPart.addStyledParagraphOfText("Heading3", "Hello 3"); fillPageWithContent(documentPart, "Hello 3"); return wordMLPackage; } private static void fillPageWithContent(MainDocumentPart documentPart, String content){ for(int i = 0; i < 2; i++){ documentPart.addStyledParagraphOfText("Normal", content + " paragraph " + i); } } }