Поделиться через


Получить все внешние гиперссылки в презентации

В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного получения всех внешних гиперссылок в презентации.


Получение объекта PresentationDocument

В пакете SDK Open PresentationDocument XML класс представляет пакет документов презентации. Чтобы работать с документом презентации, сначала создайте экземпляр PresentationDocument класса , а затем работайте с этим экземпляром. Чтобы создать экземпляр класса из документа, вызовите Open метод, использующий путь к файлу, и логическое значение в качестве второго параметра, чтобы указать, доступен ли документ для редактирования. Присвойте этому второму параметру значение false , чтобы открыть файл только для чтения, или true , если вы хотите открыть файл для доступа на чтение и запись. В этом разделе рекомендуется открыть файл только для чтения, чтобы защитить файл от случайной записи. using Следующая инструкция открывает файл для доступа только для чтения. В этом сегменте fileName кода параметр представляет собой строку, представляющую путь к файлу, из которого требуется открыть документ.

// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, false))

В версии 3.0.0+ Close() метод был удален в пользу использования инструкции using. Это гарантирует автоматический Dispose() вызов метода при достижении закрывающей фигурной скобки. Блок, следующий за using оператором , устанавливает область для объекта, созданного или именованного в инструкцииusing, в данном случае document.


Базовая структура документа презентации

Базовая структура PresentationML документа состоит из нескольких частей, среди которых есть main часть, содержащая определение презентации. В следующем тексте из спецификации ISO/IEC 29500 представлена общая форма PresentationML пакета.

Main часть PresentationML пакета начинается с корневого элемента презентации. Этот элемент содержит презентацию, которая, в свою очередь, ссылается на список слайдов, список образцов слайдов, список образцов заметок и список образцов раздаточных материалов. Список слайдов ссылается на все слайды в презентации; список образцов слайдов ссылается на все образцы слайдов, используемые в презентации; в списке образцов заметок содержатся данные о форматировании страниц заметок, а в списке образцов раздаточных материалов описан внешний вид раздаточных материалов.

Раздаточные материалы представляют собой набор распечатанных слайдов, которые можно раздать слушателям для последующего использования.

Наряду с текстом и изображениями слайды могут содержать комментарии, заметки и разметку, а также могут входить в одну или несколько пользовательских презентаций. Комментарий представляет собой примечание, которое адресовано сотруднику, ответственному за обслуживание набора слайдов. Заметка представляет собой напоминание или отрывок текста, предназначенный для докладчика или для слушателей.

Другие функции документа PresentationML могут включать следующие: анимацию, звук, видео и переходы между слайдами.

Документ PresentationML не хранится в виде одного большого текста в одной части. Элементы с определенной группировкой функций хранятся в различных частях. Например, все авторы в документе хранятся в одной части авторов, а каждый слайд имеет свою собственную часть.

ISO/IEC 29500: 2016

Указанный ниже пример кода XML описывает презентацию, содержащую 2 слайда с идентификаторами 267 и 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>

С помощью пакета SDK Open XML можно создавать структуру документа и содержимое с помощью строго типизированных классов, соответствующих элементам PresentationML. Эти классы можно найти в пространстве имен. В следующей таблице перечислены имена классов, которые соответствуют sldэлементам , sldLayout, sldMasterи notesMaster .

Элемент PresentationML Класс пакета SDK Open XML Описание
<sld/> Slide Слайд презентации. Это корневой элемент части SlidePart.
<sldLayout/> SlideLayout Разметка слайда. Это корневой элемент части SlideLayoutPart.
<sldMaster/> SlideMaster Образец слайда. Это корневой элемент части SlideMasterPart.
<notesMaster/> NotesMaster Образец заметок (или handoutMaster). Это корневой элемент части NotesMasterPart.

В этом практическом примере кода рассматривается обработка внешних гиперссылок. В этой связи рекомендуется более детально ознакомиться с информацией об элементе hyperlink. В следующем тексте из спецификации ISO/IEC 29500 представлен (цель гиперссылки id ).

Указывает идентификатор связи, конечное расположение которого будет использоваться в качестве конечного расположения для этой гиперссылки.

Если этот атрибут пропущен, для текущей гиперссылки не будет указано конечное расположение (расположение текущего документа можно указать в качестве конечного расположения с помощью атрибута привязки). Если этот атрибут присутствует, он имеет приоритет перед значением атрибута привязки.

[Пример. Рассмотрим следующий PresentationML фрагмент для гиперссылки:

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

Значение id атрибута rId9 указывает, что при вызове этой гиперссылки необходимо перейти к связи в элементе связанной части связи с соответствующим значением атрибута Id. Например, если в элементе связанной части связи присутствует следующий XML-код:

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

Таким образом, целевой объект этой гиперссылки будет целевым объектом связи rId9 , в данном случае https://www.example.com. конец примера]

Возможные значения этого атрибута определены в простом типе ST_RelationshipId (§22.8.2.1).

© ISO/IEC 29500: 2016


Механизм работы примера кода

Указанный ниже в данном разделе пример кода включает один метод, который принимает в качестве параметра полный путь файла презентации. Он выполняет итерацию по всем слайдам презентации и возвращает список строк, представляющих URI всех внешних гиперссылок в презентации.

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

Пример кода

Далее представлен полный пример кода, который можно использовать для возврата списка всех внешних ссылок в презентации. Вы можете использовать следующий цикл в своей программе GetAllExternalHyperlinksInPresentation , чтобы вызвать метод для получения списка URI в презентации.

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

Ниже приведен полный пример кода на языках C# и 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;
}

См. также