Obtener los títulos de todas las diapositivas de una presentación
En este tema se muestra cómo usar las clases del SDK de Open XML para Office para obtener los títulos de todas las diapositivas de una presentación mediante programación.
Obtención de un objeto PresentationDocument
En el SDK de Open XML, la PresentationDocument clase representa un paquete de documento de presentación. Para trabajar con un documento de presentación, cree primero una instancia de la PresentationDocument
clase y, a continuación, trabaje con esa instancia. Para crear la instancia de clase a partir del documento, llame al Open método que usa una ruta de acceso de archivo y a un valor booleano como segundo parámetro para especificar si un documento es editable. Para abrir un documento de solo lectura, especifique el valor false
de este parámetro como se muestra en la instrucción siguiente using
. En este código, el presentationFile
parámetro es una cadena que representa la ruta de acceso del archivo desde el que desea abrir el documento.
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
Con v3.0.0+ el Close() método se ha quitado en favor de confiar en la instrucción using.
Esto garantiza que se llama automáticamente al Dispose() método cuando se alcanza la llave de cierre. El bloque que sigue a la using
instrucción establece un ámbito para el objeto que se crea o se denomina en la using
instrucción , en este caso presentationDocument
.
Estructura básica de un documento de presentación
La estructura básica de un PresentationML
documento consta de varias partes, entre las que se encuentra la parte principal que contiene la definición de presentación. El siguiente texto de la especificación ISO/IEC 29500 presenta la forma general de un PresentationML
paquete.
La parte principal de un
PresentationML
paquete comienza con un elemento raíz de presentación. Dicho elemento contiene una presentación que, a su vez, hace referencia a una lista de diapositivas, a otra de patrones de diapositivas, a otra de patrones de notas y a otra de patrones de documentos. La lista de diapositivas hace referencia a todas las diapositivas de la presentación, la de patrones de diapositivas a todos los patrones de diapositivas que se han usado en la presentación, el patrón de notas contiene información acerca del formato de las páginas de notas y el patrón de documentos describe la apariencia de los documentos.Un documento es un conjunto impreso de diapositivas que se pueden proporcionar a un público.
Al igual que el texto y los gráficos, cada diapositiva puede incluir comentarios y notas, tener un diseño y formar parte de una o varias presentaciones personalizadas. Un comentario es una anotación dirigida a la persona que se encarga del mantenimiento de las diapositivas de la presentación. Una nota es un aviso o texto dirigido al moderador o al público.
Otras características que un
PresentationML
documento puede incluir son las siguientes: animación, audio, vídeo y transiciones entre diapositivas .Un
PresentationML
documento no se almacena como un cuerpo grande en una sola parte. En su lugar, los elementos que implementan ciertas agrupaciones de funcionalidades se almacenan en partes independientes. Por ejemplo, todos los autores de un documento se almacenan en una parte de autores mientras que cada diapositiva tiene su propia parte.ISO/IEC 29500: 2016
El siguiente ejemplo de código XML representa una presentación que contiene dos diapositivas denotadas por los identificadores 267 y 256.
<p:presentation xmlns:p="…" … >
<p:sldMasterIdLst>
<p:sldMasterId
xmlns:rel="https://…/relationships" rel:id="rId1"/>
</p:sldMasterIdLst>
<p:notesMasterIdLst>
<p:notesMasterId
xmlns:rel="https://…/relationships" rel:id="rId4"/>
</p:notesMasterIdLst>
<p:handoutMasterIdLst>
<p:handoutMasterId
xmlns:rel="https://…/relationships" rel:id="rId5"/>
</p:handoutMasterIdLst>
<p:sldIdLst>
<p:sldId id="267"
xmlns:rel="https://…/relationships" rel:id="rId2"/>
<p:sldId id="256"
xmlns:rel="https://…/relationships" rel:id="rId3"/>
</p:sldIdLst>
<p:sldSz cx="9144000" cy="6858000"/>
<p:notesSz cx="6858000" cy="9144000"/>
</p:presentation>
Con el SDK de Open XML, puede crear contenido y estructura de documentos mediante clases fuertemente tipadas que corresponden a elementos PresentationML. Puede encontrar estas clases en el espacio de DocumentFormat.OpenXml.Presentation nombres. En la tabla siguiente se enumeran los nombres de clase de las clases correspondientes a los sld
elementos , sldLayout
, sldMaster
y notesMaster
.
Elemento de PresentationML | Open XML SDK (clase) | Descripción |
---|---|---|
<sld/> |
Slide | Diapositiva de presentación. Es el elemento raíz de SlidePart. |
<sldLayout/> |
SlideLayout | Diseño de la diapositiva. Es el elemento raíz de SlideLayoutPart. |
<sldMaster/> |
SlideMaster | Patrón de diapositivas. Es el elemento raíz de SlideMasterPart. |
<notesMaster/> |
NotesMaster | Patrón de notas (o handoutMaster). Es el elemento raíz de NotesMasterPart. |
Código de ejemplo
El código de ejemplo siguiente obtiene todos los títulos de las diapositivas de un archivo de presentación. Por ejemplo, puede usar la siguiente foreach
instrucción en el programa para devolver todos los títulos del archivo de presentación ubicado en el primer argumento.
foreach(string title in GetSlideTitles(args[0]))
{
Console.WriteLine(title);
}
El resultado será una lista de las cadenas que representan los títulos de la presentación, cada uno en una línea independiente.
A continuación se incluye el código de ejemplo completo en C# y Visual Basic.
// Get a list of the titles of all the slides in the presentation.
static IList<string> GetSlideTitles(string presentationFile)
{
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
IList<string>? titles = GetSlideTitlesFromPresentation(presentationDocument);
return (IList<string>)(titles ?? Enumerable.Empty<string>());
}
}
// Get a list of the titles of all the slides in the presentation.
static IList<string>? GetSlideTitlesFromPresentation(PresentationDocument presentationDocument)
{
// Get a PresentationPart object from the PresentationDocument object.
PresentationPart? presentationPart = presentationDocument.PresentationPart;
if (presentationPart is not null && presentationPart.Presentation is not null)
{
// Get a Presentation object from the PresentationPart object.
Presentation presentation = presentationPart.Presentation;
if (presentation.SlideIdList is not null)
{
List<string> titlesList = new List<string>();
// Get the title of each slide in the slide order.
foreach (var slideId in presentation.SlideIdList.Elements<SlideId>())
{
if (slideId.RelationshipId is null)
{
continue;
}
SlidePart slidePart = (SlidePart)presentationPart.GetPartById(slideId.RelationshipId!);
// Get the slide title.
string title = GetSlideTitle(slidePart);
// An empty title can also be added.
titlesList.Add(title);
}
return titlesList;
}
}
return null;
}
// Get the title string of the slide.
static string GetSlideTitle(SlidePart slidePart)
{
if (slidePart is null)
{
throw new ArgumentNullException("presentationDocument");
}
// Declare a paragraph separator.
string? paragraphSeparator = null;
if (slidePart.Slide is not null)
{
// Find all the title shapes.
var shapes = from shape in slidePart.Slide.Descendants<Shape>()
where IsTitleShape(shape)
select shape;
StringBuilder paragraphText = new StringBuilder();
foreach (var shape in shapes)
{
var paragraphs = shape.TextBody?.Descendants<D.Paragraph>();
if (paragraphs is null)
{
continue;
}
// Get the text in each paragraph in this shape.
foreach (var paragraph in paragraphs)
{
// Add a line break.
paragraphText.Append(paragraphSeparator);
foreach (var text in paragraph.Descendants<D.Text>())
{
paragraphText.Append(text.Text);
}
paragraphSeparator = "\n";
}
}
return paragraphText.ToString();
}
return string.Empty;
}
// Determines whether the shape is a title shape.
static bool IsTitleShape(Shape shape)
{
PlaceholderShape? placeholderShape = shape.NonVisualShapeProperties?.ApplicationNonVisualDrawingProperties?.GetFirstChild<PlaceholderShape>();
if (placeholderShape is not null && placeholderShape.Type is not null && placeholderShape.Type.HasValue)
{
return placeholderShape.Type == PlaceholderValues.Title || placeholderShape.Type == PlaceholderValues.CenteredTitle;
}
return false;
}