文字渲染丢失

image1.pdf (51.8 KB)

16.zip (36.1 KB)

16.zip压缩包里面有word源文件16.doc,image1.pdf是通过aspose.word通过16.doc转出来的。

我使用IWarningCallback 测试,没有发现任何字体被替换的日志。我看16.doc的字体都是宋体加粗的,我查看该服务器上有宋体的字体文件,还有什么原因会导致该服务器上的文字显示不出来呢

public static void main(String[] args) throws Exception {
		final String arg1 = args[0];
		final String arg2 = args[1];
		final String arg3 = args[2];
		final String arg4 = args[3];
		System.out.println(arg1);
		System.out.println(arg2);
		System.out.println(arg3);
		System.out.println(arg4);

		Document doc = new Document(arg1);

		QysWarnings warnings = new QysWarnings();
		doc.setWarningCallback(warnings);

		FontSettings fontSettings = FontSettings.getDefaultInstance();
		FolderFontSource folderFontSource = new FolderFontSource(arg3, false, 1);
		SystemFontSource systemFontSource = new SystemFontSource(2);
		fontSettings.setFontsSources(new FontSourceBase[] {systemFontSource, folderFontSource });

		doc.setFontSettings(fontSettings);

//		doc.getLayoutOptions().setCommentDisplayMode(CommentDisplayMode.HIDE);
		doc.acceptAllRevisions();

		System.out.println("开始查看字体名1");
		FontInfoCollection fonts = doc.getFontInfos();
		for (FontInfo font : fonts)
			System.out.println(font.getName());
		System.out.println("查看字体名结束2");

		PdfSaveOptions opts = new PdfSaveOptions();
		opts.setUpdateFields(false);
		opts.setSaveFormat(SaveFormat.PDF);
		doc.save(arg2, opts);
	}

	public static class QysWarnings implements IWarningCallback {
		public void warning(WarningInfo info) {
			if (info != null) {
				if (info.getWarningType() == WarningType.FONT_SUBSTITUTION) {
					String warningTypeStr = WarningType.toString(info.getWarningType());
					String description = "转换警告类型【" + warningTypeStr + "】, 警告详情信息:" + info.getDescription();
					System.out.println(description);
				}
			}
		}
	}

aspose.word的版本是22.12的。

服务器上只安装了宋体的字体文件,如果是需要渲染宋体+B的 也就是加粗的样式时,是需要拿宋体blod类型的字体来渲染吗

@lycheng2822577561 下面是我这边所需的三种字体,需要正确输出:

FangSong_GB2312
方正小标宋简体
simsun

正如我所看到的那样,该文件的大部分文字都使用了 SimSun。此外,您还可以检查文档中的字体替换,以确定服务器上需要的字体。

遗憾的是,没有字体就无法获得正确的结果。您需要拥有正确渲染文档所需的所有字体。或者,您需要最相似的字体作为替代字体。

这是我的输出文件:
output.pdf (37.2 KB)

我这边服务器上是有simsun字体文件的,使用上述的main方法demo测试,发现IWarningCallback 的warning方法没有任何输出,但是转出来的pdf丢失了文字。

后面安装了simsun-blod的字体文件,才能将这些文字正常的显示出来。

为什么IWarningCallback 的warning方法没有任何输出呢?

除了IWarningCallback,还有什么方法可以打印出字体缺失的日志警告吗

@lycheng2822577561 通常,需要使用 IWarningCallback 来根据 Manipulate and Substitute TrueType Fonts|Aspose.Words for Java
例如,我重置了文件夹字体源并检查了 IWarningCallback:

FontSettings fontSettings = FontSettings.getDefaultInstance();
FolderFontSource folderFontSource = new FolderFontSource("", false, 1);
fontSettings.setFontsSources(new FontSourceBase[] { folderFontSource });
转换警告类型【FontSubstitution】, 警告详情信息:Font '方正小标宋简体' has not been found. Using 'Fanwood' font instead. Reason: font info substitution.
转换警告类型【FontSubstitution】, 警告详情信息:Font 'Times New Roman' has not been found. Using 'Fanwood' font instead. Reason: font info substitution.
转换警告类型【FontSubstitution】, 警告详情信息:Font '宋体' has not been found. Using 'Fanwood' font instead. Reason: font info substitution.

我将为开发人员创建一个问题,以检查为什么某些字体没有信息。