Recuperar y actualizar información de la presentación en C++
Visión general
Aspose.Slides puede identificar el formato de una presentación y leer sus metadatos de documento sin crear un modelo de objetos de presentación completo. Esto resulta útil cuando necesita clasificar archivos, crear un inventario o inspeccionar propiedades antes de decidir si cargar y procesar el contenido de la presentación.
Este artículo muestra una inspección ligera a través de PresentationFactory y IPresentationInfo, así como actualizaciones específicas mediante IDocumentProperties.
Comprobar el formato de una presentación
Si ya tiene una presentación cargada, vea Determine the Original Presentation Format para la detección después de cargar y las limitaciones de los flujos heredados PPT, PPS y POT.
Utilice IPresentationFactory::GetPresentationInfo para inspeccionar un archivo sin crear una instancia de Presentation. El método IPresentationInfo::get_LoadFormat informa del formato detectado, como PPTX, PPT o ODP.
#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <LoadFormat.h>
#include <system/array.h>
#include <system/console.h>
#include <system/object_ext.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace System;
auto fileNames = MakeArray<String>({u"pres.pptx", u"pres.ppt", u"pres.odp"});
for (const auto& fileName : fileNames)
{
auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(fileName);
Console::WriteLine(String::Format(u"{0}: {1}", fileName, ObjectExt::ToString(presentationInfo->get_LoadFormat())));
}
Crear un inventario ligero de presentaciones
Cuando procesa muchos archivos de presentación, puede necesitar un inventario compacto para validación, indexado o un sistema de gestión documental. En este escenario, utilice IPresentationFactory::GetPresentationInfo para obtener un objeto IPresentationInfo y, a continuación, llame a IPresentationInfo::ReadDocumentProperties para leer los metadatos del documento. Este enfoque no crea una instancia de Presentation ni requiere que recorra todo el modelo de objetos de la presentación.
Las propiedades extendidas expuestas por IDocumentProperties proporcionan los siguientes valores de inventario:
| Método | Valor del inventario |
|---|---|
| get_Slides | Número total de diapositivas. |
| get_HiddenSlides | Número de diapositivas ocultas. |
| get_Notes | Número de diapositivas que contienen notas. |
| get_Paragraphs | Número total de párrafos, cuando estén disponibles. |
| get_Words | Número total de palabras. |
| get_MultimediaClips | Número total de clips de audio y vídeo. |
El siguiente ejemplo lee estos valores sin crear un objeto Presentation e imprime un inventario compacto. También combina IDocumentProperties::get_HeadingPairs con IDocumentProperties::get_TitlesOfParts para mostrar grupos de contenido como fuentes, temas y títulos de diapositivas.
#include <DOM/IDocumentProperties.h>
#include <DOM/IHeadingPair.h>
#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <LoadFormat.h>
#include <system/console.h>
#include <system/io/path.h>
#include <system/object_ext.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace System;
using namespace System::IO;
auto filePath = String(u"sample.pptx");
auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(filePath);
auto documentProperties = presentationInfo->ReadDocumentProperties();
Console::WriteLine(String::Format(u"File: {0}", Path::GetFileName(filePath)));
Console::WriteLine(String::Format(u"Format: {0}", ObjectExt::ToString(presentationInfo->get_LoadFormat())));
Console::WriteLine(String::Format(u"Title: {0}", documentProperties->get_Title()));
Console::WriteLine(String::Format(u"Author: {0}", documentProperties->get_Author()));
Console::WriteLine(u"Statistics:");
Console::WriteLine(String::Format(u" Slides: {0}", documentProperties->get_Slides()));
Console::WriteLine(String::Format(u" Hidden slides: {0}", documentProperties->get_HiddenSlides()));
Console::WriteLine(String::Format(u" Slides with notes: {0}", documentProperties->get_Notes()));
Console::WriteLine(String::Format(u" Paragraphs: {0}", documentProperties->get_Paragraphs()));
Console::WriteLine(String::Format(u" Words: {0}", documentProperties->get_Words()));
Console::WriteLine(String::Format(u" Multimedia clips: {0}", documentProperties->get_MultimediaClips()));
auto headingPairs = documentProperties->get_HeadingPairs();
auto titlesOfParts = documentProperties->get_TitlesOfParts();
auto partIndex = 0;
if (headingPairs == nullptr || titlesOfParts == nullptr || headingPairs->get_Length() == 0 || titlesOfParts->get_Length() == 0)
{
Console::WriteLine(u"Content groups: not available");
}
else
{
Console::WriteLine(u"Content groups:");
for (const auto& headingPair : headingPairs)
{
auto partCount = headingPair->get_Count();
Console::WriteLine(String::Format(u" {0} ({1})", headingPair->get_Name(), partCount));
for (auto partOffset = 0; partOffset < partCount && partIndex < titlesOfParts->get_Length(); partOffset++)
{
Console::WriteLine(String::Format(u" - {0}", titlesOfParts[partIndex]));
partIndex++;
}
}
if (partIndex < titlesOfParts->get_Length())
{
Console::WriteLine(u" Other parts:");
while (partIndex < titlesOfParts->get_Length())
{
Console::WriteLine(String::Format(u" - {0}", titlesOfParts[partIndex]));
partIndex++;
}
}
}
Cada IHeadingPair proporciona un nombre de grupo mediante IHeadingPair::get_Name y el número de elementos en ese grupo mediante IHeadingPair::get_Count. IDocumentProperties::get_TitlesOfParts devuelve una matriz plana y ordenada, por lo que se consumen la cantidad de títulos consecutivos especificada por cada pareja de encabezado.
Metadatos almacenados y limitaciones de formato
Las propiedades de inventario devueltas por IPresentationInfo::ReadDocumentProperties reflejan los metadatos disponibles en el documento origen. Aspose.Slides no carga ni recorre el modelo de objetos de la presentación para recalcular estos valores en esta llamada. Las propiedades ausentes se representan con valores predeterminados, y los valores almacenados pueden estar desactualizados si la aplicación que guardó el archivo por última vez no actualizó sus propiedades de documento.
- PPTX: El formato proporciona propiedades de documento extendidas para recuentos de diapositivas, notas, diapositivas ocultas, párrafos, palabras y elementos multimedia, así como parejas de encabezado y títulos de partes. La disponibilidad depende de qué propiedades haya escrito el productor del documento.
- PPT: El formato binario puede almacenar propiedades de resumen de documento correspondientes. Si una propiedad está ausente o no fue actualizada por el productor del documento, Aspose.Slides devuelve su valor almacenado o predeterminado en lugar de calcularlo a partir de las diapositivas.
- ODP: Los metadatos de OpenDocument proporcionan estadísticas generales del documento, como recuentos de páginas, párrafos y palabras, pero esos valores no se asignan a todas las propiedades extendidas específicas de PowerPoint. Los metadatos de diapositivas ocultas, notas, multimedia, parejas de encabezado y títulos de partes pueden no estar disponibles, y las propiedades de inventario pueden devolver valores predeterminados. No considere que un valor cero o una matriz vacía sea prueba definitiva de que el contenido correspondiente está ausente.
Utilice el enfoque de metadatos ligeros para inventarios y comprobaciones preliminares. Cargue la presentación e inspeccione su modelo de objetos en tiempo real cuando el resultado deba reflejar cambios en memoria o cuando necesite verificar el contenido real de la presentación.
Actualizar propiedades de la presentación
Las propiedades devueltas por IPresentationInfo::ReadDocumentProperties también pueden modificarse sin crear una instancia de Presentation. Aplique los cambios con IPresentationInfo::UpdateDocumentProperties, y a continuación escriba la presentación vinculada con IPresentationInfo::WriteBindedPresentation.
La siguiente imagen muestra las propiedades originales del documento de la presentación PowerPoint.

El siguiente ejemplo cambia el título y la hora de la última guardada y escribe el resultado en un archivo nuevo:
#include <DOM/IDocumentProperties.h>
#include <DOM/IPresentationInfo.h>
#include <DOM/PresentationFactory.h>
#include <system/date_time.h>
#include <system/string.h>
using namespace Aspose::Slides;
using namespace System;
auto sourceFile = String(u"sample.pptx");
auto outputFile = String(u"sample_with_updated_properties.pptx");
auto presentationInfo = PresentationFactory::get_Instance()->GetPresentationInfo(sourceFile);
auto documentProperties = presentationInfo->ReadDocumentProperties();
documentProperties->set_Title(u"Quarterly sales report");
documentProperties->set_LastSavedTime(DateTime::get_UtcNow());
presentationInfo->UpdateDocumentProperties(documentProperties);
presentationInfo->WriteBindedPresentation(outputFile);
La siguiente imagen muestra las propiedades modificadas del documento de la presentación PowerPoint.

Enlaces útiles
Para comprobaciones de seguridad relacionadas y configuraciones de protección, consulte los siguientes artículos:
Preguntas frecuentes
¿Cómo puedo comprobar si las fuentes están incrustadas y cuáles son?
Cargue la presentación y utilice Presentation::get_FontsManager. Llame a FontsManager::GetEmbeddedFonts para obtener las fuentes incrustadas y a FontsManager::GetFonts para obtener las fuentes usadas por la presentación. Compare los dos resultados para encontrar fuentes que son necesarias para la renderización pero que no están incrustadas.
¿Cómo puedo saber rápidamente si el archivo tiene diapositivas ocultas y cuántas?
Cuando los metadatos almacenados del documento son suficientes, lea IDocumentProperties::get_HiddenSlides a través de IPresentationFactory::GetPresentationInfo y IPresentationInfo::ReadDocumentProperties. Esto es adecuado para un inventario ligero. Si la presentación se ha modificado en memoria, los metadatos almacenados pueden estar ausentes o desactualizados, o necesita verificar valores en tiempo real, itere a través de Presentation::get_Slides y examine el método Slide::get_Hidden de cada diapositiva.
¿Puedo detectar si se usa un tamaño y orientación de diapositiva personalizados, y si difieren de los valores predeterminados?
Sí. Cargue la presentación y lea Presentation::get_SlideSize. Inspeccione ISlideSize::get_Type, ISlideSize::get_Size y ISlideSize::get_Orientation para comparar la configuración actual con los valores predefinidos y dimensiones esperadas.
¿Existe una manera rápida de ver si los gráficos hacen referencia a fuentes de datos externas?
Sí. Localice cada Chart e inspeccione ChartData::get_DataSourceType. Para un libro de trabajo externo, lea ChartData::get_ExternalWorkbookPath. El tipo de fuente de datos y la ruta identifican una referencia externa, pero verificar si el objetivo está disponible requiere una comprobación de recursos independiente.
¿Cómo puedo evaluar las diapositivas ‘pesadas’ que pueden ralentizar la renderización o la exportación a PDF?
No existe una única propiedad de complejidad. Recorra Presentation::get_Slides y la colección IBaseSlide::get_Shapes de cada diapositiva. Utilice el recuento de formas y la presencia de imágenes grandes, efectos, animaciones o elementos multimedia como señales de filtrado, y mida una renderización o exportación representativa antes de considerar una diapositiva como un cuello de botella de rendimiento confirmado.