Search code examples
javams-wordapache-poixwpf

apache poi disable default footer for the first page


I am trying to create a word document in which I will have no footer only in the first page and a footer for the rest of the pages. I wrote the following code (I also tried to change -reverse- the order of creation of footer and footerFirst objects) but that did not help. I still have the default footer on all pages.

How should I disable the footer from the first page? Thanks in advance.

private XWPFDocument initDocument(String FILE) throws Exception{
    XWPFDocument document = new XWPFDocument();

    XWPFHeaderFooterPolicy headerFooterPolicy = document.getHeaderFooterPolicy();
    if (headerFooterPolicy == null) headerFooterPolicy = document.createHeaderFooterPolicy();


    // create header start
    XWPFFooter footer = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.DEFAULT);

    //XWPFParagraph paragraph = footer.createParagraph();
    XWPFParagraph paragraph = footer.getParagraphArray(0);
    if (paragraph == null)
        paragraph = footer.createParagraph();
    paragraph.setAlignment(ParagraphAlignment.CENTER);

    XWPFRun run = paragraph.createRun();
    run.setFontSize(11);
    run.setFontFamily("Times New Roman");
    run.setText("Some company info in the footer");

    XWPFFooter footerFirst = headerFooterPolicy.createFooter(XWPFHeaderFooterPolicy.FIRST);
    paragraph = footerFirst.getParagraphArray(0);
    if (paragraph == null)
        paragraph = footerFirst.createParagraph();
    paragraph.setAlignment(ParagraphAlignment.CENTER);

    run = paragraph.createRun();
    run.setText(" ");



    return document;
}

Solution

  • That there is a different header set for first page only, means not that this header will also be shown. In Word GUI there is a checkbox [x] Different First Page in Header & Footer Tools to achieve that.

    And according Office Open XML Part 4 - Markup Language Reference there must a boolean XML element titlePg be set to determine that there is a title page present.

    In old apache poi versions using XWPFHeaderFooterPolicy this XML element titlePg can only be set using underlying low level objects using document.getDocument().getBody().getSectPr().addNewTitlePg();.

    But using current apache poi versions (since 3.16) there is no need using XWPFHeaderFooterPolicy directly. Now there is XWPFDocument.createHeader and XWPFDocument.createFooter using a HeaderFooterType. This sets titlePg flag in XML when HeaderFooterType.FIRST is used.

    Complete example which sets and uses HeaderFooterType.FIRST and HeaderFooterType.DEFAULT:

    import java.io.FileOutputStream;
    
    import org.apache.poi.xwpf.usermodel.*;
    import org.apache.poi.wp.usermodel.HeaderFooterType;
    
    public class CreateWordFooters {
    
     public static void main(String[] args) throws Exception {
         
      XWPFDocument document = new XWPFDocument();
    
      // the body content
      XWPFParagraph paragraph = document.createParagraph();
      XWPFRun run = paragraph.createRun();  
      run.setText("The Body... first page");
      
      paragraph = document.createParagraph();
      run=paragraph.createRun();
      run.addBreak(BreakType.PAGE); 
      run.setText("The Body... second page");
    
      // create first page footer
      XWPFFooter footer = document.createFooter(HeaderFooterType.FIRST);
      paragraph = footer.createParagraph();
      paragraph.setAlignment(ParagraphAlignment.CENTER);
      run = paragraph.createRun();
      run.setText("First page footer...");
    
      // create default footer
      footer = document.createFooter(HeaderFooterType.DEFAULT);
      paragraph = footer.createParagraph();
      paragraph.setAlignment(ParagraphAlignment.LEFT);
      run = paragraph.createRun();
      run.setText("Default footer...");
    
      FileOutputStream out = new FileOutputStream("CreateWordFooters.docx");
      document.write(out);
      out.close();
      document.close();
    
    
     }
    }