将 HTML 内容嵌入为 altchunk 时,如何修复使用 DOCX4J 生成的 docx 文件中添加为内联 HTML 样式的自定义字体大小?

问题描述 投票:0回答:1

使用 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();
java spring ms-word docx docx4j
1个回答
0
投票

我不是 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);
© www.soinside.com 2019 - 2024. All rights reserved.