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

Docx到超文本标记语言:使用DOCX4J标题的字体样式不正确

蒋权
2023-03-14

我有一个docx文件,带有Calibri Light的Heading1样式(每隔一个文本也使用Calibri Light)。转换为html后,每个文本都是Calibri Light(正确),但当我打开html文件时,Heading1样式的文本是Times New Roman。(原因:html文件内部没有为Heading1样式设置字体系列)

当我打开docx文件并检查Heading1样式的字体时,它显示Calibri Light。

Heading1基于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样式中?)标题样式的文本也应该是Calibri Light,这是我的目标。

这就是Heading1的风格:

    <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;}

编辑:其他可接受的解决方案是:在html文件中将字体系列设置为“DocDefaults”样式。可能吗?

共有1个答案

淳于煌
2023-03-14

字体系列使用直接应用的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>

要应用字体系列,字体必须实际存在于计算机上,或者映射到实际存在的字体(有关示例,请参阅docx4j的ConvertOutHtml示例)。

如果不是这种情况,则不会发出字体系列属性。

为了获得更深入的了解,您可以打开org的调试级别日志。docx4j。字体。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
 类似资料:
  • 我是Docx4j的新手,我需要一些建议。 目前,我正在用Java创建一个简单的(X)超文本标记语言文档。它包含来自数据库的一些信息。创建这个html后,Docx4j使用一个非常简单的word模板创建了一个Word Docx文件。这工作罚款。 现在我必须增强这个HTML。一个数据库值包含保存RTF文件的字节数组。 目前,我将这些数据作为字符串放入HTML。 至少html文件如下所示: Docx4J现

  • 我到处找,到处找。我已经看到了我将要发布的PHP代码中的许多问题,但没有看到任何与我所看到的特定问题相关的问题。 这是我的问题-两行($values/$required),其中我有“name”,“email”,“subject”,“message” 我想在上面加上“电话”。(即“姓名”、“电子邮件”、“电话”、“主题”、“信息”) 如果我把它添加到两行中的一行(不管是哪一行),我仍然可以提交表格,

  • 这困扰我太久了,我很感激你的帮助。我一直在为kable投入时间,但它并没有像我希望的那样对我产生效果。我希望创建多组行,如图所示 执行此操作的代码如下: 这显然不够好。如果我织成pdf,我可以得到正确的输出(第一张图片),但仅此而已。如果我尝试执行save_kable(),结果显示为HTML格式,如第二幅图像所示。每次都编织成pdf格式是如此不切实际,如果我不能解决这个问题,我就不能再使用kabl

  • 对于上面的html内容,我如何使用Jsoup解析并获取文本 当我使用 我得到了这样的东西

  • 我打开这个链接"http://www.amazon.com/s?rh=n: 1"与urllib2和我试图获取下一页链接(href="/s/ref=lp_1_pg_2?rh=n: 283155, n:!1000, n: 1

  • 我是新来的。我想解析html,但问题是我们必须在中指定的URL,我将在运行时从其他页面响应此URL。有没有办法将收到的网址传递到中?我读过这样的东西: 但是我不知道如何使用它。我很想知道是否有其他方法比jsoup更好。