docx4j中使用HTML内容创建自定义页眉功能异常问题咨询
问题原因
XHTMLImporter.convert()方法返回值是List<Object>类型,你直接调用hdr.getContent().add()是把整个列表作为单个元素添加到页眉内容集合中,不符合docx的结构规范,所以无法正常渲染。- 你初始化XHTMLImporter时只传入了WordprocessingMLPackage,没有指定导入目标为当前的HeaderPart,后续如果HTML包含图片、样式等资源时会出现引用路径错误,即使是纯文本场景也可能存在上下文不匹配的问题。
解决方法
修改后的getHdr方法代码如下:
public static Hdr getHdr(WordprocessingMLPackage wordprocessingMLPackage, Part sourcePart) throws Exception { Hdr hdr = objectFactory.createHdr(); String html = "<html><body><p>hi there</p></body></html>"; XHTMLImporter xhtmlImporter = new XHTMLImporterImpl(wordprocessingMLPackage); // 正确接收convert返回的列表,使用addAll批量添加元素到页眉内容 List<Object> htmlContentList = xhtmlImporter.convert(html, null, sourcePart); hdr.getContent().addAll(htmlContentList); return hdr; }
如果你的代码中还没有关联页眉到文档节属性的逻辑,需要补充以下步骤(纯文本页眉能正常生效可忽略该部分):
// 拿到文档的节属性 SectPr sectPr = wordprocessingMLPackage.getMainDocumentPart().getDocument().getBody().getSectPr(); if (sectPr == null) { sectPr = objectFactory.createSectPr(); wordprocessingMLPackage.getMainDocumentPart().getDocument().getBody().setSectPr(sectPr); } // 创建页眉引用,指定为默认所有页生效 HeaderReference headerRef = objectFactory.createHeaderReference(); headerRef.setId(relationship.getId()); // relationship为createHeaderPart方法返回的关系对象 headerRef.setType(HdrFtrRef.DEFAULT); sectPr.getEGHdrFtrReferences().add(headerRef);
内容的提问来源于stack exchange,提问作者SMt
相关产品推荐
相关产品推荐

