docx到html:使用docx4j时标题的字体样式不正确

41zrol4v  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(1007)

我有一个docx文件,带有calibri-light的heading1样式(其他文本也使用calibri-light)。转换成html后,每个文本都是calibri light(正确的),但是当我打开html文件时,heading1样式的文本是times new roman(原因:没有为heading1样式设置字体系列,在html文件中)
当我打开docx文件并检查heading1样式的字体时,它会显示calibri light。
标题1基于docx中的“正常”样式。
这是docx中的常规样式:

<w:style w:type="paragraph"
        w:default="1"
        w:styleId="Normal">
    <w:name w:val="Normal"/>
    <w:qFormat/>
    <w:rsid w:val="003D736F"/>
    <w:pPr>
        <w:spacing w:before="40"
                    w:after="40"
                    w:line="240"
                    w:lineRule="auto"/>
        <w:ind w:left="851"/>
        <w:jc w:val="both"/>
    </w:pPr>
    <w:rPr>
        <w:rFonts w:ascii="Calibri Light"
                    w:eastAsia="SimSun"
                    w:hAnsi="Calibri Light"
                    w:cs="Times New Roman"/>
        <w:szCs w:val="20"/>
        <w:shd w:val="clear"
                w:color="auto"
                w:fill="FFFFFF"/>
        <w:lang w:eastAsia="zh-CN"/>
    </w:rPr>
</w:style>

我可以看到,我们有4种字体。但是我们能告诉docx4j,使用一种特定的字体(比如,使用w:ascii并把这个字体放到html文件中的heading1样式吗?)heading1样式的文本也应该是calibri light,这是我的目标。
这是头像样式:

<w:style w:type="paragraph"
            w:styleId="Heading1">
        <w:name w:val="heading 1"/>
        <w:basedOn w:val="Normal"/>
        <w:next w:val="Normal"/>
        <w:link w:val="Heading1Char"/>
        <w:qFormat/>
        <w:rsid w:val="00232342"/>
        <w:pPr>
            <w:keepNext/>
            <w:keepLines/>
            <w:numPr>
                <w:numId w:val="4"/>
            </w:numPr>
            <w:spacing w:before="360"
                        w:after="240"/>
            <w:jc w:val="left"/>
            <w:outlineLvl w:val="0"/>
        </w:pPr>
        <w:rPr>
            <w:b/>
            <w:sz w:val="32"/>
        </w:rPr>
    </w:style>

这是我正在使用的代码:

WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File(source));

 HTMLSettings htmlSettings = Docx4J.createHTMLSettings();
 htmlSettings.setWmlPackage(wordMLPackage);
 htmlSettings.setImageDirPath("temp_images");
 htmlSettings.setImageTargetUri("temp_images");
 htmlSettings.setImageIncludeUUID(false);

 boolean nestLists = false;
 if (nestLists) {
     SdtWriter.registerTagHandler("HTML_ELEMENT", new SdtToListSdtTagHandler());
 } else {
     // convert numberings to plain text
     htmlSettings.getFeatures().remove(ConversionFeatures.PP_HTML_COLLECT_LISTS);
 } 

 OutputStream os = new java.io.FileOutputStream(dest);
 Docx4J.toHTML(htmlSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);

这是html中的两种样式

.Normal {display:block;text-align: justify;position: relative; margin-left: 15mm;margin-top: 1mm;margin-bottom: 1mm;line-height: 100%;}

.Heading1 {display:block;text-align: left;page-break-after: avoid;margin-top: 0.25in;margin-bottom: 4mm;font-weight: bold;font-size: 16.0pt;}

编辑:其他可接受的解决方案可以是:设置一个字体系列为“docdefaults”风格的html文件。有可能吗?

ev7lccsx

ev7lccsx1#

字体族是使用直接应用的css处理的。
例如:

<li class="Heading1 Normal DocDefaults " style="display: list-item;"><span class="DefaultParagraphFont " style="font-family: 'Calibri Light';">Chapter 2</span></li></ol>

  <p class="Normal DocDefaults "><span class="" style="font-family: 'Calibri Light';">This is an example part, chapter 2</span></p></div>

要应用字体系列,字体必须实际存在于您的计算机上,或者Map到实际存在的字体(请参阅docx4j的convertouthtml示例)。
如果不是这样,则不会发出字体族属性。
为了获得更深入的了解,可以打开org.docx4j.fonts.runfontselector的调试级别日志记录。日志记录示例:

08:54:21.295 [main] DEBUG org.docx4j.fonts.RunFontSelector 1136 - looking for: Calibri Light
08:54:21.295 [main] DEBUG org.docx4j.fonts.RunFontSelector 1144 - Font 'Calibri Light' maps to Calibri Light

相关问题