获取演示文稿中的所有外部超链接

本主题演示如何使用 Open XML SDK for Office 中的类以编程方式获取演示文稿中的所有外部超链接。


获取 PresentationDocument 对象

在 Open XML SDK 中 PresentationDocument , 类表示演示文稿文档包。 若要处理演示文稿文档,请先创建 类的 PresentationDocument 实例,然后使用该实例。 若要从文档创建类实例, Open 请调用使用文件路径的方法,并使用布尔值作为第二个参数来指定文档是否可编辑。 将此第二个参数设置为 以 false 打开文件进行只读访问,或者 true 如果要打开文件进行读/写访问,请将此参数设置为 。 在此主题中,最好打开文件进行只读访问,以防止文件被意外写入。 以下 using 语句打开文件进行只读访问。 在此代码段中, fileName 参数是一个字符串,表示要从中打开文档的文件的路径。

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

在 v3.0.0+ 中, Close() 已删除 方法,转而依赖于 using 语句。 这可确保在 Dispose() 到达右大括号时自动调用 方法。 语句后面的 using 块为在 语句中创建 using 或命名的对象建立作用域,在本例 document中为 。


基本演示文稿文档结构

文档的基本文档结构PresentationML由多个部分组成,其中包括包含表示定义的main部分。 ISO/IEC 29500 规范中的以下文本介绍了包的整体PresentationML形式。

包的main部分PresentationML以演示文稿根元素开头。 该元素包含演示文稿,演示文稿又引用幻灯片 列表、幻灯片母版 列表、备注母版 列表和讲义母版 列表。 幻灯片列表指的是演示文稿中的所有幻灯片;幻灯片母版列表指的是演示文稿中使用的全部幻灯片母版;备注母版包含有关备注页格式的信息;讲义母版描述讲义的外观。

讲义 是可提供给访问群体 的一组打印的幻灯片。

除了文本和图形,每个幻灯片还可以包含注释备注,可以具有布局,并且可以是一个或多个自定义演示文稿 的组成部分。 注释是供维护演示文稿幻灯片平台的人员参考的批注。 备注是供演示者或访问群体参考的提醒信息或一段文字。

文档可以包括以下其他功能 PresentationML动画音频视频和幻灯片之间的 切换 效果。

文档 PresentationML 不作为一个大正文存储在单个部件中。 而实现某些功能组合的元素会存储在各个部件中。 例如,文档中的所有作者都存储在一个作者部件中,而每个幻灯片都有自己的部分。

ISO/IEC 29500:2016

以下 XML 代码示例代表包含用 ID 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>

使用 Open XML SDK,可以使用对应于 PresentationML 元素的强类型类创建文档结构和内容。 可以在 命名空间中找到 这些类。 下表列出了对应于 、、 sldLayoutsldMasternotesMaster 元素的类的sld类名。

PresentationML 元素 Open XML SDK 类 说明
<sld/> Slide 演示文稿幻灯片。 它是 SlidePart 的根元素。
<sldLayout/> SlideLayout 幻灯片版式。 它是 SlideLayoutPart 的根元素。
<sldMaster/> SlideMaster 幻灯片母版。 它是 SlideMasterPart 的根元素。
<notesMaster/> NotesMaster 备注母版(或讲义母版)。 它是 NotesMasterPart 的根元素。

在此操作方法代码示例中,您将处理外部超链接。 因此,您最好熟悉一下超链接元素。 ISO/IEC 29500 规范中的以下文本介绍了 id (超链接目标) 。

指定其目标将用作此超链接目标的关系的 ID。

如果省略此属性,则当前超链接将没有外部超链接目标 - 当前文档中的位置仍然可以通过定位属性成为目标。 如果此属性存在,它将取代定位属性中的值。

[示例:请考虑超链接的以下 PresentationML 片段:

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

idrId9属性值指定在调用此超链接时,必须导航到具有相应 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;
}

另请参阅