qvyue
January 20, 2021, 2:47am
1
使用最新版本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机器复制字体
qvyue
January 20, 2021, 10:27am
3
我按照您的方法做了,但是仍然图片很模糊,跟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 ,
我已经在虚拟机上安装了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
qvyue
February 2, 2021, 8:57am
6
谢谢您的回复!
我尝试了您的建议,在一台虚拟机中仿照您的代码运行得出的结果是符合期望的。
但是在原来的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());
}
}
如果没有收到任何与字体有关的警告,则可以将所需的字体从另一台计算机复制到主机上。 可能由于字体文件版本之间的差异而出现问题。
qvyue
February 3, 2021, 1:22am
8
谢谢您的回复!
按照您的建议在两台测试Linux机器上分别运行您提供的代码之后,没有收到任何与字体有关的警告。
而且我按照您之前的建议,设置的自定义字体都是一样的拷贝。
所以,我还是不知道怎么解决这个问题,麻烦您看一下还有没有其他解决办法。
qvyue
February 3, 2021, 1:47am
9
我又把两台机器的/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");
qvyue
February 4, 2021, 2:26am
12
我直接下载了您提供的文档,然后将其转换成网页,图片在两台Linux机器依然不一样。
所以,我还是不知道怎么解决这个问题,麻烦您看一下还有没有其他解决办法。
qvyue
February 4, 2021, 2:29am
13
我用了另外一台机器测试,结果也是图片模糊。
所以,我还是不知道怎么解决这个问题,麻烦您看一下还有没有其他解决办法。
qvyue
February 4, 2021, 2:39am
14
我又用了另外一台Linux机器测试,结果图片正常很清晰。
所以,我想了解这里面是怎么回事。怎么避免图片在不同的机器上出现差异。谢谢!
@qvyue ,
为了对Aspose.Words API进行任何更正,我们已在问题跟踪系统中记录了此问题。 您的票号是WORDSNET-21764。 我们将进一步调查该问题的详细信息,并将使您随时了解链接问题的状态。 很抱歉给您带来不便。
@qvyue ,
请检查文件中的屏幕截图:
似乎HTML文档中的图像比MS Word文档中显示的图像更清晰。
您也可以在获得良好文档的Linux机器上打开不正确的HTML文档(排除监视器设置不正确的版本)。
qvyue
March 4, 2021, 5:11am
17
不是。
屏幕截图里面的都是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文件,以便最终进行进一步测试。 谢谢你的合作。
qvyue
March 18, 2021, 3:25am
20
已经按照你们提供的代码运行了,结果见附件differentFont.zip (548.5 KB)