使用 docx4j java 库,当尝试生成在 docx 文件中嵌入 HTML 字符串作为 altchunk 的 docx 文件时,内联
font-size
格式无法按预期工作。当 font-size
设置为 24pt
时,docx 文件仅将其显示为 14
。
将
font-size
更改为 23pt
或 24pt
时,它会按预期工作。对于任何其他标签(如 p
或其他 Heading#
)也不会发生同样的问题。在下面的示例中,Heading1
和Heading2
均采用自定义font-size
作为内联样式,但它仅适用于Heading2
。
示例 HTML 字符串:
"<html><body><h1 style="font-weight: normal; line-height: 1.1; margin-top: 0.2em; margin-bottom: 0.2em; background-color: transparent; color: #404040; font-family: Calibri; font-size: 24pt;">H1</h1><h2 style="font-weight: normal; line-height: 1.1; margin-top: 0.2em; margin-bottom: 0.2em; background-color: transparent; color: #404040; font-family: Calibri; font-size: 26pt;"> H2 </h2></body></html>"
如 MS Word 中所示: MS Word 中的标题 1 样式
代码:
String html = "<html><body><h1 style=\"font-weight: normal; line-height: 1.1; margin-top: 0.2em; margin-bottom: 0.2em; background-color: transparent; color: #404040; font-family: Calibri; font-size: 24pt;\">H1</h1><h2 style=\"font-weight: normal; line-height: 1.1; margin-top: 0.2em; margin-bottom: 0.2em; background-color: transparent; color: #404040; font-family: Calibri; font-size: 26pt;\"> H2 </h2></body></html>";
WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.createPackage();
byte[] bytes = html.getBytes(StandardCharsets.UTF_8);
ByteArrayInputStream baos = new ByteArrayInputStream(bytes);
CTAltChunk ac = new ObjectFactory().createCTAltChunk();
ac.setId("htmlChunk");
wordMLPackage.getMainDocumentPart().addAltChunk(AltChunkType.Html, bais);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
wordMLPackage.save(baos);
byte[] docxFile = baos.toByteArray();
我不是 docx4j 库的专业人士,可以讲述内部逻辑,是否某些默认样式优先于您的样式,或者这只是一个错误。
查看 docx4j 文档,他们提到了一个用于处理 Xhtml 导入的外部库(docx4j-ImportXHTML)。
基于 docx4j-ImportXHTML sample,对您的代码进行的以下调整似乎正在生成预期结果。
var html = "<html><body><h1 style=\"font-weight: normal; line-height: 1.1; margin-top: 0.2em; margin-bottom: 0.2em; background-color: transparent; color: #404040; font-family: Calibri; font-size: 24pt;\">H1</h1><h2 style=\"font-weight: normal; line-height: 1.1; margin-top: 0.2em; margin-bottom: 0.2em; background-color: transparent; color: #404040; font-family: Calibri; font-size: 26pt;\"> H2 </h2></body></html>";
var wordMLPackage = WordprocessingMLPackage.createPackage();
var mdp = wordMLPackage.getMainDocumentPart();
mdp.addAltChunk(AltChunkType.Xhtml, new ByteArrayInputStream(html.getBytes(StandardCharsets.UTF_8)));
mdp.convertAltChunks();
var baos = new FileOutputStream("myFile.docx");
wordMLPackage.save(baos);