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

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

具体html和图片文件如下:
aspose-words-21.1.0-java-img-test.zip (599.0 KB)

在Windows10上面渲染出来的就是正常的,如下图所示
aspose-words-21.1.0-java-img-test.zip (599.0 KB)

贴上源文档
2021年上海市高考数学-普通用卷.zip (329.8 KB)

你们之前说是字体原因,但是这种Cambria Math字体linux上面有,而且是存在于/usr/share/fonts/ 文件夹下面。具体见下面图片:
font_exist.zip (196.0 KB)

@qvyue,

请简单地从Linux OS内的Windows 10计算机中复制以下字体文件,看看它最终如何运行?

  • Cambria Math
  • 宋体
  • Times New Roman
  • SimSun
  • SimHei

从Windows机器复制字体

我按照您的方法做了,但是仍然图片很模糊,跟windows上面的图片不一样。
下面贴上我的代码:

Document document = new Document("/data/deploy/test/asposewords2110java/2021年上海市高考数学-普通用卷.docx");
HtmlSaveOptions options = new HtmlSaveOptions();
options.setImagesFolder("/data/deploy/test/asposewords2110java/img");
FontSettings.getDefaultInstance().setFontsFolder("/usr/share/fonts/my_fonts/",true);
document.save("/data/deploy/test/asposewords2110java/test.html", options);

另外附上和生成的模糊图片(SimSun就是宋体,所以就省略了):
Desktop.zip (103.9 KB)

@qvyue,

我们正在进一步检查这种情况,我们将尽快与您联系。

@qvyue,

我已经在虚拟机上安装了Ubuntu 16.04(Linux)的新副本。 然后,我将您的DOCX Word文档转换为HTML格式。 然后,我设法观察到了这个问题。 (请参见输出文件 21.1 - using default fonts of Ubuntu 16.04.zip (774.5 KB))。

然后,我从Windows 10计算机的Linux文件夹中的自定义文件夹中复制了所需的Font文件,并运行了以下Java代码。 在这种情况下,我设法在相同的Linux操作系统上产生了正确的输出。 (请参见输出文件 21.1 - after copying windows fonts.zip (773.2 KB))。

Document doc = new Document(myDir + "224153/input.docx");

FontSettings fontSettings = new FontSettings();
addFontFolder(fontSettings, myDir + "CustomFonts/");
doc.setFontSettings(fontSettings);

doc.save(myDir + "224153/21.1/awjava-21.1.html");

private static void addFontFolder(FontSettings fontSettings, String folder)
{
    FontSourceBase[] fontSourceBases = fontSettings.getFontsSources();
    FontSourceBase[] newFontSourceBases = new FontSourceBase[fontSourceBases.length + 1];
    System.arraycopy(fontSourceBases, 0, newFontSourceBases, 0, fontSourceBases.length);
    newFontSourceBases[newFontSourceBases.length - 1] = new FolderFontSource(folder, true);
    fontSettings.setFontsSources(newFontSourceBases);
}

因此,由于Aspose.Words for Java无法在您的计算机上找到以下字体文件,因此最终会发生此问题。 请将这些字体放在单独的文件夹中,然后运行上面的代码:

  • Cambria Math
  • 宋体
  • Times New Roman
  • SimSun
  • SimHei

谢谢您的回复!
我尝试了您的建议,在一台虚拟机中仿照您的代码运行得出的结果是符合期望的。
但是在原来的Linux机器上却无法实现期望的结果,我不知道为什么会出现这样的差异,请问有什么解决方法吗?
再次致谢!

@qvyue,

请在您的Linux机器上运行以下Java代码,看看它是否在控制台上显示任何与Fonts相关的警告?

Document doc = new Document("C:\\Temp\\224153\\in.docx");

HandleDocumentWarnings warningsHandler = new HandleDocumentWarnings();
doc.setWarningCallback(warningsHandler);

doc.save("C:\\Temp\\224153\\awjava-21.1.html");

warningsHandler.printMissingFontDetails();

public static class HandleDocumentWarnings implements IWarningCallback {
    public ArrayList listOfFonts = new ArrayList();

    public void warning(WarningInfo info) {
        if (info.getWarningType() == WarningType.FONT_SUBSTITUTION || info.getWarningType() == WarningType.FONT_EMBEDDING) {
            if (!listOfFonts.contains(info.getDescription()))
                listOfFonts.add(info.getDescription());
        }
    }

    public void printMissingFontDetails() {
        for (int i = 0; i < listOfFonts.size(); i++)
            System.out.println(listOfFonts.get(i).toString());
    }
}

如果没有收到任何与字体有关的警告,则可以将所需的字体从另一台计算机复制到主机上。 可能由于字体文件版本之间的差异而出现问题。

谢谢您的回复!
按照您的建议在两台测试Linux机器上分别运行您提供的代码之后,没有收到任何与字体有关的警告。
而且我按照您之前的建议,设置的自定义字体都是一样的拷贝。
所以,我还是不知道怎么解决这个问题,麻烦您看一下还有没有其他解决办法。

我又把两台机器的/usr/share/fonts/目录下的字体也都设置成一样的了,但是还是存在图片差异。
所以,我还是不知道怎么解决这个问题,麻烦您看一下还有没有其他解决办法。

@qvyue,

我已使用以下代码将字体文件嵌入到另一个DOCX文档中,并在此处附加了该文件供您参考:

Document doc = new Document("C:\\Temp\\224153\\in.docx");

FontInfoCollection fontInfos = doc.getFontInfos();
fontInfos.setEmbedTrueTypeFonts(true);
fontInfos.setEmbedSystemFonts(true);

doc.save("C:\\Temp\\224153\\input with embedded fonts.docx");

您能否使用下面的简单代码并将此DOCX文件转换为HTML,看看是否仍然遇到相同的问题?

Document doc = new Document("C:\\Temp\\224153\\input with embedded fonts.docx");
doc.save("C:\\Temp\\224153\\awjava-21.1.html");

Sure, I’ll check it out.

我直接下载了您提供的文档,然后将其转换成网页,图片在两台Linux机器依然不一样。
所以,我还是不知道怎么解决这个问题,麻烦您看一下还有没有其他解决办法。

我用了另外一台机器测试,结果也是图片模糊。
所以,我还是不知道怎么解决这个问题,麻烦您看一下还有没有其他解决办法。

我又用了另外一台Linux机器测试,结果图片正常很清晰。
所以,我想了解这里面是怎么回事。怎么避免图片在不同的机器上出现差异。谢谢!

@qvyue,

为了对Aspose.Words API进行任何更正,我们已在问题跟踪系统中记录了此问题。 您的票号是WORDSNET-21764。 我们将进一步调查该问题的详细信息,并将使您随时了解链接问题的状态。 很抱歉给您带来不便。

@qvyue,

请检查文件中的屏幕截图:

似乎HTML文档中的图像比MS Word文档中显示的图像更清晰。

您也可以在获得良好文档的Linux机器上打开不正确的HTML文档(排除监视器设置不正确的版本)。

不是。
屏幕截图里面的都是HTML网页比较清晰的是Windows平台转换的;
比较模糊的是Linux平台转换的。

@qvyue,

我已将这些详细信息记录在我们的问题跟踪系统中,并将在任何进一步的更新中通知您。

@qvyue,

请使用以下代码在出现此问题的Linux机器上创建HTML文档:

Document doc = new Document("in.docx");
com.aspose.words.HtmlSaveOptions so = new com.aspose.words.HtmlSaveOptions();
so.setExportFontResources(true);
so.setOfficeMathOutputMode(HtmlOfficeMathOutputMode.MATH_ML);
doc.save("output.html", so);

所有使用的字体将在输出目录中创建。 我们需要所有这些字体文件和输出HTML文件,以便最终进行进一步测试。 谢谢你的合作。

已经按照你们提供的代码运行了,结果见附件differentFont.zip (548.5 KB)