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

有帮助吗?

解决方案 2

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

其他提示

Finally I got the solution.

Below mentioned method creates as many headers as I want.

private static int countHeader = 0;

public static void createHeaderForSection(WordprocessingMLPackage wordprocessingMLPackage, String headerString) throws Exception {
    MainDocumentPart documentPart = wordprocessingMLPackage.getMainDocumentPart();
    HeaderPart headerPart = new HeaderPart(new PartName("/word/header"+ (++countHeader) +".xml"));
    headerPart.setPackage(wordprocessingMLPackage);
    headerPart.addAltChunk(AltChunkType.Html, headerString.getBytes("UTF-8"));
    headerPart.setRelationshipType(Namespaces.HEADER);
    Relationship relationship = documentPart.addTargetPart(headerPart);
    SectPr sectPr = objectFactory.createSectPr();
    HeaderReference headerReference = factory.createHeaderReference();
    headerReference.setId(relationship.getId());
    headerReference.setType(HdrFtrRef.DEFAULT);
    sectPr.getEGHdrFtrReferences().add(headerReference);
    P p = objectFactory.createP();
    PPr ppr = objectFactory.createPPr();
    p.setPPr(ppr);
    ppr.setSectPr(sectPr);
    wordprocessingMLPackage.getMainDocumentPart().getContent().add(p);
}

But, Still I'm unable to find out how to introduce paging in each section while using headerPart.addAltChunk();

I did it for Footer as well

 FooterPart footerPart = new FooterPart(new PartName("/word/footer"+ (countHeader) +".xml"));
 footerPart.setPackage(pkg);
 footerPart.setRelationshipType(Namespaces.FOOTER);
 footerPart.setJaxbElement(objectFactory.createFtr());
 Relationship relationshipF = documentPart.addTargetPart(footerPart);
 FooterReference footerReference = objectFactory.createFooterReference();
 footerReference.setId(relationshipF.getId());
 footerReference.setType(HdrFtrRef.DEFAULT);
 sectPr.getEGHdrFtrReferences().add(footerReference);

Thanks for the direction and it worked fine.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top