Compartir a través de


Obtener todos los hipervínculos externos de una presentación

En este tema se muestra cómo usar las clases del SDK de Open XML para Office para obtener todos los hipervínculos externos 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. Establezca este segundo parámetro false en para abrir el archivo para el acceso de solo lectura o true si desea abrir el archivo para el acceso de lectura y escritura. En este tema, es mejor abrir el archivo para acceso de solo lectura para protegerlo contra escrituras accidentales. La instrucción siguiente using abre el archivo para el acceso de solo lectura. En este segmento de código, el fileName parámetro es una cadena que representa la ruta de acceso del archivo desde el que desea abrir el documento.

// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, 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 document.


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 sldelementos , sldLayout, sldMastery 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.

En este ejemplo de código de procedimiento, se trabaja con hipervínculos externos. Por este motivo, se recomienda que se familiarice con el elemento hyperlink. El texto siguiente de la especificación ISO/IEC 29500 presenta (Destino de id hipervínculo).

Especifica el identificador de la relación cuyo destino se usará como destino de este hipervínculo.

Si se omite este atributo, no habrá ningún destino de hipervínculo externo para el hipervínculo actual; una ubicación en el documento actual aún puede ser el destino a través del atributo de delimitador. Si existe este atributo, sustituirá al valor del atributo de delimitador.

[Ejemplo: considere el siguiente PresentationML fragmento para un hipervínculo:

    <w:hyperlink r:id="rId9">
      <w:r>
        <w:t>https://www.example.com</w:t>
      </w:r>
    </w:hyperlink>

El id valor de atributo de rId9 especifica que la relación en el elemento de elemento de relación asociada con un valor de atributo Id correspondiente se debe navegar a cuando se invoca este hipervínculo. Por ejemplo, si el siguiente XML está presente en el elemento de parte de relación asociado:

    <Relationships xmlns="…">
      <Relationship Id="rId9" Mode="External" Target="https://www.example.com" />
    </Relationships>

El destino de este hipervínculo sería, por tanto, el destino de la relación rId9 : en este caso, https://www.example.com. Fin del ejemplo]

Los valores posibles para este atributo los define el tipo simple ST_RelationshipId (§22.8.2.1).

© ISO/IEC 29500: 2016


Funcionamiento del código de ejemplo

El código de ejemplo de este tema consta de un método que toma como parámetro la ruta completa del archivo de presentación. Procesa una iteración en todas las diapositivas de la presentación y devuelve una lista de cadenas que representan los identificadores uniformes de recursos (URI) de todos los hipervínculos externos de la presentación.

// 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 ejemplo

A continuación se proporciona el ejemplo de código completo que se puede usar para devolver la lista de todos los vínculos externos de una presentación. Puede usar el siguiente bucle en el programa para llamar al GetAllExternalHyperlinksInPresentation método para obtener la lista de URI de la presentación.

if (args is [{ } fileName])
{
    foreach (string link in GetAllExternalHyperlinksInPresentation(fileName))
    {
        Console.WriteLine(link);
    }
}

A continuación se incluye el código de ejemplo completo en C# y Visual Basic.

// 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;
}

Vea también