在 PHP 中为演示文稿添加数字签名

数字证书用于创建受密码保护的 PowerPoint 演示文稿,并标记为由特定组织或个人创建。数字证书可通过联系授权机构——证书颁发机构获取。将数字证书安装到系统后,可通过 文件 → 信息 → 保护演示文稿 为演示文稿添加数字签名:

todo:image_alt_text

演示文稿可能包含多个数字签名。将数字签名添加到演示文稿后,PowerPoint 中会显示一条特殊消息:

todo:image_alt_text

要签署演示文稿或检查演示文稿签名的真实性,Aspose.Slides API 提供了DigitalSignature 类、DigitalSignatureCollection 类以及Presentation::getDigitalSignatures 方法。目前,仅在 PPTX 格式中支持数字签名。

从 PFX 证书添加数字签名

下面的代码示例演示如何从 PFX 证书添加数字签名:

  1. 打开 PFX 文件并将 PFX 密码传递给DigitalSignature 对象。
  2. 将创建的签名添加到演示文稿对象。
  # 打开演示文稿文件
  $pres = new Presentation();
  try {
    # 使用 PFX 文件和 PFX 密码创建 DigitalSignature 对象
    $signature = new DigitalSignature("testsignature1.pfx", "testpass1");
    # 为新的数字签名添加注释
    $signature->setComments("Aspose.Slides digital signing test.");
    # 将数字签名添加到演示文稿
    $pres->getDigitalSignatures()->add($signature);
    # 保存演示文稿
    $pres->save("SomePresentationSigned.pptx", SaveFormat::Pptx);
  } finally {
    $pres->dispose();
  }

现在可以检查演示文稿是否已数字签名且未被修改:

  # 打开演示文稿
  $pres = new Presentation("SomePresentationSigned.pptx");
  try {
    if (java_values($pres->getDigitalSignatures()->size()) > 0) {
      $allSignaturesAreValid = true;
      echo("Signatures used to sign the presentation: ");
      # 检查所有数字签名是否有效
      foreach($pres->getDigitalSignatures() as $signature) {
        echo($signature->getComments() . ", " . $signature->getSignTime()->toString() . " -- " . $signature->isValid() ? "VALID" : "INVALID");
        $allSignaturesAreValid &= $signature->isValid();
      }
      if ($allSignaturesAreValid) {
        echo("Presentation is genuine, all signatures are valid.");
      } else {
        echo("Presentation has been modified since signing.");
      }
    }
  } finally {
    if (!java_is_null($pres)) {
      $pres->dispose();
    }
  }

FAQ

我可以删除文件中已有的签名吗?

可以。数字签名集合支持删除单个项目完全清除;保存文件后,演示文稿将不再拥有签名。

签名后文件会变成“只读”吗?

不会。签名可以保留完整性和作者信息,但不会阻止编辑。若需限制编辑,可结合“只读"或密码使用。

签名在不同版本的 PowerPoint 中能正确显示吗?

签名是为 OOXML(PPTX)容器创建的。支持 OOXML 签名的现代 PowerPoint 版本能够正确显示此类签名的状态。