Obter todos os títulos de todos os slides de uma apresentação
Este tópico mostra como usar as classes no SDK do Open XML para Office para obter os títulos de todos os slides em uma apresentação de forma programática.
Obtendo um objeto PresentationDocument
No SDK do Open XML, a classe PresentationDocument representa um pacote de documento de apresentação. Para trabalhar com um documento de apresentação, primeiro crie uma instância da classe PresentationDocument e trabalhe com essa instância. Para criar a instância de classe a partir do documento, chame o método PresentationDocument.Open(String, Boolean) que usa um caminho de arquivo e um valor booliano como o segundo parâmetro para especificar se um documento é editável. Para abrir um documento somente leitura, especifique o valor false para esse parâmetro, conforme mostrado na instrução de uso a seguir. Neste código, o parâmetro presentationFile é uma cadeia de caracteres que representa o caminho para o arquivo do qual você deseja abrir o documento.
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
// Insert other code here.
}
A instrução using fornece uma alternativa recomendada para a sequência típica de .Open, .Save e .Close. Ela garante que o método Dispose (método interno usado pelo SDK do Open XML para limpar recursos) seja chamado automaticamente quando a chave de fechamento for atingida. O bloco que segue a instrução de uso estabelece um escopo para o objeto que é criado ou nomeado na instrução usando , nesse caso , presentationDocument.
Estrutura básica do documento de apresentação
A estrutura básica do documento de um documento PresentationML consiste em várias partes, entre elas a main parte que contém a definição de apresentação. O texto a seguir da especificação ISO/IEC 29500 apresenta a forma geral de um pacote PresentationML .
A main parte de um pacote PresentationML começa com um elemento raiz de apresentação. Esse elemento contém uma apresentação que, por sua vez, se refere a uma lista de slides, uma lista de master de slides, uma lista de master de anotações e uma lista de master de apostila. A lista de slides refere-se a todos os slides na apresentação; A lista de master de slides refere-se a todos os mestres de slides usados na apresentação; as anotações master contém informações sobre a formatação de páginas de anotações; e a apostila master descreve como uma apostila parece.
Uma apostila é um conjunto impresso de slides que pode ser fornecido a uma audiência.
Além de texto e gráficos, cada slide pode conter comentários e anotações, pode ter um layout e pode fazer parte de uma ou mais apresentações personalizadas. Um comentário é uma anotação destinada à pessoa que mantém o deck de slides de apresentação. Uma nota é um lembrete ou um pedaço de texto destinado ao apresentador ou ao público-alvo.
Outros recursos que um documento PresentationML pode incluir o seguinte: animação, áudio, vídeo e transições entre slides.
Um documento PresentationML não é armazenado como um corpo grande em uma única parte. Em vez disso, os elementos que implementam determinados agrupamentos de funcionalidade são armazenados em partes separadas. Por exemplo, todos os comentários em um documento são armazenados em uma parte de comentário, enquanto cada slide tem sua própria parte.
© ISO/IEC29500: 2008.
O exemplo de código XML a seguir representa uma apresentação que contém dois slides denotados pelas IDs 267 e 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>
Usando o SDK do Open XML, você pode criar estrutura de documentos e conteúdo usando classes fortemente tipdas que correspondem a elementos PresentationML. Você pode encontrar essas classes no namespace DocumentFormat.OpenXml.Presentation . A tabela a seguir lista os nomes de classe das classes que correspondem aos elementos sld, sldLayout, sldMaster e notesMaster .
Elemento PresentationML | Classe SDK Open XML | Descrição |
---|---|---|
Sld | Slide | Slide de Apresentação. É o elemento raiz do SlidePart. |
sldLayout | SlideLayout | Layout do Slide. É o elemento raiz do SlideLayoutPart. |
sldMaster | SlideMaster | Mestre de Slides. É o elemento raiz do SlideMasterPart. |
notesMaster | NotesMaster | Mestre de Anotações (ou handoutMaster). É o elemento raiz do NotesMasterPart. |
Código de exemplo
A seguir está o código de exemplo completo que você pode usar para obter os títulos dos slides em um arquivo de apresentação. Por exemplo, você pode usar a seguinte instrução foreach em seu programa para retornar todos os títulos no arquivo de apresentação, "Myppt9.pptx".
foreach (string s in GetSlideTitles(@"C:\Users\Public\Documents\Myppt9.pptx"))
Console.WriteLine(s);
O resultado seria uma lista das cadeias de caracteres que representam os títulos na apresentação, cada uma em uma linha separada.
A seguir está o código de exemplo completo em C# e em Visual Basic.
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Presentation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using D = DocumentFormat.OpenXml.Drawing;
GetSlideTitles(args[0]);
// 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))
{
return GetSlideTitlesFromPresentation(presentationDocument);
}
}
// 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;
}