如何在 Java 中使用 GroupDocs.Metadata 提取 OpenType 字体签名

在现代应用中,提取 OpenType 字体签名 数据对于确认字体真实性和保护数字资产至关重要。本教程将一步步演示如何使用 GroupDocs.Metadata for Java 从 OpenType 字体中提取签名标志和完整的加密细节。无论您是构建以安全为中心的内容管道,还是仅需审计字体库,下面的技术都能让您的工作流可靠且快速。

快速答案

  • 需要哪个库? GroupDocs.Metadata for Java (v24.12)
  • 需要哪个 Java 版本? JDK 8 或更高版本
  • 需要许可证吗? 免费试用可用于评估;生产环境需购买正式许可证
  • 可以处理多个字体吗? 可以 – 支持批处理或并发处理
  • 代码是否线程安全? 每个线程创建一个新的 Metadata 实例;该对象本身不是线程安全的

什么是 OpenType 字体签名?

OpenType 字体签名 是嵌入在字体内部的加密块,用于证明文件自签名后未被篡改。它包含签名时间、证书链、哈希算法标识符以及可选的撤销信息。它还包括签名算法标识符、签名者的证书链和可选的撤销列表,从而实现对字体完整性和来源的全面验证。

为什么在 Java 中使用 GroupDocs.Metadata?

GroupDocs.Metadata 支持 50 多种输入和输出格式(包括 DOCX、PDF、PPTX、HTML 以及众多图像类型),并且可以在不将整个文件加载到内存的情况下读取 OpenType 签名,从而高效处理数百页的字体集合。

前置条件

  • Java Development Kit (JDK): 8 版或更高。
  • IDE: 任意支持 Java 的 IDE(IntelliJ IDEA、Eclipse、VS Code 等)。
  • Maven: 用于依赖管理。

必需的库和依赖

在 pom.xml 中添加 GroupDocs.Metadata 的 Maven 坐标。这将自动拉取示例所需的完整包。

<repositories>
    <repository>
        <id>repository.groupdocs.com</id>
        <name>GroupDocs Repository</name>
        <url>https://releases.groupdocs.com/metadata/java/</url>
    </repository>
</repositories>

<dependencies>
    <dependency>
        <groupId>com.groupdocs</groupId>
        <artifactId>groupdocs-metadata</artifactId>
        <version>24.12</version>
    </dependency>
</dependencies>

直接下载

或者,从 GroupDocs.Metadata for Java releases 下载最新版本。

许可证获取

  • 免费试用: 开始使用免费试用以探索功能。
  • 临时许可证: 通过 GroupDocs licensing page 获取临时许可证。
  • 购买: 生产环境请购买正式许可证。

如何使用 GroupDocs.Metadata 提取 OpenType 字体签名

Metadata 类是 GroupDocs.Metadata 的核心 API,用于在不加载完整文件的情况下访问文档元数据。
要读取字体的签名,只需使用指向 .otf 文件的路径实例化 Metadata 对象,然后访问其 DigitalSignaturePackage。此方式仅加载必要的元数据结构,避免完整字体解析,从而保持低内存占用。Metadata 实例应在 try‑with‑resources 块中使用,以确保正确释放资源。

在 try‑with‑resources 块中使用 new Metadata("font.otf") 加载字体文件。Metadata 类是 GroupDocs.Metadata 读取任何受支持文档类型(包括 OpenType 字体)的入口点。对象会自动关闭,防止资源泄漏。

如何提取数字签名标志

DigitalSignaturePackage 对象聚合了字体的所有签名相关信息,包括标志和单个签名。
直接答案: 打开字体后调用 metadata.getDigitalSignaturePackage().getFlags();返回的标志集合告诉您签名是否有效、是否被撤销或是否具有特殊条件。此单一调用即可在深入细节前进行快速健康检查。标志以枚举形式表示,可检查签名状态、时间戳存在性以及签名时应用的任何策略约束。

  1. 初始化指向字体文件的 Metadata 实例。
  2. 获取 DigitalSignaturePackage。
  3. 打印或记录标志值。
String documentPath = "YOUR_DOCUMENT_DIRECTORY"; // Replace with your input file path
try (Metadata metadata = new Metadata(documentPath)) {
    OpenTypeRootPackage root = metadata.getRootPackageGeneric();
    
    if (root.getDigitalSignaturePackage() != null) {
        System.out.println(root.getDigitalSignaturePackage().getFlags());
    }
}

说明

  • documentPath – OpenType 字体的绝对或相对路径。
  • try‑with‑resources 块保证 Metadata 对象自动关闭,避免内存泄漏。

如何提取详细的数字签名信息

CmsSignature 表示嵌入字体中的单个 CMS/PKCS#7 签名,提供对其加密属性的访问。
直接答案: 遍历 metadata.getDigitalSignaturePackage().getSignatures();每个 CmsSignature 对象都公开签名时间、摘要算法、封装内容和证书详情,帮助您构建完整的审计报告。对于每个签名,您可以检索签名者的证书链、验证哈希算法,并提取时间戳令牌以确认签名的应用时间。

  1. 重用上述相同的 Metadata 初始化代码。
  2. 循环遍历包中的每个 CmsSignature。
  3. 提取诸如 getSignTime()、getDigestAlgorithms()、getCertificates() 和 getSignerInfo() 等属性。
String documentPath = "YOUR_DOCUMENT_DIRECTORY"; // Replace with your input file path
try (Metadata metadata = new Metadata(documentPath)) {
    OpenTypeRootPackage root = metadata.getRootPackageGeneric();
    
    if (root.getDigitalSignaturePackage() != null) {
        for (CmsSignature signature : root.getDigitalSignaturePackage().getSignatures()) {
            System.out.println(signature.getSignTime());
            
            if (signature.getDigestAlgorithms() != null) {
                for (com.groupdocs.metadata.core.Oid signatureDigestAlgorithm : signature.getDigestAlgorithms()) {
                    printOid(signatureDigestAlgorithm);
                }
            }

            if (signature.getEncapsulatedContent() != null) {
                System.out.println(signature.getEncapsulatedContent().getContentType());
                System.out.println(signature.getEncapsulatedContent().getContentRawData().length);
            }

            if (signature.getCertificates() != null) {
                for (com.groupdocs.metadata.core.CmsCertificate certificate : signature.getCertificates()) {
                    System.out.println(certificate.getNotAfter());
                    System.out.println(certificate.getNotBefore());
                    System.out.println(certificate.getRawData().length);
                }
            }

            if (signature.getSigners() != null) {
                for (com.groupdocs.metadata.core.CmsSigner signerInfoEntry : signature.getSigners()) {
                    System.out.println(signerInfoEntry.getSignatureValue());
                    printOid(signerInfoEntry.getDigestAlgorithm());
                    printOid(signerInfoEntry.getSignatureAlgorithm());
                    System.out.println(signerInfoEntry.getSigningTime());
                }
            }
        }
    }
}

关键部分说明

  • 签名时间: 应用签名的时间戳。
  • 摘要算法与 OID: 使用的哈希算法(例如 SHA‑256)。
  • 封装内容: 签名内部包装的任何附加数据。
  • 证书: 有效期和原始数据大小有助于验证签名者身份。
  • 签名者: 提供每个签名者的算法选择和签名时间戳。

故障排除技巧

  • 如果字体没有数字签名,getDigitalSignaturePackage() 将返回 null。在访问标志或签名前务必检查 null。
  • 确保使用与 Maven 依赖中定义的 GroupDocs.Metadata 版本相同,以避免兼容性问题。

实际应用

提取 OpenType 字体签名在许多真实场景中都非常有价值:

  1. 文档验证: 在内容管理系统中自动检查已签名的字体文件。
  2. 数字资产管理: 在将字体部署到品牌项目之前验证其真实性。
  3. 安全审计: 审查签名细节以确保符合内部安全策略。

性能考虑

  • 资源管理: 使用 try‑with‑resources 及时关闭 Metadata 对象。
  • 批处理: 将字体分组处理以最小化 I/O 开销;GroupDocs.Metadata 能在不将每个字体完整加载到内存的情况下处理成千上万的文件。
  • 并发性: 为大规模工作负载在并行线程中运行独立的 Metadata 实例;库本身对每个实例并非线程安全,需要为每个线程单独实例化。

常见问题

问:如果字体没有数字签名,我还能提取签名吗?
答:DigitalSignaturePackage 将为 null;在访问标志或细节前请始终检查此情况。

问:需要哪个版本的 GroupDocs.Metadata?
答:示例针对 24.12 版本,但更新的版本仍然向后兼容 OpenType 字体。

问:读取签名是否需要特殊许可证?
答:评估阶段可使用试用许可证;生产环境必须使用正式许可证。

问:如何处理存储在云存储桶中的字体?
答:先将字体下载到临时本地文件,然后将其路径传递给 Metadata。库可以读取任何本地可访问的文件。

问:是否可以验证签名的加密有效性?
答:GroupDocs.Metadata 提供原始签名数据;您可以将证书链和哈希值交给其他加密库,以执行完整的验证。

结论

通过本指南,您已经掌握了 如何使用 GroupDocs.Metadata for Java 提取 OpenType 字体签名 以及详细的数字签名数据。将这些步骤集成到您的应用程序中,可增强文档安全性、简化资产验证,并支持合规性工作。

下一步

  • 试验批处理以高效处理大型字体库。
  • 将提取的数据与安全审计工具结合,实现自动化合规报告。
  • 探索 GroupDocs.Metadata 的其他元数据功能,例如在适当情况下编辑或删除签名。

Last Updated: 2026-06-22
Tested With: GroupDocs.Metadata 24.12
Author: GroupDocs

相关教程