Search code examples
javadocx4j

Create docx using docx4j with multiple headers


Is it possible to create new header for every different sections using docx4j?

I've seen that MS Word provides functionality to create different headers by creating different sections using section breaks. But I want to implement this functionality using docx4j.

For example: If I've to create a docx files that may contains list of products, some terms and conditions, and some other sections. And I want title for each section to be displayed at top with paging (Like Product Summary: Page 1 of 2, Terms & Conditions: Page 3 of 3).

Also I'm using MainDocumentPart.addAltChunk() method to write html content in the document for creating Document.

Thanks in Advance.

--

Regards,

Sanshey Sachdeva


Solution

  • Finally I got the solution.

    Below piece of code allows me to handle sections:

    SectPr sectPr = null;
    if(isLastSection){
        List<SectionWrapper> sections = wordprocessingMLPackage.getDocumentModel().getSections();
        sectPr = sections.get(sections.size() - 1).getSectPr();
        if (sectPr==null ) {
            sectPr = objectFactory.createSectPr();
            wordprocessingMLPackage.getMainDocumentPart().addObject(sectPr);
            sections.get(sections.size() - 1).setSectPr(sectPr);
        }
    }
    else{
        sectPr = objectFactory.createSectPr();
    }
    

    This code allows me to create separate header for each section:

    HeaderPart headerPart = new HeaderPart(new PartName("/word/header"+ (countHeader++) +".xml"));
    headerPart.setPackage(wordprocessingMLPackage);
    headerPart.setRelationshipType(Namespaces.HEADER);
    headerPart.setJaxbElement(objectFactory.createHdr());
    Relationship relationship = documentPart.addTargetPart(headerPart);
    HeaderReference headerReference = objectFactory.createHeaderReference();
    headerReference.setId(relationship.getId());
    headerReference.setType(HdrFtrRef.DEFAULT);
    sectPr.getEGHdrFtrReferences().add(headerReference);
    

    This piece of code allows me to create separate paging for each section:

    CTPageNumber ctPageNumber = objectFactory.createCTPageNumber();
    ctPageNumber.setStart(BigInteger.ONE);
    sectPr.setPgNumType(ctPageNumber);