Page Footer - plutext/docx4j-ImportXHTML GitHub Wiki
To add a footer, you can fall back on docx4j features.
Example:
package mypackage;
import java.math.BigInteger;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.PartName;
import org.docx4j.openpackaging.parts.WordprocessingML.FooterPart;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.relationships.Relationship;
import org.docx4j.wml.Br;
import org.docx4j.wml.CTSimpleField;
import org.docx4j.wml.CTTabStop;
import org.docx4j.wml.FooterReference;
import org.docx4j.wml.Ftr;
import org.docx4j.wml.HdrFtrRef;
import org.docx4j.wml.P;
import org.docx4j.wml.PPr;
import org.docx4j.wml.R;
import org.docx4j.wml.STBrType;
import org.docx4j.wml.STTabJc;
import org.docx4j.wml.Tabs;
import org.docx4j.wml.Text;
public class ExportDocxWithFooter
{
private static final org.docx4j.wml.ObjectFactory factory = new org.docx4j.wml.ObjectFactory();
public static void main(String[] args)
throws Exception
{
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
MainDocumentPart mainPart = wordMLPackage.getMainDocumentPart();
addFooterWithPageCount(wordMLPackage);
mainPart.addStyledParagraphOfText("Heading1", "First page");
mainPart.addObject(createPageBr());
mainPart.addStyledParagraphOfText("Normal", "Second page");
mainPart.addObject(createPageBr());
mainPart.addStyledParagraphOfText("Normal", "Following page");
wordMLPackage.save(new java.io.File("target/header_footer_test2.docx"));
}
private static void addFooterWithPageCount(WordprocessingMLPackage wordMLPackage)
throws Exception
{
MainDocumentPart mainPart = wordMLPackage.getMainDocumentPart();
// Create FooterPart
FooterPart footerPart = new FooterPart(new PartName("/word/content-footer.xml"));
footerPart.setJaxbElement(createFtr());
wordMLPackage.getParts().put(footerPart);
// Reference footer from main document part
Relationship footerRelationship = mainPart.addTargetPart(footerPart);
FooterReference footerReference = factory.createFooterReference();
footerReference.setId(footerRelationship.getId());
footerReference.setType(HdrFtrRef.DEFAULT);
wordMLPackage.getDocumentModel().getSections().get(0).getSectPr().getEGHdrFtrReferences().add(footerReference);
}
public static Ftr createFtr()
{
// Prepare page number special fields
CTSimpleField currentPageNumber = factory.createCTSimpleField();
currentPageNumber.setInstr(" PAGE \\* Arabic \\* MERGEFORMAT ");
CTSimpleField totalPageCount = factory.createCTSimpleField();
totalPageCount.setInstr("NUMPAGES \\* Arabic \\* MERGEFORMAT");
// Create paragraph and add a run for left / right / center.
P p = factory.createP();
// Left
R rLeft = factory.createR();
rLeft.getContent().add(createText("Left footer text"));
p.getContent().add(rLeft);
// Center (the spaces in the strings are non-breaking-space)
R rCenter = factory.createR();
rCenter.getContent().add(createRPTab(STPTabAlignment.CENTER, STPTabRelativeTo.MARGIN, STPTabLeader.NONE));
rCenter.getContent().add(createText("Page "));
rCenter.getContent().add(factory.createPFldSimple(currentPageNumber));
rCenter.getContent().add(createText(" of "));
rCenter.getContent().add(factory.createPFldSimple(totalPageCount));
p.getContent().add(rCenter);
// Right
R rRight = factory.createR();
rRight.getContent().add(createRPTab(STPTabAlignment.RIGHT, STPTabRelativeTo.MARGIN, STPTabLeader.NONE));
rRight.getContent().add(createText("Right footer text"));
p.getContent().add(rRight);
Ftr ftr = factory.createFtr();
ftr.getContent().add(p);
return ftr;
}
private static P createPageBr()
{
P p = factory.createP();
R r = factory.createR();
Br br = factory.createBr();
br.setType(STBrType.PAGE);
r.getContent().add(br);
p.getContent().add(r);
return p;
}
public static Text createText(String value)
{
Text t = factory.createText();
t.setValue(value);
return t;
}
public static R.Ptab createRPTab(STPTabAlignment alignment, STPTabRelativeTo relativeTo, STPTabLeader leader)
{
R.Ptab tab = new R.Ptab();
tab.setAlignment(alignment);
tab.setRelativeTo(relativeTo);
tab.setLeader(leader);
return tab;
}
}