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

介绍

在当今数字时代,如何提取签名信息是需要验证真实性和保持完整性的开发者的常见需求。本教程将指导您使用 GroupDocs.Metadata for Java 从 OpenType 字体中提取数字签名标志和详细签名数据。无论您是在构建文档管理系统、安全聚焦的应用程序,还是仅仅需要审计字体资产,掌握此过程都将使您的工作流更加可靠和安全。

您将学习的内容

  • 如何从 OpenType 字体中提取数字签名标志
  • 如何检索每个数字签名的中设置并使用** GroupDocs.Metadata for Java (v24.12)
  • 需要哪个 Java 版本? JDK 8 或更高版本
  • 需要许可证吗? 免费试用可用于评估;生产环境需要正式许可证
  • 可以处理多个字体吗? 可以 – 对大批量使用批处理或并发处理
  • 代码是线程安全的吗? Metadata 对象是一次性使用的;每个线程创建一个新实例

前置条件

在提取数字签名数据之前,请确保您的环境满足以下要求:

必需的库和依赖

要使用 GroupDocs.Metadata for Java,请在下面的示例中加入 Maven 仓库和依赖。

高版本意支持 Java 的 IDE(IntelliJ IDEA、Eclipse、VS Code 等)。

知识前提

具备基本的 Java 经验并了解数字签名会有所帮助,但本指南为新手提供了清晰的解释。

设置 GroupDocs.Metadata for Java

Maven 安装

在您的 pom.xml 文件中添加以下配置。这将获取示例所需的 groupdocs metadata java 包。

<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 获取临时许可证。
  • 购买: 如需完整功能,请考虑购买正式许可证。

安装库并获取许可证后,即可开始提取签名。

什么是 OpenType 字体中的数字签名?

嵌入在 OpenType 字体中的数字签名可确保自签名以来字体文件未被篡改。签名包含签名时间、证书、哈希算法等加密信息,您可以使用 GroupDocs.Metadata 以编程方式读取这些信息。

如何提取数字签名标志

概述

提取数字签名标志可让您快速识别签名的状态和属性(例如是否有效、是否被撤销或是否具有特殊条件)。

实现步骤

  1. 初始化 Metadata: 创建指向字体文件的 Metadata 实例。
  2. 读取标志: 访问 DigitalSignaturePackage 并打印其标志。
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 对象自动关闭,防止资源泄漏。

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

概述

除了标志之外,您通常需要检查每个签名的元数据——签名时间、算法、证书以及封装的内容。

实现步骤

  1. 初始化 Metadata(同上)。
  2. 遍历签名: 对每个 CmsSignature,打印相关属性。
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());
                }
            }
        }
    }
}

关键部分说明

  • 签名时间 (Sign Time): 签名应用的时间点。
  • 摘要算法与 OID: 使用的哈希算法(例如 SHA‑256)。
  • 封装内容 (Encapsulated Content): 签名内部包装的额外数据。
  • 证书 (Certificates): 有效期和原始数据大小有助于验证签署者身份。
  • 签署者 (Signers): 提供每位签署者的算法选择和签名时间戳。

故障排除提示

  • 确认字体实际包含数字签名;否则 getDigitalSignaturePackage() 将返回 null
  • 确认使用的 GroupDocs.Metadata 版本与 Maven 依赖中列出的版本一致,以避免兼容性问题。

实际应用场景

从 OpenType 字体中提取数字签名数据在多种情境下都很有用:

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

性能考虑

  • 资源管理: 始终使用 try‑with‑resources 及时关闭 Metadata 对象。
  • 批处理: 处理大量字体时,采用批量方式以降低 I/O 开销。
  • 并发性: 对于大规模工作负载,可在并行线程中运行独立的 Metadata 实例;库本身对每个实例并非线程安全。

常见问题

Q: 能从没有数字签名的字体中提取签名吗?
A: DigitalSignaturePackage 将为 null;在访问标志或细节之前请先检查此情况。

Q: 需要哪个版本的 GroupDocs.Metadata?
A: 示例使用 24.12 版本,但更新的版本对 OpenType 字体仍保持向后兼容。

Q: 读取签名是否需要特殊许可证?
A: 试用许可证可用于评估;生产环境需要正式许可证。

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

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

结论

通过本指南,您已经掌握了使用 GroupDocs.Metadata for Java 从 OpenType 字体中 提取签名 信息和详细数字签名数据的完整流程。将这些技术融入您的应用程序,可提升文档安全性、简化资产验证并支持合规性工作。

后续步骤

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

最后更新: 2026-01-24
测试环境: GroupDocs.Metadata 24.12
作者: GroupDocs