在 Android 上管理脚本特定主题字体

概述

演示文稿主题可以为不同的书写系统选择不同的字体系列。这使得使用主题字体的多语言文本能够遵循统一的字体方案,同时为西里尔文、阿拉伯文、日语、格鲁吉亚文、塔纳文以及其他脚本使用合适的字体。

主题的IFontScheme包含一个主要字体集合,通常用于标题,以及一个次要字体集合,通常用于正文。除了它们的拉丁文和东亚字体设置外,这两个集合还通过IFonts接口公开从书写系统标签到字体系列名称的映射。

本文展示了如何检查和修改演示文稿母版主题中的这些映射,并验证更改在保存‑重新加载周期后仍然存在。

了解脚本标签

脚本字体方法使用四字符 BCP 47 脚本子标签来标识书写系统。常见值包括:

脚本标签 书写系统
Cyrl 西里尔文
Arab 阿拉伯文
Hans 简体中文
Jpan 日语
Geor 格鲁吉亚文
Thaa 塔纳文

这些映射属于主题字体方案,而不是单个文本片段。演示文稿可以为主要和次要集合定义不同的映射,也可以对某些脚本省略映射。

访问并检查脚本字体映射

使用Presentation.getMasterTheme获取演示文稿级别的主题。IFontScheme.getMajorIFontScheme.getMinor方法返回两个IFonts集合。

调用IFonts.getScriptFontMap检索集合中的所有映射。要查询单个书写系统,使用IFonts.getScriptFont并传入其脚本标签。若该集合未定义请求的映射,getScriptFont 返回 null

修改映射并验证持久性

使用IFonts.setScriptFont创建映射或替换当前的字体系列。使用IFonts.removeScriptFont删除映射。

以下端到端示例读取所有现有的主要和次要映射,查找日语主要字体,修改西里尔文主要字体,移除塔纳文次要映射,保存演示文稿并重新打开以验证两项更改。为使移除步骤独立于初始主题,示例仅在未定义塔纳文映射时才创建该映射。

import com.aspose.slides.*;
import com.aspose.slides.Collections.Generic.Dictionary;
import com.aspose.slides.Collections.Generic.KeyValuePair;

Presentation presentation = new Presentation();
try {
    IFontScheme fontScheme = presentation.getMasterTheme().getFontScheme();
    IFonts majorFonts = fontScheme.getMajor();
    IFonts minorFonts = fontScheme.getMinor();

    System.out.println("Existing major mappings:");
    Dictionary.Enumerator<String, String> majorMappings = majorFonts.getScriptFontMap().iterator();
    while (majorMappings.hasNext()) {
        KeyValuePair<String, String> mapping = majorMappings.next();
        System.out.println("  " + mapping.getKey() + ": " + mapping.getValue());
    }

    System.out.println("Existing minor mappings:");
    Dictionary.Enumerator<String, String> minorMappings = minorFonts.getScriptFontMap().iterator();
    while (minorMappings.hasNext()) {
        KeyValuePair<String, String> mapping = minorMappings.next();
        System.out.println("  " + mapping.getKey() + ": " + mapping.getValue());
    }

    String japaneseFont = majorFonts.getScriptFont("Jpan");
    if (japaneseFont == null) {
        System.out.println("No major Japanese font is defined.");
    } else {
        System.out.println("Major Japanese font: " + japaneseFont);
    }

    majorFonts.setScriptFont("Cyrl", "Arial");

    if (minorFonts.getScriptFont("Thaa") == null) {
        minorFonts.setScriptFont("Thaa", "Arial");
    }

    minorFonts.removeScriptFont("Thaa");
    presentation.save("script-font-mappings.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Presentation savedPresentation = new Presentation("script-font-mappings.pptx");
try {
    IFonts savedMajorFonts = savedPresentation.getMasterTheme().getFontScheme().getMajor();
    IFonts savedMinorFonts = savedPresentation.getMasterTheme().getFontScheme().getMinor();
    String savedCyrillicFont = savedMajorFonts.getScriptFont("Cyrl");
    String savedThaanaFont = savedMinorFonts.getScriptFont("Thaa");

    if ("Arial".equals(savedCyrillicFont)) {
        System.out.println("The Cyrillic mapping was preserved.");
    } else {
        System.out.println("The Cyrillic mapping was not preserved.");
    }

    if (savedThaanaFont == null) {
        System.out.println("The Thaana mapping removal was preserved.");
    } else {
        System.out.println("The Thaana mapping still exists.");
    }
} finally {
    savedPresentation.dispose();
}

验证使用与普通查找相同的 null 行为:移除并保存后,getScriptFont("Thaa") 对次要集合返回 null

区分主题映射与其他字体设置

脚本特定的主题映射参与字体选择,但它们解决的是与直接文本格式化、替换和回退不同的问题:

机制 目的 更改主题映射的影响
脚本特定的主题字体映射 为特定书写系统选择主要或次要主题字体。 仍使用相应主题字体的文本可以解析到新的映射字体系列。
显式分配给文本段的字体 将请求的字体系列固定在该段落上,而不依赖主题。 该段落可能保持不变,因为直接格式化覆盖了主题选择。
字体替换 当请求的字体不可用或匹配替换规则时替换字体。 替换在字体请求之后执行;它不会重新定义主题的脚本映射。
字体回退 为所选字体未包含的字形提供补充,通常针对特定 Unicode 范围。 它填补缺失的字形覆盖;不会更改已存储的主题映射。

有关后两种机制的更多信息,请参阅Font SubstitutionFallback Fonts

Presentation.getMasterTheme 中更改映射仅影响仍依赖该主题的有效格式化内容。当可见结果未遵循演示文稿级映射时,请检查母版、布局或幻灯片的主题覆盖,或查看是否使用了显式分配的字体。

使映射的字体可用并验证结果

脚本映射仅存储字体系列名称;它不会安装或加载相应的字体文件。为实现一致的渲染和导出,必须在环境中安装每个映射的字体,或通过自定义来源如FontsLoader.loadExternalFontsLoadOptions.getDocumentLevelFontSources 将字体提供给 Aspose.Slides。有关可用加载选项,请参阅Custom Fonts

验证已保存的映射仅能确认主题定义被保留,不能证明字体可用、包含所有必需字形或产生预期布局。请为每个必需的书写系统渲染代表性文本为图像或 PDF,并检查输出。这可以在演示文稿分发前捕获缺失字体、字形覆盖不足、回退行为以及布局变化。有关渲染和导出示例,请参阅Convert PowerPoint Presentations

常见问题

当脚本未映射时,getScriptFont 返回什么?
IFonts.getScriptFont 在请求的脚本映射未在该主要或次要字体集合中定义时返回 null

当脚本已存在时,setScriptFont 会添加第二个映射吗?
不会。IFonts.setScriptFont 在缺失时创建映射,若相同脚本标签已存在则替换已映射的字体系列。

为何更改主题映射后某些文本未变化?
文本可能已显式分配了字体、通过覆盖继承了不同的主题,或在渲染时受到了替换或回退的影响。演示文稿级的脚本映射仅控制仍引用该主题字体集合的文本。

保存并重新打开是否足以验证多语言输出?
不足。重新打开只能验证主题数据的持久性。还需要渲染每个必需书写系统的代表性文本,以确认映射的字体可用并包含必要的字形。