使用 Aspose.Words 将word文档转换为HTML时,Windows和linux渲染出来的图片不一样。

使用最新版本20.12.0的Aspose.Words 在 linux上面的渲染出来的图片跟源文档是不一样的,如下图所示
image.png (61.0 KB)

在Windows10上面渲染出来的就是正常的,如下图所示
image.png (22.9 KB)

贴上源文档
2020数学试卷92.zip (603.3 KB)

应该是字体原因,但是我在linux上安装了相应的字体【 MT Extra】,还是转换的有问题,请问要怎么设置呢?

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill-rule="evenodd" height="0.20833333333333334in" preserveAspectRatio="none" stroke-linecap="round" viewBox="0 0 1248 480" width="0.5416666666666666in">
<style type="text/css">
.brush0 { fill: rgb(255,255,255); }
.pen0 { stroke: rgb(0,0,0); stroke-width: 1; stroke-linejoin: round; }
.font0 { font-size: 303px; font-family: "Times New Roman", serif; }
.font1 { font-style: italic; font-size: 303px; font-family: "Times New Roman", serif; }
.font2 { font-size: 274px; font-family: Symbol, serif; }
.font3 { font-size: 336px; font-family: "MT Extra", serif; }
.font4 { font-weight: bold; font-size: 16px; font-family: System, sans-serif; }
</style>
<g>
<text class="font0" fill="rgb(0,0,0)" stroke="none" style="dominant-baseline: alphabetic;" x="846 1014" xml:lang="en" xml:space="preserve" y="384">10</text>
<text class="font1" fill="rgb(0,0,0)" stroke="none" style="dominant-baseline: alphabetic;" x="59 345" xml:lang="en" xml:space="preserve" y="384">ab</text>
<text class="font2" fill="rgb(0,0,0)" stroke="none" style="dominant-baseline: alphabetic;" x="619" xml:space="preserve" y="384">=</text>
<text class="font3" fill="rgb(0,0,0)" stroke="none" style="dominant-baseline: alphabetic;" x="392" xml:space="preserve" y="91">r</text>
<text class="font3" fill="rgb(0,0,0)" stroke="none" style="dominant-baseline: alphabetic;" x="93" xml:space="preserve" y="175">r</text>
<text class="font3" fill="rgb(0,0,0)" stroke="none" style="dominant-baseline: alphabetic;" x="245" xml:space="preserve" y="384">g</text>
</g>
</svg>

现在我又安装了一些需要的字体,比如Symbol ,sans-serif等,图片可以正常渲染出来,但是还是跟Windows有差距。需要设置些什么吗?
下面这些是linux上面渲染的图片
image.png (531 Bytes)
image.png (711 Bytes)
下面这些是Windows上面渲染的图片
image.png (564 Bytes)
image.png (735 Bytes)
上面有差异的图片只是一部分,还有很多。

@qvyue

您需要在将文档转换为HTML的计算机上安装文档中使用的字体。请在最后尝试以下代码示例,并检查是否缺少任何字体警告消息。

Document doc = new Document(MyDir + "input.docx");

doc.setWarningCallback(new com.aspose.words.IWarningCallback() {
    @Override
    public void warning(com.aspose.words.WarningInfo warningInfo) {
        if(warningInfo.getWarningType() == WarningType.FONT_SUBSTITUTION)
            System.out.println(warningInfo.getDescription());
    }
});

doc.save(MyDir + "output.html");

如果仍然遇到问题,请共享Java版本并在此处附加有问题的输出HTML,以供我们参考。 我们将调查此问题,并为您提供更多信息。

我使用上述代码,的确会提示有一些字体不存在,但是我有以下疑惑:

  1. 那么我应该存储文档内部的字体吗?因为有太多的字体,系统不可能所有字体都有。
  2. 另外,我设置导出字体,然后设置了字体文件夹,能导出字体到对应的文件夹,但是只有部分字体导出了,还是会提示有些字体找不到。
  3. 有一些字体我根据提示,下载并安装了这些字体,但是还是提示找不到。
    我应该怎么设置,关于字体。

@qvyue

是的,您可以在MS Word文档中嵌入字体,然后将文档转换为PDF。

我们建议您阅读以下有关使用真型字体的文章。
在Linux上安装TrueType字体
指定TrueType字体位置
处理和替代TrueType字体

我是需要转成HTML,不是PDF。
我看过关于字体的文章,然后还是有以上的问题。好像不能解决Windows和Linux不一致的情况。

您那边能使用源文档转一份HTML格式的文件让我对比一下看看吗?

@qvyue

由于缺少字体,您遇到了这个问题。 Aspose.Words在字体转换为HTML时需要字体。

数学方程式将保存到输出文档中的图像中,并且为了渲染图像,Aspose.Words需要字体。 请在Windows操作系统的MS Word中打开您的文档,然后将字体嵌入字体中。 之后,在Linux上使用此代码将DOC转换为HTML。 您将获得正确的输出。

Word文档是用户上传的,不受控制的,所以您说的方案是无法实施的。
有其他可行的替代方案吗?

@qvyue

您需要在Linux操作系统上安装字体以获得正确的输出。

已经安装了对应的字体还是不行。
字体名称:Cambria Math
Windows上面有,而且渲染的正常,但是linux安装了【Cambria Math】这款字体后就不行。
而且Linux我也在 /usr/share/fonts/下面安装的字体

@qvyue

我们已经通过使用最新版本的Aspose.Words for Java 21.1从Windows将Font文件夹复制到Linux操作系统来测试该方案。 我们找不到共享的问题。 因此,请使用 Aspose.Words for Java 21.1。 我们在这篇文章中随附了输出HTML,以供您参考。
out.zip (390.5 KB)

您可以将字体从Windows计算机复制到Linux并设置字体资源,如下所示。

Document doc = new Document(MyDir + "input.docx");

ArrayList fontSources = new ArrayList(Arrays.asList(FontSettings.getDefaultInstance().getFontsSources()));

// Add a new folder source which will instruct Aspose.Words to search the following folder for fonts
FolderFontSource folderFontSource = new FolderFontSource("... path to fonts folder...", true);

// Add the custom folder which contains our fonts to the list of existing font sources
fontSources.add(folderFontSource);

// Convert the ArrayList of source back into a primitive array of FontSource objects
FontSourceBase[] updatedFontSources = (FontSourceBase[]) fontSources.toArray(new FontSourceBase[fontSources.size()]);

// Apply the new set of font sources to use
FontSettings.getDefaultInstance().setFontsSources(updatedFontSources);

doc.save(MyDir + "output.html");