Gerenciar rótulos de sensibilidade em apresentações PowerPoint em PHP

Visão geral

Os rótulos de sensibilidade do Microsoft Purview ajudam as organizações a classificar e governar documentos. Durante o processamento automatizado de apresentações, um aplicativo pode precisar preservar um rótulo existente, aplicar um rótulo selecionado por uma política, atualizar seu estado ou migrar metadados de rótulo gravados por um fluxo de trabalho mais antigo do Microsoft Information Protection (MIP).

Aspose.Slides for PHP via Java expõe metadados modernos de rótulo de sensibilidade através de Presentation::getSensitivityLabels. Este método retorna uma SensitivityLabelCollection que pode ser inspecionada e modificada antes que a apresentação seja salva como PPTX.

Entenda as propriedades do rótulo de sensibilidade

Cada SensitivityLabel contém os seguintes metadados:

Métodos Objetivo
SensitivityLabel::getId e SensitivityLabel::setId Obtém ou define o identificador do rótulo de sensibilidade na política do Purview.
SensitivityLabel::getSiteId e SensitivityLabel::setSiteId Obtém ou define o site associado à política do rótulo.
SensitivityLabel::isEnabled e SensitivityLabel::setEnabled Obtém ou define se o rótulo está habilitado.
SensitivityLabel::isRemoved e SensitivityLabel::setRemoved Obtém ou define se o rótulo foi removido. Defina o valor como true quando o estado de remoção precisar ser preservado nos metadados.
SensitivityLabel::getAssignmentMethodType e SensitivityLabel::setAssignmentMethodType Obtém ou define se o rótulo foi aplicado automaticamente ou por decisão do usuário.
SensitivityLabel::getContentMarkTypes Obtém os tipos de marcação de conteúdo associados ao rótulo.

A classe SensitivityLabelAssignmentType define como um rótulo foi atribuído:

A classe SensitivityLabelContentType define a marcação associada a um rótulo:

Valor Significado
SensitivityLabelContentType::None O rótulo foi aplicado por padrão ou automaticamente.
SensitivityLabelContentType::Header A marcação de conteúdo de cabeçalho está associada ao rótulo.
SensitivityLabelContentType::Footer A marcação de conteúdo de rodapé está associada ao rótulo.
SensitivityLabelContentType::Watermark A marcação de conteúdo de marca d’água está associada ao rótulo.
SensitivityLabelContentType::Encryption A proteção por criptografia está associada ao rótulo.

Vários tipos de marcação podem ser associados a um mesmo rótulo.

Listar rótulos de sensibilidade existentes

Leia a coleção de rótulos modernos a partir de Presentation::getSensitivityLabels e enumere-a. O exemplo a seguir lista todas as propriedades e marcações de conteúdo armazenadas para cada rótulo:

$presentation = new Presentation("presentation.pptx");
try {
    $sensitivityLabels = $presentation->getSensitivityLabels();
    $sensitivityLabelCount = java_values($sensitivityLabels->getCount());

    for ($labelIndex = 0; $labelIndex < $sensitivityLabelCount; $labelIndex++) {
        $sensitivityLabel = $sensitivityLabels->get_Item($labelIndex);

        echo "Label ID: " . java_values($sensitivityLabel->getId()) . PHP_EOL;
        echo "Site ID: " . java_values($sensitivityLabel->getSiteId()->toString()) . PHP_EOL;
        echo "Enabled: " . (java_values($sensitivityLabel->isEnabled()) ? "true" : "false") . PHP_EOL;
        echo "Removed: " . (java_values($sensitivityLabel->isRemoved()) ? "true" : "false") . PHP_EOL;
        echo "Assignment method: " . java_values($sensitivityLabel->getAssignmentMethodType()) . PHP_EOL;

        $contentMarkIterator = $sensitivityLabel->getContentMarkTypes()->iterator();
        while (java_values($contentMarkIterator->hasNext())) {
            $contentMarkType = java_values($contentMarkIterator->next());
            echo "Content marking: " . $contentMarkType . PHP_EOL;
        }
    }
} finally {
    $presentation->dispose();
}

Adicionar um rótulo de sensibilidade com marcação de conteúdo

Use SensitivityLabelCollection::add com o identificador do rótulo, identificador do site, estado habilitado e método de atribuição. Após o método retornar o novo SensitivityLabel, adicione os valores de marcação necessários através da lista retornada por SensitivityLabel::getContentMarkTypes.

O exemplo a seguir adiciona um rótulo selecionado manualmente associado a marcações de rodapé e marca d’água, e então salva o resultado como PPTX:

$presentation = new Presentation("presentation.pptx");
try {
    $sensitivityLabels = $presentation->getSensitivityLabels();

    $labelIdentifier = "{11111111-2222-3333-4444-555555555555}";
    $UUID = new JavaClass("java.util.UUID");
    $siteIdentifier = $UUID->fromString("aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
    $isEnabled = true;
    $assignmentMethod = SensitivityLabelAssignmentType::Privileged;

    $sensitivityLabel = $sensitivityLabels->add(
        $labelIdentifier,
        $siteIdentifier,
        $isEnabled,
        $assignmentMethod
    );

    $contentMarkTypes = $sensitivityLabel->getContentMarkTypes();
    $contentMarkTypes->addItem(SensitivityLabelContentType::Footer);
    $contentMarkTypes->addItem(SensitivityLabelContentType::Watermark);

    $presentation->save("presentation_with_label.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

Atualizar um rótulo de sensibilidade

Os valores de SensitivityLabel são leitura/escrita, exceto a lista retornada por SensitivityLabel::getContentMarkTypes, que é modificada por meio de suas operações de lista. Após localizar o rótulo necessário, você pode atualizar seu identificador, identificador do site, estado habilitado, método de atribuição, estado de remoção e tipos de marcação de conteúdo. Salve a apresentação para persistir as alterações.

O exemplo a seguir atualiza o estado habilitado e o método de atribuição do primeiro rótulo:

$presentation = new Presentation("presentation.pptx");
try {
    $sensitivityLabels = $presentation->getSensitivityLabels();
    $sensitivityLabelCount = java_values($sensitivityLabels->getCount());

    if ($sensitivityLabelCount > 0) {
        $sensitivityLabel = $sensitivityLabels->get_Item(0);
        $sensitivityLabel->setEnabled(true);
        $sensitivityLabel->setAssignmentMethodType(SensitivityLabelAssignmentType::Privileged);
    }

    $presentation->save("presentation_with_updated_label.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

Marcar um rótulo de sensibilidade como removido

Para preservar o fato de que um rótulo foi removido, encontre o rótulo e chame SensitivityLabel::setRemoved com true. Isso mantém a entrada do rótulo enquanto registra seu estado removido. Se, em vez disso, precisar excluir uma entrada da coleção moderna, use SensitivityLabelCollection::removeAt; use SensitivityLabelCollection::clear para excluir todas as entradas.

O exemplo a seguir marca um rótulo específico como removido e salva a apresentação atualizada:

$presentation = new Presentation("presentation.pptx");
try {
    $sensitivityLabels = $presentation->getSensitivityLabels();
    $targetLabelIdentifier = "{11111111-2222-3333-4444-555555555555}";
    $sensitivityLabelCount = java_values($sensitivityLabels->getCount());

    for ($labelIndex = 0; $labelIndex < $sensitivityLabelCount; $labelIndex++) {
        $sensitivityLabel = $sensitivityLabels->get_Item($labelIndex);
        $labelIdentifier = java_values($sensitivityLabel->getId());
        $isTargetLabel = strcasecmp($labelIdentifier, $targetLabelIdentifier) === 0;

        if ($isTargetLabel) {
            $sensitivityLabel->setRemoved(true);
            break;
        }
    }

    $presentation->save("presentation_with_removed_label.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

Ler e migrar rótulos de sensibilidade legados do MIP

Fluxos de trabalho mais antigos baseados em MIP podem armazenar metadados de rótulo de sensibilidade em propriedades de documento personalizadas em vez da coleção moderna de rótulos. Leia esses metadados com DocumentProperties::getSensitivityLabels. O método analisa as propriedades personalizadas legadas e devolve um array Java de objetos SensitivityLabel.

Para migrar os metadados, adicione cada rótulo retornado à moderna SensitivityLabelCollection por meio de SensitivityLabelCollection::add. Como a adição de um identificador de rótulo duplicado gera uma exceção, o exemplo verifica a coleção de destino antes de copiar cada rótulo. Você pode acrescentar validações adicionais para confirmar que cada rótulo legado ainda existe na política atual do Purview.

$presentation = new Presentation("presentation_with_legacy_labels.pptx");
try {
    $legacySensitivityLabels = $presentation->getDocumentProperties()->getSensitivityLabels();
    $modernSensitivityLabels = $presentation->getSensitivityLabels();

    $Array = new JavaClass("java.lang.reflect.Array");
    $legacyLabelCount = java_values($Array->getLength($legacySensitivityLabels));

    for ($legacyLabelIndex = 0; $legacyLabelIndex < $legacyLabelCount; $legacyLabelIndex++) {
        $legacySensitivityLabel = $legacySensitivityLabels[$legacyLabelIndex];
        $legacyLabelIdentifier = java_values($legacySensitivityLabel->getId());
        $labelAlreadyExists = false;
        $modernLabelCount = java_values($modernSensitivityLabels->getCount());

        for ($modernLabelIndex = 0; $modernLabelIndex < $modernLabelCount; $modernLabelIndex++) {
            $modernSensitivityLabel = $modernSensitivityLabels->get_Item($modernLabelIndex);
            $modernLabelIdentifier = java_values($modernSensitivityLabel->getId());
            $labelAlreadyExists = strcasecmp(
                $modernLabelIdentifier,
                $legacyLabelIdentifier
            ) === 0;

            if ($labelAlreadyExists) {
                break;
            }
        }

        if (!$labelAlreadyExists) {
            $modernSensitivityLabels->add($legacySensitivityLabel);
        }
    }

    $presentation->save("presentation_with_modern_labels.pptx", SaveFormat::Pptx);
} finally {
    $presentation->dispose();
}

A migração copia os objetos de rótulo analisados para a coleção moderna. Não é necessário limpar todas as propriedades de documento personalizadas, de modo que metadados de documento não relacionados permanecem intactos. Use Presentation::save com SaveFormat::Pptx para gravar os metadados modernos de rótulo em um arquivo PPTX.

FAQ

Adicionar um tipo de marcação de conteúdo cria um cabeçalho, rodapé ou marca d’água visível nos slides?

Não. Os valores adicionados através da lista retornada por SensitivityLabel::getContentMarkTypes descrevem as marcações associadas ao rótulo de sensibilidade. Eles não criam texto ou formas visíveis na apresentação. Adicione o conteúdo de slide correspondente separadamente se o seu fluxo de trabalho precisar renderizar essas marcações.

Qual a diferença entre marcar um rótulo como removido e excluí‑lo da coleção?

Chamar SensitivityLabel::setRemoved com true mantém a entrada do rótulo e registra seu estado removido. Chamar SensitivityLabelCollection::removeAt exclui a entrada da coleção moderna. Escolha a operação que corresponde aos requisitos de retenção de metadados da sua organização.

Uma apresentação pode conter metadados legados do MIP e rótulos de sensibilidade modernos ao mesmo tempo?

Sim. Rótulos legados podem permanecer em propriedades de documento personalizadas enquanto rótulos modernos ficam disponíveis através de Presentation::getSensitivityLabels. Use DocumentProperties::getSensitivityLabels para ler os metadados legados e migrar apenas os rótulos válidos que ainda não estejam presentes na coleção moderna.

O que acontece quando um rótulo com o mesmo identificador é adicionado mais de uma vez?

SensitivityLabelCollection::add gera uma exceção quando a coleção já contém um rótulo com o mesmo identificador. Verifique os valores existentes retornados por SensitivityLabel::getId antes de adicionar ou migrar rótulos.

Qual formato de saída deve ser usado para preservar rótulos de sensibilidade atualizados?

Salve a apresentação como PPTX chamando Presentation::save com SaveFormat::Pptx, como mostrado nos exemplos acima.