问题
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
回答1:
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();
回答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);
回答3:
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.
来源:https://stackoverflow.com/questions/23601516/create-docx-using-docx4j-with-multiple-headers