/*
|
* 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 cn.flightfeather.supervision.docx4j.simpleDemo;
|
|
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;
|
|
import java.math.BigInteger;
|
|
/**
|
* 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>";
|
|
|
}
|