プレゼンテーション内のすべての外部ハイパーリンクを取得する
このトピックでは、Open XML SDK for Office のクラスを使用して、プレゼンテーション内のすべての外部ハイパーリンクをプログラムで取得する方法について説明します。
PresentationDocument オブジェクトを取得する
Open XML SDK では、 PresentationDocument クラスはプレゼンテーション ドキュメント パッケージを表します。 プレゼンテーション ドキュメントを操作するには、まず PresentationDocument
クラスのインスタンスを作成してから、そのインスタンスを操作します。 ドキュメントからクラス インスタンスを作成するには、ファイル パスを使用する Open メソッドを呼び出し、2 番目のパラメーターとしてブール値を使用してドキュメントを編集可能にするかどうかを指定します。 この 2 番目のパラメーターを false
に設定して、読み取り専用アクセス用にファイルを開くか、読み取り/書き込みアクセス用にファイルを開く場合は true
します。 このトピックでは、誤ってファイルに書き込みをしてしまわないようにファイルを保護するため、読み取り専用アクセスでファイルを開くのが最善です。 次の using
ステートメントは、読み取り専用アクセス用にファイルを開きます。 このコード セグメントでは、 fileName
パラメーターは、ドキュメントを開くファイルのパスを表す文字列です。
// Open the presentation file as read-only.
using (PresentationDocument document = PresentationDocument.Open(fileName, false))
v3.0.0 以降では、using ステートメントに依存することを優先して、Close() メソッドが削除されました。
これにより、閉じかっこに達したときに、 Dispose() メソッドが自動的に呼び出されます。
using
ステートメントに続くブロックは、using
ステートメントで作成または名前付けされたオブジェクトのスコープを確立します(この場合はdocument
。
プレゼンテーション ドキュメントの基本構造
PresentationML
ドキュメントの基本的なドキュメント構造は、多数のパーツで構成され、その中にはプレゼンテーション定義を含むメインパーツがあります。
ISO/IEC 29500 仕様の次のテキストでは、PresentationML
パッケージの全体的な形式について説明します。
PresentationML
パッケージのメイン部分は、プレゼンテーション ルート要素で始まります。 この要素にはプレゼンテーションが含まれており、プレゼンテーションは スライド リスト、スライド マスター リスト、ノート マスター リスト、配布資料マスター リストを参照します。 スライド リストはプレゼンテーション内のすべてのスライドを参照します。スライド マスター リストはプレゼンテーションで使用されるスライド マスター全体を参照します。ノート マスターにはノート ページの書式設定に関する情報が含まれます。配布資料マスターは配布資料がどのように表示されるかを示します。配布資料とは、聴衆に提供できるように一連のスライドを印刷したものです。
テキストやグラフィックのように、各スライドにはコメントとノートを含めることができ、レイアウトを指定したり、1 つ以上のカスタム プレゼンテーションに組み込んだりできます。 コメントは、プレゼンテーション スライド デッキをメンテナンスする人向けの注釈です。 ノートは、プレゼンテーションの発表者または参加者向けのリマインダーやメモです。
PresentationML
ドキュメントには、アニメーション、オーディオ、ビデオ、スライド間の切り替えなどのその他の機能があります。
PresentationML
ドキュメントは、1 つのパーツに 1 つの大きな本文として格納されません。 その代わりに、特定のグループの機能を実現する要素が別個のパーツに格納されます。 たとえば、ドキュメント内のすべての作成者は 1 つの作成者パーツに格納され、各スライドには独自のパーツがあります。ISO/IEC 29500: 2016
次の XML コードの例は、267 と 256 という ID で示される 2 つのスライドを含むプレゼンテーションを表します。
<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 要素に対応する厳密に型指定されたクラスを使用して、ドキュメント構造とコンテンツを作成できます。 これらのクラスは、 名前空間にあります。 次の表に、 sld
、 sldLayout
、 sldMaster
、および notesMaster
の各要素に対応するクラスのクラス名を示します。
PresentationML 要素 | Open XML SDK クラス | 説明 |
---|---|---|
<sld/> |
Slide | プレゼンテーション スライド。 SlidePart のルート要素 |
<sldLayout/> |
SlideLayout | スライド レイアウト。 SlideLayoutPart のルート要素 |
<sldMaster/> |
SlideMaster | スライド マスター。 SlideMasterPart のルート要素 |
<notesMaster/> |
NotesMaster | ノート マスター (または handoutMaster)。 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>
rId9
のid
属性値は、関連付けられているリレーションシップ パーツ アイテム内のリレーションシップと、対応する 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
サンプル コードの動作のしくみ
このトピックのサンプル コードは、プレゼンテーション ファイルの完全なパスをパラメーターとして受け取る 1 つのメソッドで構成されます。 プレゼンテーション内のすべてのスライドで反復処理を行い、プレゼンテーション内のすべての外部ハイパーリンクの Universal Resource Identifier (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;
}