Gestire i tag e i dati personalizzati nelle presentazioni su Android

Panoramica

Questo articolo spiega come Aspose.Slides gestisce tag e dati personalizzati nelle presentazioni PowerPoint. I dati specifici di una presentazione possono essere archiviati come tag o parti XML personalizzate. I tag sono semplici coppie chiave‑valore di stringa, mentre le parti XML personalizzate possono memorizzare metadati strutturati e payload XML specifici dell’applicazione.

Aspose.Slides fornisce API per aggiungere, leggere, aggiornare, verificare e rimuovere parti XML personalizzate a livello di presentazione, diapositiva e forma. Le parti XML personalizzate sono utili per integrazioni che memorizzano informazioni come identificatori di gestione documentale, stato del flusso di lavoro, metadati di conformità, dati di binding del modello o altri dati applicativi strutturati all’interno di una presentazione.

Archiviazione dei dati nei file di presentazione

I file PPTX—file con estensione .pptx—sono salvati nel formato PresentationML, che fa parte della specifica Office Open XML. Office Open XML definisce la struttura del pacchetto e le relazioni usate per memorizzare il contenuto della presentazione e i dati correlati.

Una presentazione contiene più parti collegate da relazioni. Ad esempio, una parte diapositiva contiene il contenuto di una singola diapositiva e può avere relazioni esplicite verso altre parti definite da ISO/IEC 29500.

I dati personalizzati possono essere archiviati come tag (ITagCollection) o parti XML personalizzate (ICustomXmlPartCollection). Entrambi sono disponibili attraverso l’interfaccia ICustomData .

Lavorare con le parti XML personalizzate

Il metodo ICustomData.getCustomXmlParts() restituisce la raccolta di parti XML personalizzate associate a un determinato oggetto della presentazione. Per esempio:

  • presentation.getCustomData().getCustomXmlParts() contiene le parti XML personalizzate associate alla stessa presentazione.
  • slide.getCustomData().getCustomXmlParts() contiene le parti XML personalizzate associate a una specifica diapositiva.
  • shape.getCustomData().getCustomXmlParts() contiene le parti XML personalizzate associate a una specifica forma.

Usa Presentation.getAllCustomXmlParts() quando devi esaminare tutte le parti XML personalizzate nella presentazione, indipendentemente da dove siano associate.

Aggiungere una parte XML personalizzata a una presentazione

Usa ICustomXmlPartCollection.add per aggiungere dati XML a una raccolta di parti XML personalizzate. L’XML deve essere valido e non vuoto.

L’esempio seguente aggiunge metadati strutturati alla raccolta di dati personalizzati a livello di presentazione:

import com.aspose.slides.*;
import java.util.UUID;

String customXmlContent =
    "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
    "<metadata xmlns=\"urn:example:metadata\">" +
        "<documentId>DOC-1001</documentId>" +
        "<workflowState>Draft</workflowState>" +
    "</metadata>";

Presentation presentation = new Presentation();
try {
    ICustomXmlPart customXmlPart = presentation.getCustomData().getCustomXmlParts().add(customXmlContent);

    // add assegna un identificatore automaticamente. Imposta un UUID specifico solo quando necessario.
    customXmlPart.setItemId(UUID.randomUUID());

    presentation.save("presentation_with_custom_xml.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Il metodo add può anche accettare XML come array di byte o stream di input, utile quando il contenuto XML è già disponibile in forma binaria.

Aggiungere una parte XML personalizzata a una diapositiva o a una forma

I dati XML personalizzati possono essere associati a una specifica diapositiva o forma anziché all’intera presentazione. Questo è utile quando i metadati descrivono solo un oggetto, ad esempio una chiave di modello, un identificatore di record esterno o informazioni di binding.

L’esempio seguente aggiunge una parte XML personalizzata a una diapositiva e un’altra a una forma:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);

    slide.getCustomData().getCustomXmlParts().add(
        "<slideMetadata xmlns=\"urn:example:slides\">" +
            "<templateKey>TitleSlide</templateKey>" +
        "</slideMetadata>");

    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 50, 50, 250, 80);

    shape.getTextFrame().setText("Customer data");
    shape.getCustomData().getCustomXmlParts().add(
        "<shapeMetadata xmlns=\"urn:example:shapes\">" +
            "<recordId>CRM-4281</recordId>" +
        "</shapeMetadata>");

    presentation.save("object_custom_xml.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Il livello a cui viene aggiunta una parte determina quale raccolta getCustomData().getCustomXmlParts() dell’oggetto contiene la relazione a quella parte. I dati a livello di presentazione sono appropriati per metadati a livello di documento, i dati a livello di diapositiva per informazioni legate a una diapositiva specifica e i dati a livello di forma per metadati associati a una singola forma.

Elencare e verificare tutte le parti XML personalizzate

Usa Presentation.getAllCustomXmlParts() per recuperare tutte le parti XML personalizzate da una presentazione. Ogni ICustomXmlPart espone il proprio identificatore, il contenuto XML e gli schemi di namespace associati.

L’esempio seguente elenca tutte le parti XML personalizzate e i loro schemi di namespace:

import com.aspose.slides.*;

Presentation presentation = new Presentation("presentation.pptx");
try {
    for (ICustomXmlPart customXmlPart : presentation.getAllCustomXmlParts()) {
        System.out.println("ItemId: " + customXmlPart.getItemId());
        System.out.println("XML:");
        System.out.println(customXmlPart.getXmlAsString());

        for (String namespaceSchema : customXmlPart.getNamespaceSchemas()) {
            System.out.println("Namespace schema: " + namespaceSchema);
        }

        System.out.println();
    }
} finally {
    presentation.dispose();
}

ICustomXmlPart.getNamespaceSchemas() restituisce gli schemi XML associati alla parte XML personalizzata. Questa informazione può essere utile durante la verifica di presentazioni che contengono XML prodotto da sistemi esterni.

Leggere e aggiornare il contenuto XML e ItemId

Usa ICustomXmlPart.getXmlAsString() e setXmlAsString() per lavorare con l’XML come stringa UTF‑8, oppure getXmlData() e setXmlData() per gestire i byte XML grezzi.

Il metodo ICustomXmlPart.getItemId() restituisce l’UUID che identifica la parte XML personalizzata nel documento Office Open XML. Usa setItemId() quando un’integrazione richiede un nuovo identificatore.

L’esempio seguente aggiorna il contenuto XML e l’identificatore:

import com.aspose.slides.*;
import java.nio.charset.StandardCharsets;
import java.util.UUID;

Presentation presentation = new Presentation("presentation.pptx");
try {
    ICustomXmlPart customXmlPart = presentation.getAllCustomXmlParts()[0];

    // Leggi l'XML corrente come testo.
    String currentXmlContent = customXmlPart.getXmlAsString();
    System.out.println(currentXmlContent);

    // Aggiorna l'XML come stringa UTF-8.
    customXmlPart.setXmlAsString(
        "<metadata xmlns=\"urn:example:metadata\">" +
            "<documentId>DOC-1001</documentId>" +
            "<workflowState>Approved</workflowState>" +
        "</metadata>");

    // getXmlData fornisce lo stesso contenuto XML come byte grezzi.
    byte[] customXmlData = customXmlPart.getXmlData();
    System.out.println(new String(customXmlData, StandardCharsets.UTF_8));

    // Sostituisci l'identificatore quando richiesto dall'integrazione.
    customXmlPart.setItemId(UUID.randomUUID());

    presentation.save("updated_custom_xml.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Quando chiami setXmlAsString o setXmlData, fornisci XML valido e non vuoto. Usa una rappresentazione o l’altra a seconda che l’applicazione lavori principalmente con stringhe o con dati binari.

Rimuovere una parte XML personalizzata

Aspose.Slides fornisce diversi modi per rimuovere dati XML personalizzati:

L’esempio seguente rimuove una parte XML personalizzata a livello di presentazione tramite riferimento:

import com.aspose.slides.*;

Presentation presentation = new Presentation("presentation.pptx");
try {
    ICustomXmlPartCollection customXmlParts = presentation.getCustomData().getCustomXmlParts();

    if (customXmlParts.size() > 0) {
        ICustomXmlPart customXmlPart = customXmlParts.get_Item(0);
        customXmlParts.remove(customXmlPart);
    }

    presentation.save("custom_xml_removed.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Se disponi già di un ICustomXmlPart e vuoi rimuovere quella parte dalla presentazione anziché da una raccolta specifica, chiama customXmlPart.remove().

Puoi anche rimuovere un elemento per indice:

presentation.getCustomData().getCustomXmlParts().removeAt(0);

Cancellare tutte le parti XML personalizzate da una raccolta

Usa clear quando tutte le parti XML personalizzate associate a un determinato oggetto della presentazione devono essere rimosse.

import com.aspose.slides.*;

Presentation presentation = new Presentation("presentation.pptx");
try {
    presentation.getSlides().get_Item(0).getCustomData().getCustomXmlParts().clear();

    presentation.save("slide_custom_xml_cleared.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

clear influisce solo sulla raccolta selezionata. Ad esempio, cancellare la raccolta di una diapositiva non cancella quelle a livello di presentazione o di forma.

Per rimuovere ogni parte XML personalizzata nella presentazione, itera su getAllCustomXmlParts() e rimuovi ciascuna parte:

import com.aspose.slides.*;

Presentation presentation = new Presentation("presentation.pptx");
try {
    for (ICustomXmlPart customXmlPart : presentation.getAllCustomXmlParts()) {
        customXmlPart.remove();
    }

    presentation.save("all_custom_xml_removed.pptx", SaveFormat.Pptx);
} finally {
    presentation.dispose();
}

Gestire parti XML personalizzate collegate o condivise

In una presentazione Office Open XML, la stessa parte XML personalizzata può essere referenziata da più oggetti della presentazione. Per esempio, un file esistente può contenere relazioni da più diapositive o forme verso la stessa parte XML sottostante.

Una parte condivisa deve essere trattata come un unico oggetto dati con più riferimenti:

  • L’aggiornamento con setXmlAsString, setXmlData o setItemId modifica la parte XML sottostante, quindi la modifica si applica ovunque la parte sia referenziata.
  • getItemId() può essere usato per identificare la stessa parte XML durante la verifica delle raccolte a livello di oggetto.
  • Rimuovere una parte da una specifica raccolta getCustomXmlParts() la elimina solo da quella raccolta. Usa ICustomXmlPart.remove() quando la parte stessa deve essere rimossa dalla presentazione.
  • Prima di eliminare o sostituire una parte condivisa, ispeziona le raccolte a livello di oggetto per determinare se altre diapositive o forme la referenziano ancora.

Le sovraccariche di add creano una nuova parte XML personalizzata a partire dal contenuto XML; non accettano un ICustomXmlPart esistente. Pertanto, le relazioni condivise si incontrano più spesso durante il caricamento di presentazioni che le contengono già.

L’esempio seguente verifica le raccolte a livello di presentazione, diapositiva e forma per ItemId e segnala le parti referenziate da più di un luogo:

import com.aspose.slides.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.BiConsumer;

Presentation presentation = new Presentation("presentation.pptx");
try {
    Map<UUID, List<String>> referencesByItemId = new HashMap<>();

    BiConsumer<String, ICustomXmlPartCollection> registerCustomXmlParts =
        (ownerName, customXmlParts) -> {
            for (int i = 0; i < customXmlParts.size(); i++) {
                ICustomXmlPart customXmlPart = customXmlParts.get_Item(i);
                UUID itemId = customXmlPart.getItemId();

                if (!referencesByItemId.containsKey(itemId)) {
                    referencesByItemId.put(itemId, new ArrayList<>());
                }

                referencesByItemId.get(itemId).add(ownerName);
            }
        };

    registerCustomXmlParts.accept("Presentation", presentation.getCustomData().getCustomXmlParts());

    for (int slideIndex = 0; slideIndex < presentation.getSlides().size(); slideIndex++) {
        ISlide slide = presentation.getSlides().get_Item(slideIndex);
        registerCustomXmlParts.accept("Slide " + (slideIndex + 1), slide.getCustomData().getCustomXmlParts());

        for (int shapeIndex = 0; shapeIndex < slide.getShapes().size(); shapeIndex++) {
            IShape shape = slide.getShapes().get_Item(shapeIndex);
            registerCustomXmlParts.accept("Slide " + (slideIndex + 1) + ", shape " + shapeIndex, shape.getCustomData().getCustomXmlParts());
        }
    }

    for (Map.Entry<UUID, List<String>> referenceEntry : referencesByItemId.entrySet()) {
        if (referenceEntry.getValue().size() > 1) {
            System.out.println("Shared custom XML part: " + referenceEntry.getKey());

            for (String ownerName : referenceEntry.getValue()) {
                System.out.println("  Referenced by: " + ownerName);
            }
        }
    }
} finally {
    presentation.dispose();
}

Questo tipo di verifica è utile prima di modificare o eliminare dati XML personalizzati in presentazioni create da sistemi esterni, poiché la stessa parte di metadati può partecipare a più relazioni.

Ottenere i valori dei tag

In Slides, un tag corrisponde al metodo IDocumentProperties.getKeywords(). Questo esempio mostra come ottenere il valore di un tag con Aspose.Slides per Android via Java per Presentation:

import com.aspose.slides.*;

Presentation presentation = new Presentation("presentation.pptx");
try {
    String keywords = presentation.getDocumentProperties().getKeywords();
} finally {
    presentation.dispose();
}

Aggiungere tag alle presentazioni

Aspose.Slides consente di aggiungere tag alle presentazioni. Un tag tipicamente è costituito da due elementi:

  • il nome di una proprietà personalizzata, ad esempio MyTag;
  • il valore della proprietà personalizzata, ad esempio My Tag Value.

Se devi classificare le presentazioni secondo una regola o proprietà specifica, puoi aggiungere tag a tal fine. Per esempio, se vuoi categorizzare le presentazioni dei paesi del Nord America, puoi creare un tag “North American” e assegnare il paese rilevante come valore.

Questo esempio mostra come aggiungere un tag a una Presentation usando Aspose.Slides per Android via Java:

import com.aspose.slides.*;

Presentation presentation = new Presentation("presentation.pptx");
try {
    ITagCollection tags = presentation.getCustomData().getTags();
    tags.set_Item("MyTag", "My Tag Value");
} finally {
    presentation.dispose();
}

I tag possono essere impostati anche per una Slide:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    slide.getCustomData().getTags().set_Item("tag", "value");
} finally {
    presentation.dispose();
}

Oppure per una singola Shape:

import com.aspose.slides.*;

Presentation presentation = new Presentation();
try {
    ISlide slide = presentation.getSlides().get_Item(0);
    IAutoShape shape = slide.getShapes().addAutoShape(ShapeType.Rectangle, 10, 10, 100, 50);
    shape.getTextFrame().setText("My text");
    shape.getCustomData().getTags().set_Item("tag", "value");
} finally {
    presentation.dispose();
}

Limitazioni

I tag aggiunti tramite la collezione getCustomData().getTags() sono salvati solo nel file PowerPoint. Non vengono trasferiti alla struttura dei tag PDF quando la presentazione viene esportata in PDF. Di conseguenza, un identificatore personalizzato assegnato come tag non può essere recuperato dal PDF taggato.

Soluzione alternativa: puoi memorizzare un identificatore personalizzato nel Testo alternativo dell’oggetto (ad esempio, shape.setAlternativeText("MyId")). Dopo l’esportazione in PDF, il Testo alternativo può apparire nella struttura dei tag PDF.

FAQ

Posso rimuovere tutti i tag da una presentazione, diapositiva o forma in un’unica operazione?

Sì. La collezione dei tag supporta l’operazione clear che elimina tutte le coppie chiave‑valore in una volta.

Come elimino un singolo tag dal suo nome senza iterare sull’intera collezione?

Usa remove(name) sulla collezione dei tag per cancellare il tag tramite la sua chiave.

Come posso recuperare l’elenco completo dei nomi dei tag per analisi o filtraggio?

Usa getNamesOfTags sulla collezione dei tag; restituisce un array con tutti i nomi dei tag.

Come trovo tutte le parti XML personalizzate indipendentemente da dove siano memorizzate?

Usa Presentation.getAllCustomXmlParts() per recuperare tutte le parti XML personalizzate nella presentazione.

Devo usare getXmlAsString/setXmlAsString oppure getXmlData/setXmlData per aggiornare una parte XML personalizzata?

Usa getXmlAsString e setXmlAsString quando l’applicazione lavora con testo XML UTF‑8. Usa getXmlData e setXmlData quando l’XML è già disponibile come array di byte o quando è più comodo elaborare dati binari. Entrambe le rappresentazioni si riferiscono al contenuto XML della stessa parte XML personalizzata.