使用带有多个标头的docx4j创建docx

时间:2014-05-12 05:17:57

标签: java docx4j

是否可以使用docx4j为每个不同的部分创建新标头?

我已经看到MS Word通过使用分节符创建不同的部分来提供创建不同标题的功能。但我想使用docx4j实现此功能。

例如: 如果我要创建一个docx文件,其中可能包含产品列表,一些条款和条件,以及其他一些部分。我希望每个部分的标题都能在页面顶部显示分页(如产品摘要:第1页,共2页,条款和条件:第3页,共3页)。

此外,我正在使用MainDocumentPart.addAltChunk()方法在文档中编写html内容以创建Document。

先谢谢。

-

此致

Sanshey Sachdeva

3 个答案:

答案 0 :(得分:1)

最后我得到了解决方案

下面提到的方法可以创建任意数量的标题。

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

但是,在使用headerPart.addAltChunk()时,我仍然无法找到如何在每个部分引入分页;

答案 1 :(得分:0)

最后我得到了解决方案。

下面的代码允许我处理部分:

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

此代码允许我为每个部分创建单独的标题:

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

这段代码允许我为每个部分创建单独的分页:

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

答案 2 :(得分:0)

我也为Footer做了

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

感谢方向,并且工作正常。