使用 Java 提取 TrueType 和 OpenType 字体许可证限制

在软件应用程序、文档生成引擎或 Web 平台中处理数字字体时,遵守字体许可限制至关重要。字体供应商会将许可和使用规则直接嵌入字体文件中,以定义字体的嵌入、安装或修改方式。使用 Aspose.Font for Java,开发人员可以检查嵌入的 OS/2 表指标,并以编程方式从 TrueType (.ttf) 和 OpenType (.otf) 字体文件中提取许可证限制。

 

了解字体许可模式

TrueType 和 OpenType 字体规范在字体的 OS/2 表中的 fsType 标志中存储嵌入权限。Aspose.Font for Java 通过 LicenseFlags 类将这些嵌入的许可限制分类为不同的模式:

  • 可安装嵌入:字体可以嵌入并永久安装在远程系统上,或供其他用户使用。
  • 可编辑嵌入:字体可以嵌入并临时加载到其他系统中。允许进行编辑,包括使用嵌入字体设置新文本的格式,并且可以保存更改。
  • 预览和打印嵌入:字体可以嵌入并临时加载到其他系统中,仅用于查看或打印文档。
  • 受限许可证嵌入:在事先获得法律所有者明确许可之前,不得以任何方式修改、嵌入或交换字体。

在 Java 中提取 TTF 许可证限制

要使用 Aspose.Font for Java 读取许可证权限:

  • 使用 FontFileDefinitionFontDefinition 加载字体文件,并指定 FontType.TTF.
  • 从字体的表集合 (getTtfTables().getOs2Table()) 中获取 OS/2 表。
  • 使用 getLicenseFlags() 获取许可证标志。
  • 使用 isEditableEmbedding()isInstallableEmbedding()isPreviewAndPrintEmbedding()isRestrictedLicenseEmbedding() 等辅助方法评估嵌入权限。

String fileName = Utils.getDataDir() + "Montserrat-Regular.ttf"; // Font file name with full path

FontDefinition fd = new FontDefinition(FontType.TTF, new FontFileDefinition("ttf", new FileSystemStreamSource(fileName)));
TtfFont font = (TtfFont) Font.open(fd);

LicenseFlags licenseFlags = null;
if (font.getTtfTables().getOs2Table() != null)
{
    licenseFlags = font.getTtfTables().getOs2Table().getLicenseFlags();
}

if (licenseFlags == null || licenseFlags.isFSTypeAbsent())
{
    System.out.println(MessageFormat.format("Font {0} has no embedded license restrictions", font.getFontName()));
}
else
{
    if (licenseFlags.isEditableEmbedding())
    {
        System.out.println(MessageFormat.format("Font {0} may be embedded, and may be temporarily loaded on other systems."
            + " In addition, editing is permitted, including ability to format new text"
            + " using the embedded font, and changes may be saved.", font.getFontName()));
    }
    else if (licenseFlags.isInstallableEmbedding())
    {
        System.out.println(MessageFormat.format("Font {0} may be embedded, and may be permanently installed"
            + " for use on a remote systems, or for use by other users.", font.getFontName()));
    }
    else if (licenseFlags.isPreviewAndPrintEmbedding())
    {
        System.out.println(MessageFormat.format("Font {0} may be embedded, and may be temporarily loaded"
            + " on other systems for purposes of viewing or printing the document.", font.getFontName()));
    }
    else if (licenseFlags.isRestrictedLicenseEmbedding())
    {
        System.out.println(MessageFormat.format("Font {0} must not be modified, embedded or exchanged in any manner"
            + " without first obtaining explicit permission of the legal owner.", font.getFontName()));
    }
}

安装和设置

通过 Maven 将 Aspose.Font for Java 添加到项目中。

Package Manager Console Command

<repository>
    <id>AsposeJavaAPI</id>
    <name>Aspose Java API</name>
    <url>https://repository.aspose.com/repo/</url>
</repository>

<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-font</artifactId>
    <version>Latest</version>
</dependency>

常见问题

1. Type1 字体是否支持使用 LicenseFlags 提取许可证限制?

不支持。标准 Type1 字体格式 (.pfb/.pfa) 不包含 OS/2 表。fsType 标志和 OS/2 表结构是 TrueType (.ttf) 和 OpenType (.otf) 字体格式特有的。

2. 如果 licenseFlags.isFSTypeAbsent() 返回 true,这意味着什么?

如果 isFSTypeAbsent() 返回 true(或者 licenseFlagsnull),则表示字体文件的 OS/2 表中不存在嵌入的许可证限制标志。

3. 如何检查字体是否允许编辑文档内容?

您可以检查 licenseFlags.isEditableEmbedding()。如果值为 true,则表示该字体允许临时加载和编辑,使用户能够使用嵌入的字体设置新文本的格式并保存更改。