2017年10月29日日曜日

【OpenXML】すべてのスライドのテキストを取得する(foreach版)

目的

 OpenXMLを学んでいる。Microsoftの公式ではスライド数を調べて、その数でループしていたが、それでは納得いかなかったため、スライド数を調べないでできないか試した結果を記す。

参考サイト

 [方法] プレゼンテーション内のすべてのスライドのテキストを取得する (Open XML SDK)

 [方法] プレゼンテーションのすべてのスライドから特定の作成者のコメントをすべて削除する (Open XML SDK)

ソース

using DocumentFormat.OpenXml.Packaging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using D = DocumentFormat.OpenXml.Drawing;

namespace すべてのスライドのテキストを取得する_foreach版_
{
    class Program
    {
        static void Main(string[] args)
        {
            string fileName = "TEST";
            string filePath = @"C:\Users\t\Documents\07_OpenXML\" + fileName + ".pptx";

            ShowTextAllSlide(filePath);
        }

        public static void ShowTextAllSlide( string fileName)
        {
            // エラーチェック
            if(String.IsNullOrEmpty(fileName))
            {
                throw new ArgumentNullException("File Name Not Exist.");
            }

            using(PresentationDocument doc = PresentationDocument.Open(fileName, false))
            {
                // スライド数を取得し、表示する。スライドが0枚だと、何も表示しないため。
                int numberOfSlides = doc.PresentationPart.SlideParts.Count();
                System.Console.WriteLine("Number of slides = {0}", numberOfSlides);

                // スライド内をループする
                // 問題:スライドを1から順番に表示しない。
                foreach( SlidePart slide in doc.PresentationPart.SlideParts)
                {
                    StringBuilder paragraphText = new StringBuilder();

                    IEnumerable texts = slide.Slide.Descendants();
                    foreach(D.Text text in texts)
                    {
                        paragraphText.Append(text.Text);
                    }
                    System.Console.WriteLine("contains: {0}", paragraphText); 
                }
            }
            System.Console.ReadKey();
        }
    }
}

問題

スライドの1枚目から表示できなかった。