5

そこで、pptx パーサーを作成し、OpenXML を使用してデータを読み込みます。すべてうまくいっています (これは嘘です。実際には、部屋の向こう側にコンピューターを放り投げて、窓から飛び降りる準備ができています)。ビデオの読み込みで問題が発生しました。問題は、OpenXML がビデオ URI を指定する関係タグを見つけられないように見えることです。

私が行ったことは、次のように、スライド内のパーツを循環し、ID をログアウトするコードを記述したことです。

SlidePart slidePart = ...;
foreach(var curPart in slidePart.Parts)
  Console.WriteLine("Part ID: " + curPart.RelationshipId);

そのため、slide.xml.rels ファイルで指定されたすべての関係がログアウトされます。ただし、関連するファイルのビデオ関係は除きます。rels ファイルでビデオの関係を確認でき、スライドの videoFile タグのリンク ID と一致しますが、コードから取得する方法がわかりません。画像の読み込みは正常に機能しています (OpenXML は画像の関係を見つけることができます)。ビデオ関係は、他の関係とは異なる方法で扱われますか? ビデオ URI を取得するにはどうすればよいですか?

4

2 に答える 2

4

ビデオの関係は、SlidePartのExternalReleationshipsコレクションに保存されます。

Powerpointは、次の方法でビデオ(外部ファイル)をプレゼンテーションに埋め込みます(簡略化)。

  1. ビデオを含むスライドのVideoap:timing(class)タグ内にap :video(class)タグを作成します。Timing
  2. p:videoタグには、p:cMediaNode(クラスCommonMediaNode)という子が含まれています。

  3. p:cMediaNodeには、p:tgtEl(クラスTargetElement)という子が含まれています。

  4. ShapeTargetこの場合も、p:cMediaNodeには、ビデオに関連付けられた画像形状のIDを指すp:spTgt(クラス)という子が含まれています。図形のIDがNonVisualDrawingProperties Idメンバーに保存されます。したがって、ビデオはこれらのIDを介して画像の形状に接続されます。

  5. さらに、画像の形状には、a:videoFile(クラスVideoFromFile)という子が含まれています。クラスVideoFromFileにはLink、外部関係のIDを指すというメンバーがあります。

OpenXMLSDK2.0生産性向上ツールをダウンロードすることを強くお勧めします。このツールを使用すると、プレゼンテーションファイルの生成されたXMLを検査できます。

次のコードは、特定のプレゼンテーションのすべてのスライドのすべてのビデオを列挙します。ビデオごとに、外部ファイルへのURIが印刷されます。これは、特定の動画に関連する外部の関係を見つけることによって行われます。

using (var doc = PresentationDocument.Open("c:\\temp\\presentation.pptx", false))
{
  var presentation = doc.PresentationPart.Presentation;

  foreach (SlideId slideId in presentation.SlideIdList)
  {
    SlidePart slidePart = doc.PresentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
    if (slidePart == null || slidePart.Slide == null)
    {
      continue;
    }

    Slide slide = slidePart.Slide;

    var videos = slide.Descendants<Video>();

    Console.Out.WriteLine("Found videos for slide ID: {0}", slideId.Id);
    foreach (Video video in videos)
    {
      ShapeTarget shapeTarget = video.Descendants<ShapeTarget>().FirstOrDefault();

      Console.Out.WriteLine("ShapeTargetId = {0}", shapeTarget.ShapeId);

      var videoFromFile = slide.CommonSlideData.ShapeTree.Descendants<Picture>().
                Where<Picture>(p => p.NonVisualPictureProperties.Descendants<NonVisualDrawingProperties>().FirstOrDefault().Id == shapeTarget.ShapeId).
                FirstOrDefault().Descendants<VideoFromFile>().FirstOrDefault();                

      Console.Out.WriteLine("Releationship ID: {0}", videoFromFile.Link);

      var externalReleationship = 
                slidePart.ExternalRelationships.Where(er => er.Id == videoFromFile.Link).FirstOrDefault();

      if(externalReleationship == null) // Then it must be embedded
      {
         ReferenceRelationship rr = slidePart.GetReferenceRelationship(videoFromFile.Link);
         if (rr != null)
         {
           Console.Out.WriteLine(rr.Uri.OriginalString);
         }
      }
      else
      {
        Console.Out.WriteLine("Path to video file: {0}", externalReleationship.Uri.AbsolutePath);
      }
    }
  }
}

もちろん、a:videoFile(クラスVideoFromFile)タグを直接列挙することもできます。以下のコードを参照してください。

foreach (SlideId slideId in presentation.SlideIdList)
{
  SlidePart slidePart = doc.PresentationPart.GetPartById(slideId.RelationshipId) as SlidePart;
  if (slidePart == null || slidePart.Slide == null)
  {
    continue;
  }

  Slide slide = slidePart.Slide;

  var videos = slide.CommonSlideData.ShapeTree.Descendants<VideoFromFile>();

  foreach (VideoFromFile video in videos)
  {                                
    Console.Out.WriteLine("Releationship ID: {0}", video.Link);

    var externalReleationship =
           slidePart.ExternalRelationships.Where(er => er.Id == video.Link).FirstOrDefault();

    if(externalReleationship == null) 
    {
        ReferenceRelationship rr = slidePart.GetReferenceRelationship(videoFromFile.Link);
        if (rr != null)
        {
          Console.Out.WriteLine(rr.Uri.OriginalString);
        }
    }
    else
    {
      Console.Out.WriteLine("Path to video file: {0}", externalReleationship.Uri.AbsolutePath);
    }
  }
}
于 2012-09-23T10:06:29.987 に答える