Obter todos os hiperlinks externos de uma apresentação
Este tópico mostra como usar as classes no SDK Do Open XML para Office para obter todos os hiperlinks externos 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. 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. Neste tópico, é 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 segmento de código, o parâmetro fileName é uma cadeia de caracteres que representa o caminho para o arquivo do qual você deseja abrir o documento.
// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, 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 de uso , neste caso documento.
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. |
Estrutura do Elemento Hyperlink
Neste exemplo de código de instruções, você trabalhará com hiperlinks externos. Portanto, é melhor se familiarizar com o elemento hiperlink. O texto a seguir da especificação ISO/IEC 29500 apresenta a id (Hyperlink Target).
Especifica a ID da relação cujo destino deve ser usado como destino para estehyperlink.
Se esse atributo for omitido, não haverá nenhum destino de hiperlink externo para o hiperlink atual – um local no documento atual ainda pode ser alvo por meio do atributo de âncora. Se esse atributo existir, ele substituirá o valor no atributo de âncora.
[Exemplo: considere o seguinte Fragmento PresentationML** para um hiperlink:
<w:hyperlink r:id="rId9">
<w:r>
<w:t>https://www.example.com</w:t>
</w:r>
</w:hyperlink>
O valor do atributo id do rId9 especifica que a relação no item da parte de relação associada com um valor de atributo Id correspondente deve ser navegada quando esse hiperlink é invocado. Por exemplo, se o XML a seguir estiver presente no item da parte de relação associada:
<Relationships xmlns="…">
<Relationship Id="rId9" Mode="External"
Target=https://www.example.com />
</Relationships>
O destino desse hiperlink seria, portanto, o destino da relação rId9 – nesse caso, https://www.example.com. exemplo final]
Os valores possíveis para esse atributo são definidos pelo tipo ST_RelationshipId simples(§22.8.2.1).
© ISO/IEC29500: 2008.
Como funciona o código de exemplo
O código de exemplo neste tópico consiste em um método que usa como parâmetro o caminho completo do arquivo de apresentação. Ele itera todos os slides na apresentação e retorna uma lista de cadeias de caracteres que representam as URIs (Universal Resource Identifiers) de todos os hiperlinks externos na apresentação.
// Iterate through all the slide parts in the presentation part.
foreach (SlidePart slidePart in document.PresentationPart.SlideParts)
{
IEnumerable<Drawing.HyperlinkType> links = slidePart.Slide.Descendants<Drawing.HyperlinkType>();
// Iterate through all the links in the slide part.
foreach (Drawing.HyperlinkType link in links)
{
// Iterate through all the external relationships in the slide part.
foreach (HyperlinkRelationship relation in slidePart.HyperlinkRelationships)
{
// If the relationship ID matches the link ID…
if (relation.Id.Equals(link.Id))
{
// Add the URI of the external relationship to the list of strings.
ret.Add(relation.Uri.AbsoluteUri);
}
Código de exemplo
A seguir está o exemplo de código completo que você pode usar para retornar a lista de todos os links externos em uma apresentação. Você pode usar o loop a seguir em seu programa para chamar o método GetAllExternalHyperlinksInPresentation para obter a lista de URIs em sua apresentação.
string fileName = @"C:\Users\Public\Documents\Myppt7.pptx";
foreach (string s in GetAllExternalHyperlinksInPresentation(fileName))
Console.WriteLine(s);
using DocumentFormat.OpenXml.Packaging;
using System;
using System.Collections.Generic;
using Drawing = DocumentFormat.OpenXml.Drawing;
GetAllExternalHyperlinksInPresentation(args[0]);
// Returns all the external hyperlinks in the slides of a presentation.
static IEnumerable<String> GetAllExternalHyperlinksInPresentation(string fileName)
{
// Declare a list of strings.
List<string> ret = new List<string>();
// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, false))
{
// If there is no PresentationPart then there are no hyperlinks
if (document.PresentationPart is null)
{
return ret;
}
// Iterate through all the slide parts in the presentation part.
foreach (SlidePart slidePart in document.PresentationPart.SlideParts)
{
IEnumerable<Drawing.HyperlinkType> links = slidePart.Slide.Descendants<Drawing.HyperlinkType>();
// Iterate through all the links in the slide part.
foreach (Drawing.HyperlinkType link in links)
{
// Iterate through all the external relationships in the slide part.
foreach (HyperlinkRelationship relation in slidePart.HyperlinkRelationships)
{
// If the relationship ID matches the link ID…
if (relation.Id.Equals(link.Id))
{
// Add the URI of the external relationship to the list of strings.
ret.Add(relation.Uri.AbsoluteUri);
}
}
}
}
}
// Return the list of strings.
return ret;
}