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

我想諮詢一下關於word轉換成pdf文件時,字型若為calibri可以轉換出來正常的pdf。
字型若為標楷體則轉換出來的pdf會為亂碼。
這邊想請教一下是否有solution可以解決轉換不支援的字型?

@PeterZhang, 乱码问题通常是由于缺少字体造成的。 您能否在您的电脑上用您的Word文档运行以下代码,看看是否有任何字体替换警告:

Document doc = new Document("in.docx");

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

doc.save("out.pdf");

warningsHandler.printMissingFontDetails();


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

    public void warning(WarningInfo info) {
        if (info.getWarningType() == WarningType.FONT_SUBSTITUTION) {
            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());
    }
}

如果打印任何警告,请尝试安装警告中指定的字体并再次运行 PDF 转换。

以下是有关 Aspose.Words 如何查找字体的文档:

如果问题仍然存在,请附上出现乱码的Word文档和PDF进行分析。

你好,我這邊看到的log猜測應該是Arial Unicode MS font is used in the document. Line spacing could be rendered differently.所以導致轉換失敗。image.png (78.7 KB)

這是轉換成功的log
image.png (56.5 KB)

這是我的程式碼,我有依據文件自定義fontSettings然後帶入doc,但是依舊轉換失敗。
log依舊出現Arial Unicode MS font is used in the document. Line spacing could be rendered differently.
image.png (62.4 KB)

附件是我轉換前的word 文件以及轉換失敗的pdfConverted_PDF.pdf (31.8 KB)
Day 1 林場 (1).docx (214.8 KB)

@PeterZhang,
呈现为划掉矩形的字符使用 BiauKai 和 Arial Unicode MS 字体:

最简单的解决方案是在将 Word 文档转换为 PDF 的计算机上安装 BiauKai 和 Arial Unicode MS 字体。 或者,除了系统字体 (SystemFontSource) 之外,您还可以指定这些缺失字体所在的文件夹。以下是如何完成此操作的示例

@PeterZhang, 另一种选择是指定用什么字体来替换这些缺失的字体。 在这种情况下,PDF 的布局很可能会与原始布局不同,因为不同的字体具有不同的字符高度和宽度:

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

// 将 BiauKai 和 Arial Unicode MS 字体替换为 SimSun 字体
substitutionRule.addSubstitutes("BiauKai", new String[] { "SimSun" });
substitutionRule.addSubstitutes("Arial Unicode MS", new String[] { "SimSun" });

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

Document doc = new Document("Day 1 林場 (1).docx", lo);
doc.save("out.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 手机复制了所有字体。 这行代码只有在电脑上运行时才需要,在手机上不需要。