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;
    }
}