Search code examples
apache-poi

How to set header and Footer position in poi word (XWPF)?


I want to set header and footer's position. Header from top: 45.4 pt, Footer from bottom: 28.4 pt as we can see in Header & Footer Tools menu when we open a word file. Thanks in advance! enter image description here


Solution

  • For this you will need setting the page margins. For this you will need org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar. And for using this we need the fully ooxml-schemas-1.3.jar as mentioned in https://poi.apache.org/faq.html#faq-N10025.

    Example:

    import java.io.*;
    
    import org.apache.poi.xwpf.usermodel.*;
    
    import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
    
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
    import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTPageMar;
    
    import java.math.BigInteger;
    
    public class CreateWordHeaderFooterTopBottom {
    
     public static void main(String[] args) throws Exception {
    
      XWPFDocument document = new XWPFDocument();
    
      // create header-footer
      XWPFHeaderFooterPolicy headerFooterPolicy = document.getHeaderFooterPolicy();
      if (headerFooterPolicy == null) headerFooterPolicy = document.createHeaderFooterPolicy();
    
      // create header start
      XWPFHeader header = headerFooterPolicy.createHeader(XWPFHeaderFooterPolicy.DEFAULT);
    
      XWPFParagraph paragraph = header.createParagraph();
      paragraph.setAlignment(ParagraphAlignment.CENTER);
    
      XWPFRun run = paragraph.createRun();  
      run.setText("Header");
    
      // create footer start
      XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);
    
      paragraph = footer.createParagraph();
      paragraph.setAlignment(ParagraphAlignment.CENTER);
    
      run = paragraph.createRun();  
      run.setText("Footer");
    
      CTSectPr sectPr = document.getDocument().getBody().getSectPr();
      if (sectPr == null) sectPr = document.getDocument().getBody().addNewSectPr();
      CTPageMar pageMar = sectPr.getPgMar();
      if (pageMar == null) pageMar = sectPr.addNewPgMar();
      pageMar.setLeft(BigInteger.valueOf(720)); //720 TWentieths of an Inch Point (Twips) = 720/20 = 36 pt = 36/72 = 0.5"
      pageMar.setRight(BigInteger.valueOf(720));
      pageMar.setTop(BigInteger.valueOf(1440)); //1440 Twips = 1440/20 = 72 pt = 72/72 = 1"
      pageMar.setBottom(BigInteger.valueOf(1440));
    
      pageMar.setHeader(BigInteger.valueOf(908)); //45.4 pt * 20 = 908 = 45.4 pt header from top
      pageMar.setFooter(BigInteger.valueOf(568)); //28.4 pt * 20 = 568 = 28.4 pt footer from bottom
    
      FileOutputStream out = new FileOutputStream("CreateWordHeaderFooterTopBottom.docx");
      document.write(out);
      out.close();
      document.close();
    
     }
    }
    

    Note the special measurement unit Twip = TWentieths of an Inch Point.