【问题标题】:Create docx using docx4j with multiple headers使用具有多个标题的 docx4j 创建 docx
【发布时间】:2014-06-29 08:55:39
【问题描述】:

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

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

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

我也在使用 MainDocumentPart.addAltChunk() 方法在文档中写入 html 内容以创建文档。

提前致谢。

--

问候,

Sanshey Sachdeva

【问题讨论】:

  • 是的,这是可能的。根据需要在 Word 设置中创建一个 docx,然后通过 docx4j 演示 webapp 运行它以查看 sectPr 元素的内容。您还可以使用演示 webapp 生成代码(但不能用于创建和添加页眉/页脚部分对象本身)。
  • 对不起。但是,我是新手,所以我很难将 docx 文件理解为 xml 文件的集合来获得我想要的然后在 docx4j 中实现它。我在网上搜索过我可以使用不同的标题,但有一些限制,比如设置首页标题或偶数/奇数页标题。但是,我没有找到为文档中间的部分设置不同标题的解决方案。
  • 您是否尝试过我的建议“在 Word [with headers] 设置中根据需要创建一个 docx,然后通过 docx4j 演示 webapp 运行它”?
  • 您好 JasonPlutext,我没有找到通过 docx4j 演示 webapp (webapp.docx4java.org/OnlineDemo/demo_landing.html) 生成代码的任何选项。它仅在我单击第一个链接并单击最后一个链接(合并 docx)时生成 xml,我得到了生成的代码,但它使用了付费库 Plutext Library。那么有没有其他方法可以做到这一点,如果在docx4j中不可能,那么在poi,java中。
  • 生成xml的链接就是你要的那个。单击一个 XML 元素(例如 sectPr 元素,或标题部分中的元素),它将生成相应的代码。剩下的就是创建和添加实际的标题部分:maindocumentpart.addPart(headerPart) 将返回您需要在 sectPr 的标题引用中使用的 relId。如果这没有意义,我明天可能有时间写一篇博文。

标签: java docx4j


【解决方案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() 时在每个部分中引入分页;

【讨论】:

    【解决方案2】:

    我终于找到了解决办法。

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

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

    【讨论】:

    • 答案没有说明如何使用代码 sn-ps 来实现问题中指定的功能。一些澄清会有所帮助!
    【解决方案3】:

    我也是为页脚做的

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

    感谢您的指导,效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-03
      相关资源
      最近更新 更多