/*
* Copyright 2007-2008, Plutext Pty Ltd.
*
* This file is part of docx4j.
docx4j is licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package org.docx4j.samples;
import java.math.BigInteger;
import org.docx4j.XmlUtils;
import org.docx4j.jaxb.Context;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.NumberingDefinitionsPart;
import org.docx4j.wml.Numbering;
import org.docx4j.wml.P;
import org.docx4j.wml.PPrBase.NumPr;
import org.docx4j.wml.PPrBase.NumPr.Ilvl;
import org.docx4j.wml.PPrBase.NumPr.NumId;
/**
* Creates a WordprocessingML document from scratch,
* including a numbering definitions part, and use
* it to demonstrate restart numbering.
*
* @author Jason Harrop
*/
public class NumberingRestart {
static org.docx4j.wml.ObjectFactory factory = Context.getWmlObjectFactory();
static String filename = "OUT_NumberingRestart.docx";
public static void main(String[] args) throws Exception {
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
// Add numbering part
NumberingDefinitionsPart ndp = new NumberingDefinitionsPart();
wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
ndp.setJaxbElement( (Numbering) XmlUtils.unmarshalString(initialNumbering) );
// Add some document content
wordMLPackage.getMainDocumentPart().addParagraphOfText("Example of restarting numbering");
P p = createNumberedParagraph(1, 0, "text on top level" );
wordMLPackage.getMainDocumentPart().addObject(p);
wordMLPackage.getMainDocumentPart().addObject(
createNumberedParagraph(1, 0, "more text on top level" ));
wordMLPackage.getMainDocumentPart().addObject(
createNumberedParagraph(1, 1, "text on level 1" ));
// Ok, lets restart numbering
long newNumId = ndp.restart(1, 0, 1);
wordMLPackage.getMainDocumentPart().addObject(
createNumberedParagraph(newNumId, 0, "text on top level - restarted" ));
// After first using newNumId, it doesn't matter whether
// subsequent paragraphs use that or the original numId
wordMLPackage.getMainDocumentPart().addObject(
createNumberedParagraph(newNumId, 0, "text on top level - using newNumId" ));
wordMLPackage.getMainDocumentPart().addObject(
createNumberedParagraph(1, 0, "text on top level - using original NumId" ));
// Now save it
wordMLPackage.save(new java.io.File(System.getProperty("user.dir") + "/" + filename) );
System.out.println("Done. Saved " + filename);
}
/**
* Create something like:
*
* <w:p>
<w:pPr>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="1"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>B</w:t>
</w:r>
</w:p>
* @return
*/
private static P createNumberedParagraph(long numId, long ilvl, String paragraphText ) {
P p = factory.createP();
org.docx4j.wml.Text t = factory.createText();
t.setValue(paragraphText);
org.docx4j.wml.R run = factory.createR();
run.getContent().add(t);
p.getContent().add(run);
org.docx4j.wml.PPr ppr = factory.createPPr();
p.setPPr( ppr );
// Create and add <w:numPr>
NumPr numPr = factory.createPPrBaseNumPr();
ppr.setNumPr(numPr);
// The <w:ilvl> element
Ilvl ilvlElement = factory.createPPrBaseNumPrIlvl();
numPr.setIlvl(ilvlElement);
ilvlElement.setVal(BigInteger.valueOf(ilvl));
// The <w:numId> element
NumId numIdElement = factory.createPPrBaseNumPrNumId();
numPr.setNumId(numIdElement);
numIdElement.setVal(BigInteger.valueOf(numId));
return p;
}
static final String initialNumbering = "<w:numbering xmlns:ve=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" xmlns:m=\"http://schemas.openxmlformats.org/officeDocument/2006/math\" xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:wp=\"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\" xmlns:w10=\"urn:schemas-microsoft-com:office:word\" xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:wne=\"http://schemas.microsoft.com/office/word/2006/wordml\">"
+ "<w:abstractNum w:abstractNumId=\"0\">"
+ "<w:nsid w:val=\"2DD860C0\"/>"
+ "<w:multiLevelType w:val=\"multilevel\"/>"
+ "<w:tmpl w:val=\"0409001D\"/>"
+ "<w:lvl w:ilvl=\"0\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"decimal\"/>"
+ "<w:lvlText w:val=\"%1)\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"360\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "<w:lvl w:ilvl=\"1\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"lowerLetter\"/>"
+ "<w:lvlText w:val=\"%2)\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"720\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "<w:lvl w:ilvl=\"2\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"lowerRoman\"/>"
+ "<w:lvlText w:val=\"%3)\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"1080\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "<w:lvl w:ilvl=\"3\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"decimal\"/>"
+ "<w:lvlText w:val=\"(%4)\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"1440\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "<w:lvl w:ilvl=\"4\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"lowerLetter\"/>"
+ "<w:lvlText w:val=\"(%5)\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"1800\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "<w:lvl w:ilvl=\"5\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"lowerRoman\"/>"
+ "<w:lvlText w:val=\"(%6)\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"2160\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "<w:lvl w:ilvl=\"6\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"decimal\"/>"
+ "<w:lvlText w:val=\"%7.\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"2520\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "<w:lvl w:ilvl=\"7\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"lowerLetter\"/>"
+ "<w:lvlText w:val=\"%8.\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"2880\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "<w:lvl w:ilvl=\"8\">"
+ "<w:start w:val=\"1\"/>"
+ "<w:numFmt w:val=\"lowerRoman\"/>"
+ "<w:lvlText w:val=\"%9.\"/>"
+ "<w:lvlJc w:val=\"left\"/>"
+ "<w:pPr>"
+ "<w:ind w:left=\"3240\" w:hanging=\"360\"/>"
+ "</w:pPr>"
+ "</w:lvl>"
+ "</w:abstractNum>"
+ "<w:num w:numId=\"1\">"
+ "<w:abstractNumId w:val=\"0\"/>"
+ "</w:num>"
+ "</w:numbering>";
}