Excluir slide de uma apresentação
Este tópico mostra como usar o SDK Open XML para Office para excluir um slide de uma apresentação de forma programática. Ele também mostra como excluir todas as referências ao slide de todos os shows personalizados que possam existir. Para excluir um slide específico em um arquivo de apresentação, você precisa saber primeiro o número de slides na apresentação. Portanto, o código neste how-to é dividido em duas partes. O primeiro está contando o número de slides e o segundo está excluindo um slide em um índice específico.
Observação
Excluir um slide de apresentações mais complexas, como aquelas que contêm configurações de exibição de contorno, por exemplo, pode exigir etapas adicionais.
Obtendo um objeto de apresentação
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 uma das sobrecargas do método Open . O código neste tópico usa o método PresentationDocument.Open(String, Boolean), que usa um caminho de arquivo como o primeiro parâmetro para especificar o arquivo a ser aberto e um valor booliano como o segundo parâmetro para especificar se um documento é editável. Defina este segundo parâmetro como false para abrir o arquivo para acesso somente leitura ou true se você quiser abrir o arquivo para acesso de leitura/gravação. O código neste tópico abre o arquivo duas vezes, uma vez para contar o número de slides e uma vez para excluir um slide específico. Quando você conta o número de slides em uma apresentação, é melhor abrir o arquivo para acesso somente leitura para proteger o arquivo contra gravação acidental. A instrução de uso a seguir abre o arquivo para acesso somente leitura. Neste exemplo de 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.
}
Para excluir um slide do arquivo de apresentação, abra-o para acesso de leitura/gravação, conforme mostrado na instrução de uso a seguir.
// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
// Place 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. |
Contando o número de slides
O código de exemplo consiste em duas sobrecargas do método CountSlides . A primeira sobrecarga usa um parâmetro de cadeia de caracteres e a segunda sobrecarga usa um parâmetro PresentationDocument . No primeiro método CountSlides , o código de exemplo abre o documento de apresentação na instrução usando . Em seguida, ele passa o objeto PresentationDocument para o segundo método CountSlides , que retorna um número inteiro que representa o número de slides na apresentação.
// Pass the presentation to the next CountSlides method
// and return the slide count.
return CountSlides(presentationDocument);
No segundo método CountSlides , o código verifica se o objeto PresentationDocument passado não é nulo e, se não for, ele obtém um objeto PresentationPart do objeto PresentationDocument . Usando o SlideParts, o código obtém o slideCount e o retorna.
// Check for a null document object.
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
int slidesCount = 0;
// Get the presentation part of document.
PresentationPart presentationPart = presentationDocument.PresentationPart;
// Get the slide count from the SlideParts.
if (presentationPart != null)
{
slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
Excluindo um slide específico
O código para excluir um slide usa duas sobrecargas do método DeleteSlide . O primeiro método DeleteSlide sobrecarregado usa dois parâmetros: uma cadeia de caracteres que representa o nome e o caminho do arquivo de apresentação e um inteiro que representa a posição de índice baseada em zero do slide a ser excluído. Ele abre o arquivo de apresentação para acesso de leitura/gravação, obtém um objeto PresentationDocument e, em seguida, passa esse objeto e o número de índice para o próximo método DeleteSlide sobrecarregado, que executa a exclusão.
// Get the presentation object and pass it to the next DeleteSlide method.
public static void DeleteSlide(string presentationFile, int slideIndex)
{
// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
// Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
DeleteSlide(presentationDocument, slideIndex);
}
}
A primeira seção do segundo método DeleteSlide sobrecarregado usa o método CountSlides para obter o número de slides na apresentação. Em seguida, ele obtém a lista de IDs de slides na apresentação, identifica o slide especificado na lista de slides e remove o slide da lista de slides.
// Delete the specified slide from the presentation.
public static void DeleteSlide(PresentationDocument presentationDocument, int slideIndex)
{
if (presentationDocument == null)
{
throw new ArgumentNullException("presentationDocument");
}
// Use the CountSlides sample to get the number of slides in the presentation.
int slidesCount = CountSlides(presentationDocument);
if (slideIndex < 0 || slideIndex >= slidesCount)
{
throw new ArgumentOutOfRangeException("slideIndex");
}
// Get the presentation part from the presentation document.
PresentationPart presentationPart = presentationDocument.PresentationPart;
// Get the presentation from the presentation part.
Presentation presentation = presentationPart.Presentation;
// Get the list of slide IDs in the presentation.
SlideIdList slideIdList = presentation.SlideIdList;
// Get the slide ID of the specified slide
SlideId slideId = slideIdList.ChildElements[slideIndex] as SlideId;
// Get the relationship ID of the slide.
string slideRelId = slideId.RelationshipId;
// Remove the slide from the slide list.
slideIdList.RemoveChild(slideId);
A próxima seção do segundo método DeleteSlide sobrecarregado remove todas as referências ao slide excluído de shows personalizados. Ele faz isso iterando pela lista de shows personalizados e pela lista de slides em cada show personalizado. Em seguida, ele declara e instancia uma lista vinculada de entradas de lista de slides e localiza referências ao slide excluído usando a ID de relação desse slide. Ele adiciona essas referências à lista de entradas de lista de slides e, em seguida, remove cada referência desse tipo da lista de slides de sua respectiva mostra personalizada.
// Remove references to the slide from all custom shows.
if (presentation.CustomShowList != null)
{
// Iterate through the list of custom shows.
foreach (var customShow in presentation.CustomShowList.Elements<CustomShow>())
{
if (customShow.SlideList != null)
{
// Declare a link list of slide list entries.
LinkedList<SlideListEntry> slideListEntries = new LinkedList<SlideListEntry>();
foreach (SlideListEntry slideListEntry in customShow.SlideList.Elements())
{
// Find the slide reference to remove from the custom show.
if (slideListEntry.Id != null && slideListEntry.Id == slideRelId)
{
slideListEntries.AddLast(slideListEntry);
}
}
// Remove all references to the slide from the custom show.
foreach (SlideListEntry slideListEntry in slideListEntries)
{
customShow.SlideList.RemoveChild(slideListEntry);
}
}
}
}
Por fim, o código salva a apresentação modificada e exclui a parte do slide do slide excluído.
// Save the modified presentation.
presentation.Save();
// Get the slide part for the specified slide.
SlidePart slidePart = presentationPart.GetPartById(slideRelId) as SlidePart;
// Remove the slide part.
presentationPart.DeletePart(slidePart);
}
Código de exemplo
A seguir está o código de exemplo completo para os dois métodos sobrecarregados, CountSlides e DeleteSlide. Para usar o código, você pode usar a chamada a seguir como um exemplo para excluir o slide no índice 2 no arquivo de apresentação "Myppt6.pptx".
DeleteSlide(@"C:\Users\Public\Documents\Myppt6.pptx", 2);
Você também pode usar a chamada a seguir para contar o número de slides na apresentação.
Console.WriteLine("Number of slides = {0}",
CountSlides(@"C:\Users\Public\Documents\Myppt6.pptx"));
Pode ser uma boa ideia contar o número de slides antes e depois de executar a exclusão.
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;
CountSlides(args[0]);
// Get the presentation object and pass it to the next CountSlides method.
static int CountSlides(string presentationFile)
{
// Open the presentation as read-only.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, false))
{
// Pass the presentation to the next CountSlide method
// and return the slide count.
return CountSlidesFromPresentation(presentationDocument);
}
}
// Count the slides in the presentation.
static int CountSlidesFromPresentation(PresentationDocument presentationDocument)
{
int slidesCount = 0;
// Get the presentation part of document.
PresentationPart presentationPart = presentationDocument.PresentationPart ?? presentationDocument.AddPresentationPart();
// Get the slide count from the SlideParts.
if (presentationPart is not null)
{
slidesCount = presentationPart.SlideParts.Count();
}
// Return the slide count to the previous method.
return slidesCount;
}
//
// Get the presentation object and pass it to the next DeleteSlide method.
static void DeleteSlide(string presentationFile, int slideIndex)
{
// Open the source document as read/write.
using (PresentationDocument presentationDocument = PresentationDocument.Open(presentationFile, true))
{
// Pass the source document and the index of the slide to be deleted to the next DeleteSlide method.
DeleteSlideFromPresentation(presentationDocument, slideIndex);
}
}
// Delete the specified slide from the presentation.
static void DeleteSlideFromPresentation(PresentationDocument presentationDocument, int slideIndex)
{
if (presentationDocument is null)
{
throw new ArgumentNullException("presentationDocument");
}
// Use the CountSlides sample to get the number of slides in the presentation.
int slidesCount = CountSlidesFromPresentation(presentationDocument);
if (slideIndex < 0 || slideIndex >= slidesCount)
{
throw new ArgumentOutOfRangeException("slideIndex");
}
// Get the presentation part from the presentation document.
PresentationPart? presentationPart = presentationDocument.PresentationPart;
// Get the presentation from the presentation part.
Presentation? presentation = presentationPart?.Presentation;
// Get the list of slide IDs in the presentation.
SlideIdList? slideIdList = presentation?.SlideIdList;
// Get the slide ID of the specified slide
SlideId? slideId = slideIdList?.ChildElements[slideIndex] as SlideId;
// Get the relationship ID of the slide.
string? slideRelId = slideId?.RelationshipId;
// If there's no relationship ID, there's no slide to delete.
if (slideRelId is null)
{
return;
}
// Remove the slide from the slide list.
slideIdList!.RemoveChild(slideId);
//
// Remove references to the slide from all custom shows.
if (presentation!.CustomShowList is not null)
{
// Iterate through the list of custom shows.
foreach (var customShow in presentation.CustomShowList.Elements<CustomShow>())
{
if (customShow.SlideList is not null)
{
// Declare a link list of slide list entries.
LinkedList<SlideListEntry> slideListEntries = new LinkedList<SlideListEntry>();
foreach (SlideListEntry slideListEntry in customShow.SlideList.Elements())
{
// Find the slide reference to remove from the custom show.
if (slideListEntry.Id is not null && slideListEntry.Id == slideRelId)
{
slideListEntries.AddLast(slideListEntry);
}
}
// Remove all references to the slide from the custom show.
foreach (SlideListEntry slideListEntry in slideListEntries)
{
customShow.SlideList.RemoveChild(slideListEntry);
}
}
}
}
// Save the modified presentation.
presentation.Save();
// Get the slide part for the specified slide.
SlidePart slidePart = (SlidePart)presentationPart!.GetPartById(slideRelId);
// Remove the slide part.
presentationPart.DeletePart(slidePart);
}