Pregunta

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

¿Fue útil?

Solución 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);

Otros consejos

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top