Word轉換成pdf文件時標楷體字型為亂碼

你好,感謝您的回覆,但問題依舊存在.
這是我轉換成功的文件還有log
我參照第二個方法替換找不到的字型但log依舊還是出現一樣的warning但是轉出的文件看起來是有成功的?
image.png (67.6 KB)
Converted_PDF.pdf (1.3 MB)
Day 1 林場.docx (14.3 KB)

image.png (95.3 KB)

這是我轉換失敗的文件還有log
一樣參照第二個方法替換找不到的字型但log依舊還是出現一樣的warning轉出的文件一樣亂碼
這邊想請教根據成功跟失敗的log是不是有其他因素導致轉換成亂碼?
因為不管轉換成功或失敗都有出現類似“Font ‘Calibri’ has not been found. Using ‘Roboto’ font instead. Reason: table substitution.”
這樣的log。
image.png (260.4 KB)
image.png (263.9 KB)Converted_PDF(1).pdf (31.8 KB)
Day 1 林場 (1).docx (214.8 KB)

image.png (259.8 KB)

@PeterZhang, 这是预期的行为。 文档中指定的字体为Calibri、Helvetica和新细明体。 Aspose.Words 尝试查找它们但失败并打印警告。 然后它开始寻找替换字体并使用您在代码中指定的替换字体。

@PeterZhang, 您为 BiauKai 和 Arial Unicode MS 指定了哪种字体替换? 我可以看到 PDF 包含 Roboto 和 Source Sans Pro SemiBold 字体。 这两种字体都不包含汉字。 因此,所有汉字都被一个划掉的矩形替换。

例如,此链接显示 Roboto 字体内的所有字形: https://fonts.google.com/specimen/Roboto/glyphs
如您所见,Roboto 字体不包含中文字符。 所以你不能用这个字体来显示汉字。

您需要指定包含汉字的替换字体。

我的程式碼如下兩張圖片
我分別用SimSun和Noto Sans Traditional Chinese去替換,但依舊轉換失敗
順帶一提我是在Android平台上面開發,使用的手機為:SAMSUNG GALAXY A71

image.png (72.7 KB)
image.png (77.0 KB)
image.png (42.6 KB)

@PeterZhang, 也许您的手机上没有安装 SimSun 和 Noto Sans Traditional Chinese?
您能否运行以下代码来打印所有字体列表并将输出附加到此处?

FontSettings fontSettings = new FontSettings();
for (var fontSource : fontSettings.getFontsSources())
{
    for (var font: fontSource.getAvailableFonts())
    {
        System.out.println("FullName: ["+ font.getFullFontName() + "], FamilyName:[" + font.getFontFamilyName()+"]");
    }
}

image.png (158.2 KB)
image.png (152.4 KB)
image.png (151.7 KB)
image.png (152.8 KB)
image.png (149.5 KB)
image.png (149.6 KB)
image.png (147.0 KB)
image.png (145.5 KB)
image.png (150.7 KB)
image.png (16.5 KB)
如圖這些是我撈到的log,裡面的確沒有SimSun 和 Noto Sans Traditional Chinese
我從裡面挑選一個帶HK的字型去轉換(Noto Serif CJK HK),測試確實可以成功轉換了,但還是有部分亂碼.Converted_PDF.pdf (1.1 MB)
image.png (79.6 KB)

@PeterZhang, “ss”后面的汉字应使用SimSun字体。 在您的 PDF 中,这些汉字是用 Roboto 字体呈现的,该字体缺少汉字的字形。
您需要安装 SimSun 字体或指定 SimSun 字体的字体替换。

image.png (96.6 KB)

我這邊看到的礁溪溫泉這四個字應該是Calibri才對,且log也沒出現找不到該字型
image.png (27.2 KB)

且就算我加入
substitutionRule.addSubstitutes(“SimSun Body Asian”, new String[]{“SEC CJK TC”});
substitutionRule.addSubstitutes(“SimSun”, new String[]{“SEC CJK TC”});
這兩行程式碼最下面那四個字依舊是亂碼.

image.png (89.0 KB)

@PeterZhang, 我的电脑上没有Android开发环境,所以我只是将Android 13手机中的所有字体复制到我的电脑上(字体存储在/system/fonts文件夹中)并运行以下程序:

FontSettings fontSettings = new FontSettings();
fontSettings.setFontsSources(new FontSourceBase[] { new FolderFontSource("d://androidfonts", false) });

TableSubstitutionRule substitutionRule = fontSettings.getSubstitutionSettings().getTableSubstitution();

substitutionRule.addSubstitutes("Calibri", new String[] { "Noto Sans CJK TC" });
substitutionRule.addSubstitutes("BiauKai", new String[] { "Noto Sans CJK TC" });
substitutionRule.addSubstitutes("Arial Unicode MS", new String[] { "Noto Sans CJK TC" });
substitutionRule.addSubstitutes("Helvetica Neue", new String[] { "Noto Sans CJK TC" });

LoadOptions lo = new LoadOptions();
lo.setFontSettings(fontSettings);

Document doc = new Document("Day 1 林場 (1).docx", lo);
doc.setWarningCallback(warningInfo -> {
    if (warningInfo.getWarningType() == WarningType.FONT_SUBSTITUTION)
        System.out.println(warningInfo.getDescription());
});
doc.save("out.pdf");

正如您所看到的,我的程序仅使用 androidfonts 文件夹中的字体。该程序的行为应该与真正的 Android 手机上的行为相同。以下是我的 Android 手机中的所有字体列表:fontlist.zip (2.1 KB)

我只使用 Noto Sans CJK TC 字体作为字体替换,因为我的手机上没有 SEC CJK TC。

这些是我的程序打印的字体替换警告消息:

Font 'BiauKai' has not been found. Using 'Noto Sans CJK TC' font instead. Reason: table substitution.
Font 'Arial Unicode MS' has not been found. Using 'Noto Sans CJK TC' font instead. Reason: table substitution.
Font 'Helvetica Neue' has not been found. Using 'Noto Sans CJK TC' font instead. Reason: table substitution.
Font 'Calibri' has not been found. Using 'Noto Sans CJK TC' font instead. Reason: table substitution.

这是程序创建的 PDF 文件:out.pdf (230.0 KB)

关于我上一篇文章中的SimSun字体,我又检查了一下,发现 ss 后面的文字实际上没有指定字体。 但是,Calibri 字体被指定为本 Word 文档中亚洲文本的默认字体。 由于 Calibri 缺少汉字字形,Microsoft Word 似乎用 SimSun 取代了它。 很抱歉造成这种混乱。正如您所看到的,我在程序中将 Noto Sans CJK TC 设置为 Calibri 的替代品,并且运行良好。

您正在使用 Aspose.Words 20.6。 这是旧版本。 您可以在这里获取最新版本:https://releases.aspose.com/words/androidjava/

感謝您的回答~
我已經將版本換至最新版本23.6
image.png (46.5 KB)
程式碼也修正幾乎跟你的一模一樣
image.png (85.3 KB)
但最後的結果還是一樣最後四個字是亂碼
我在猜測是不是你有給他自定義的關係
fontSettings.setFontsSources(new FontSourceBase[] { new FolderFontSource(“d://androidfonts”, false) });
這一段所以補足了系統掃描不到的字型?
Converted_PDF.pdf (249.8 KB)

@PeterZhang, d://androidfonts 是我电脑上的文件夹,我从 Android 手机复制了所有字体。 这行代码只有在电脑上运行时才需要,在手机上不需要。

@PeterZhang, 你能分享一下你的Android手机的字体吗,我可以测试一下是Aspose.Words的问题还是字体有问题?

您可以使用以下步骤共享字体:

  1. 将Android手机上的所有字体复制到电脑上。 Android 手机上的字体位于 /system/fonts 文件夹中。
  2. 使用 zip 程序存档字体。
  3. 将 zip 文件上传到某些文件共享服务,例如 Dropbox 或 Google Drive。
  4. 在此处发布已上传 zip 文件的链接。

您好這是我手機上的fonts

請問有發現最後面四個字為亂碼的可能原因嗎?

@PeterZhang, 在您的 PDF 中,由于某种原因,Calibri 字体被 Roboto 字体替换。 由于 Roboto 字体没有汉字字形,因此汉字显示为划掉的矩形。

即使使用您的字体我也无法重现该问题。 这是 Aspose.Words 在我的计算机上创建的 PDF 文件:out.SamsungAndroidFonts.pdf (230.0 KB)

这些是我在转换为 PDF 过程中收到的警告消息:

Font 'BiauKai' has not been found. Using 'Noto Sans CJK TC' font instead. Reason: table substitution.
Font 'Arial Unicode MS' has not been found. Using 'Noto Sans CJK TC' font instead. Reason: table substitution.
Font 'Helvetica Neue' has not been found. Using 'Noto Sans CJK TC' font instead. Reason: table substitution.
Font 'Calibri' has not been found. Using 'Noto Sans CJK TC' font instead. Reason: table substitution.

下一步是尝试在 Android 手机上运行您的项目。 你能分享一下你的 Android 项目吗? 另外请描述一下您使用什么环境来开发Android SDK、Java SDK等。

您好,這是我的測試用專案,如連結:

我是使用Android studio 開發,版本資訊:
image.png (36.2 KB)

Android studio 環境配置:
image.png (42.0 KB)
image.png (66.5 KB)

測試轉換的word檔案先前丟過這邊再丟一次
Day 1 林場 (1).docx (214.8 KB)

@PeterZhang, 谢谢。 我将设置Android开发环境并尝试在Android手机上运行您的项目。 这需要一些时间。 一旦我有了一些结果,我就会回复你。

感谢您报告此问题。 我们已经在我们的内部问题跟踪系统中打开了以下新工单,并将根据 免费支持政策 中提到的条款提供它们的修复:

Issue ID(s): WORDSNET-25662

如果您需要优先支持以及直接联系我们的付费支持管理团队,您可以获得 付费支持服务

了解,感謝您的回答~
希望該問題能順利解決。