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

上次修改时间: 2010年10月14日

适用范围: Excel 2010 | Office 2010 | PowerPoint 2010 | Word 2010

本文内容
获取 PresentationDocument 对象
基本演示文稿文档结构
超链接元素的结构
示例代码的工作方式
示例代码

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

编译本主题中的代码需要使用以下程序集指令。

using System;
using System.Collections.Generic;
using DocumentFormat.OpenXml.Packaging;
using Drawing = DocumentFormat.OpenXml.Drawing;
Imports System
Imports System.Collections.Generic 
Imports DocumentFormat.OpenXml.Packaging
Imports Drawing = DocumentFormat.OpenXml.Drawing

获取 PresentationDocument 对象

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

// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, false))
{
    // Insert other code here.
}
' Open the presentation file as read-only.
Using document As PresentationDocument = PresentationDocument.Open(fileName, False)
    ' Insert other code here.
End Using

using 语句提供典型 .Open, .Save, .Close 序列的建议备选序列。它确保在遇到右大括号时会自动调用 Dispose 方法(Open XML SDK 用来清理资源的内部方法)。using 语句后面的块为 using 语句中创建或指定的对象设定范围,在此示例中这个范围就是 document。

基本演示文稿文档结构

PresentationML 文档的基本文档结构由包含演示文稿定义的主部件组成。ISO/IEC 29500(该链接可能指向英文页面) 规范中的以下文本介绍了 PresentationML 包的整体形式。

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

讲义 是打印的一组幻灯片,可提供给访问群体 以供他们将来参考。

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

PresentationML 文档可以包含的其他功能如下:动画、音频、视频 以及幻灯片之间的切换。

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

© ISO/IEC29500: 2008。

以下 XML 代码段代表包含用 ID 267 和 256 表示的两个幻灯片的演示文稿。

<p:presentation xmlns:p="…" … > 
   <p:sldMasterIdLst>
      <p:sldMasterId
         xmlns:rel="http://…/relationships" rel:id="rId1"/>
   </p:sldMasterIdLst>
   <p:notesMasterIdLst>
      <p:notesMasterId
         xmlns:rel="http://…/relationships" rel:id="rId4"/>
   </p:notesMasterIdLst>
   <p:handoutMasterIdLst>
      <p:handoutMasterId
         xmlns:rel="http://…/relationships" rel:id="rId5"/>
   </p:handoutMasterIdLst>
   <p:sldIdLst>
      <p:sldId id="267"
         xmlns:rel="http://…/relationships" rel:id="rId2"/>
      <p:sldId id="256"
         xmlns:rel="http://…/relationships" rel:id="rId3"/>
   </p:sldIdLst>
       <p:sldSz cx="9144000" cy="6858000"/>
   <p:notesSz cx="6858000" cy="9144000"/>
</p:presentation>

通过使用 Open XML SDK 2.0,您可以利用 PresentationML 元素所对应的强类型类创建文档结构和内容。可以在 DocumentFormat.OpenXml.Presentation 命名空间中找到这些类。下表列出了 sld、sldLayout、sldMaster 和 notesMaster 元素所对应类的类名称。

PresentationML 元素

Open XML SDK 2.0 类

说明

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>http://www.example.com</w:t>
  </w:r>
</w:hyperlink>

rId9 的 id 属性值指定在调用此超链接时必须导航到的、具有对应 ID 属性值的关联关系部件项中的关系。例如,如果关联的关系部件项中存在以下 XML:

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

因此,该超链接的目标将为关系 rId9 的目标 - 在此示例中为 http://www.example.com。示例结束]

此属性可能的值由 ST_RelationshipId 简单类型定义 (§22.8.2.1)。

© ISO/IEC29500: 2008。

示例代码的工作方式

此主题中的示例代码由一个方法构成,该方法将演示文稿文件的完整路径用作参数,并循环访问演示文稿中的所有幻灯片,并返回表示演示文稿中所有外部超链接的统一资源标识符 (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);

            }
' Iterate through all the slide parts in the presentation part.
For Each slidePart As SlidePart In document.PresentationPart.SlideParts
    Dim links As IEnumerable(Of Drawing.HyperlinkType) = slidePart.Slide.Descendants(Of Drawing.HyperlinkType)()

    ' Iterate through all the links in the slide part.
    For Each link As Drawing.HyperlinkType In links

        ' Iterate through all the external relationships in the slide part. 
        For Each relation As HyperlinkRelationship In slidePart.HyperlinkRelationships
            ' If the relationship ID matches the link ID…
            If relation.Id.Equals(link.Id) Then
                ' Add the URI of the external relationship to the list of strings.
                ret.Add(relation.Uri.AbsoluteUri)
            End If

示例代码

下面是可用于返回演示文稿中所有外部链接列表的完整代码示例。可在您的程序中使用以下循环来调用 GetAllExternalHyperlinksInPresentation 方法,以获取演示文稿中 URI 的列表。

string fileName = @"C:\Users\Public\Documents\Myppt7.pptx";
foreach (string s in GetAllExternalHyperlinksInPresentation(fileName))
    Console.WriteLine(s);
Dim fileName As String
fileName = "C:\Users\Public\Documents\Myppt7.pptx"
For Each s As String In GetAllExternalHyperlinksInPresentation(fileName)
    Console.WriteLine(s)
Next
// Returns all the external hyperlinks in the slides of a presentation.
public 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))
    {
        // 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;
}
' Returns all the external hyperlinks in the slides of a presentation.
Public Function GetAllExternalHyperlinksInPresentation(ByVal fileName As String) As IEnumerable

    ' Declare a list of strings.
    Dim ret As List(Of String) = New List(Of String)

    ' Open the presentation file as read-only.
    Dim document As PresentationDocument = PresentationDocument.Open(fileName, False)

    Using (document)

        ' Iterate through all the slide parts in the presentation part.
        For Each slidePart As SlidePart In document.PresentationPart.SlideParts
            Dim links As IEnumerable = slidePart.Slide.Descendants(Of Drawing.HyperlinkType)()

            ' Iterate through all the links in the slide part.
            For Each link As Drawing.HyperlinkType In links

                ' Iterate through all the external relationships in the slide part.
                For Each relation As HyperlinkRelationship In slidePart.HyperlinkRelationships
                    ' If the relationship ID matches the link ID…
                    If relation.Id.Equals(link.Id) Then

                        ' Add the URI of the external relationship to the list of strings.
                        ret.Add(relation.Uri.AbsoluteUri)
                    End If
                Next
            Next
        Next


        ' Return the list of strings.
        Return ret

    End Using
End Function

请参阅

引用

Class Library Reference