当前位置: 首页 > 知识库问答 >
问题:

如何用docx4j将html文件作为标头

令狐宏伟
2023-03-14

我正在使用docx4j生成一个带有.html文件的.docx文件。html文件首先用JTIDY转换成xhtml。这个文件是我的文档的正文。

我也在用头做同样的事情,我也有一个文件。

    //Header Part start
    HeaderPart headerPart = new HeaderPart();
    Relationship rel = wordMLPackage.getMainDocumentPart().addTargetPart(headerPart);
    String hdrXml = "<w:hdr xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">"
            + "<w:p>"
            + "<w:pPr>"
            //+ "<w:pStyle w:val=\"Header\"/>"
            + "<w:jc w:val=\"center\"/>"
            + "</w:pPr>"
            + "<w:r>"
            + "<w:t xml:space=\"preserve\">" + myFileContentInString + "</w:t>"
            + "</w:r>"
            //  + "<w:fldSimple w:instr=\" PAGE \\* MERGEFORMAT \">"
            // + "<w:r>"
            //  + "<w:rPr>"
            //  + "<w:noProof/>"
            //  + "</w:rPr>"
            // + "</w:r>"
            // + "</w:fldSimple>"
            + "</w:p>"
            + "</w:hdr>";

    Hdr hdr = (Hdr) XmlUtils.unmarshalString(hdrXml);
    wordMLPackage.getDocumentModel().getSections().get(0).getHeaderFooterPolicy().getFirstHeader();
    headerPart.setJaxbElement(hdr);

    List<SectionWrapper> sections = wordMLPackage.getDocumentModel().getSections();

    SectPr sectPr = sections.get(sections.size() - 1).getSectPr();
    // There is always a section wrapper, but it might not contain a sectPr

    if (sectPr == null) {
        sectPr = objectFactory.createSectPr();
        wordMLPackage.getMainDocumentPart().addObject(sectPr);
        sections.get(sections.size() - 1).setSectPr(sectPr);
    }

    HeaderReference headerReference = objectFactory.createHeaderReference();
    headerReference.setId(rel.getId());
    headerReference.setType(HdrFtrRef.DEFAULT);
    sectPr.getEGHdrFtrReferences().add(headerReference);

    //Header Part End

编辑:在你的回答之后,我这样更新了我的代码(这里是完整的代码):

    String inputfilepath = "Offers/" + param.getKey1() + "_" + param.getKey2() + "/c.xhtml";
    String inputfilepath2 = "Offers/" + param.getKey1() + "_" + param.getKey2() + "/cc.xhtml";


    // Create an empty docx package
    WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
    ObjectFactory objectFactory = Context.getWmlObjectFactory();

    NumberingDefinitionsPart ndp = new NumberingDefinitionsPart();
    wordMLPackage.getMainDocumentPart().addTargetPart(ndp);
    ndp.unmarshalDefaultNumbering();

    XHTMLImporterImpl xHTMLImporter = new XHTMLImporterImpl(wordMLPackage);
    xHTMLImporter.setHyperlinkStyle("Hyperlink");

    wordMLPackage.getMainDocumentPart().getContent().addAll(xHTMLImporter.convert(new File(inputfilepath), null));

    //Header Part start
    HeaderPart headerPart = new HeaderPart();
    Relationship rel = wordMLPackage.getMainDocumentPart().addTargetPart(headerPart);

    Hdr hdr = Context.getWmlObjectFactory().createHdr();
    hdr.getContent().addAll(xHTMLImporter.convert(new File(inputfilepath2), null));
    wordMLPackage.getDocumentModel().getSections().get(0).getHeaderFooterPolicy().getFirstHeader();
    headerPart.setJaxbElement(hdr);

    List<SectionWrapper> sections = wordMLPackage.getDocumentModel().getSections();

    SectPr sectPr = sections.get(sections.size() - 1).getSectPr();
    // There is always a section wrapper, but it might not contain a sectPr

    if (sectPr == null) {
        sectPr = objectFactory.createSectPr();
        wordMLPackage.getMainDocumentPart().addObject(sectPr);
        sections.get(sections.size() - 1).setSectPr(sectPr);
    }

    HeaderReference headerReference = objectFactory.createHeaderReference();
    headerReference.setId(rel.getId());
    headerReference.setType(HdrFtrRef.DEFAULT);
    sectPr.getEGHdrFtrReferences().add(headerReference);

    // Saving file
    wordMLPackage.save(new java.io.File("Offers/" + param.getKey1() + "_" + param.getKey2() + "/html_output.docx"));

“InputFilePath2”包含my header xhtml文件的路径。我试图在header中插入一个简单的Hello World,但它似乎将“inputFilePath”用于正文和header。

共有1个答案

戚衡
2023-03-14

假设您有一个对正确headerPart的引用,类似于:

    Hdr hdr = Context.getWmlObjectFactory().createHdr();
    hdr.getContent().addAll( 
            XHTMLImporter.convert( /* fill this in */ );
    headerPart.setJaxbElement(hdr);
 类似资料:
  • 我有一个应用程序试图拉一些数据从数据库,然后保存在一个docx文件。这些数据的一部分是html代码,因此使用docx4j,我能够将html代码转换为docx格式。这里有一个相关的帖子。 现在,我想使用docx4j将这部分文本(在docx文件的表单元格中)转换回html格式,并将html代码保存到数据库中。 或者也许有更好的解决方案来完成从docx到HTML的转换?希望我说清楚了。任何提示都很感激。

  • null 很抱歉,我无法发布我尝试过的任何内容,因为我还没有在此任务上尝试过任何内容,尽管我使用将从获得的转换为,以便在应用程序的中输出。请开导我,我在压力和困惑中迷失了……!

  • 我在将HTML转换为docx时遇到了新问题,它引发了异常: 组织。xml。萨克斯。SAXS异常;行号:4;栏目号:73;实体“nbsp”已被引用,但未被声明 正如我所理解的,这是因为docx4j认为我的文件是XML,并希望将其转换为docx但XML中只有5个预定义的实体,而nbsp等实体没有在XML中定义。如何让docx4j将超文本标记语言转换为doc,而无需在doctype中声明实体nbsp?

  • 我一直在尝试使用他们的库将html内容转换为docx,我确实在运行我的应用程序后创建了一个docx文件,但它有空白内容,而html中确实有一些内容。请检查下面的代码,我已经包含了git上AndroidDocxtoHTML示例中所有必要的库。 代码: 我不明白我得到的空白文档的代码中缺少了什么。我为java找到了这段代码,我为android修改了这段代码。有些人建议使用夜间构建jar进行xhtml转

  • 问题内容: 我的网站上有一个允许使用HTML的输入表单,我正在尝试添加有关使用HTML标签的说明。我想要文字 但是到目前为止,我得到的是: 看起来就像这行-因此知道如何键入它 如何显示标签,以便人们知道要输入什么? 问题答案: 更换用和用。

  • 有没有办法将文件附加到MS Word文档中?我的意思与您将MS Excel文件拖放到MS Word中的方式相同。它显示MS Excel图标和文件名,双击打开附件。 我的情况来自以前的html文件,我导入使用XHTMLImporter.convert.现在超文本标记语言引用附件下载几个地方,并希望将这些文件附加到适当的MS Word文档。

  • 我需要生成一个DOCX从网页(与图像)。DOCX4J是否可以将HTML内容导出为DOCX格式? 还有其他库可以将HTML内容导出到DOCX吗?