高見知英の技術ログ

技術関係のログをQiitaから移行してきました。プログラミングのほか、使っているアプリの細かい仕様についてなど書いていきます。

PowerShellでPowerPointのスライドをセクション別のファイルに分割する

とある事情で、PowerPointの以下のようなファイルを、セクションごとに別々のファイルに分けることになりました。

  • セクション1 # →セクション1.pptxとして保存
    • スライド1
    • スライド2
  • セクション2 # →セクション2.pptxとして保存
    • スライド3
    • スライド4
    • スライド5
  • セクション3 # →セクション3.pptxとして保存
    • スライド6

セクション三つくらいであれば別に手作業でもいいんですが、17セクションもあるとけっこうツラいので、PowerShellで作成することにしました。

OfficeアプリのCOMオブジェクトはリファレンスが追いづらく、あまり好きではないのですが・・・*1

というわけで

というわけでひとまずコードです。

$file = "$PSScriptRoot\雉・侭.pptx"
$app = New-Object -ComObject PowerPoint.Application
$pres = $app.Presentations.open($file)
$sec_name = ""
$curpres = $null
foreach($s in $pres.Slides){
  $cur_sec = $pres.SectionProperties.Name(($s.sectionIndex))
  if($sec_name -ne $cur_sec){
    if($sec_name -ne ""){
      # 前のプレゼンテーションファイルを保存して閉じる
      $curpres.SaveAs("$PSScriptRoot\$sec_name.pptx")
      $curpres.Close()
    }
    # 新しいプレゼンテーションファイルを作成する
    $curpres = $app.Presentations.Add()
    $sec_name = $cur_sec
  }
  if($null -ne $curpres){
    # スライドをコピーする
    $s.Copy()
    $newslide = $curpres.Slides.Paste()
    # 各種パラメータのコピー
    $newslide.Design = $s.Design
    $newslide.ColorScheme = $s.ColorScheme
    $newslide.DisplayMasterShapes = $s.DisplayMasterShapes
    $newslide.FollowMasterBackground = $s.FollowMasterBackground
  }
}
$curpres.SaveAs("$PSScriptRoot\$sec_name.pptx")
$curpres.Close()

$pres.Close()
$app.Quit()

とりあえず個々のメソッド解説はおいといて、すべてのスライドはPresentation.Slidesプロパティ、セクション名はPresentation.SectionPropetoesプロパティで取得できます。

案外Visual Studio Code上でもPowerShellスクリプトが編集できるということが分かって良かった(たしか要拡張機能)。PowerPointApplication.VisibleプロパティをmsoFalseにすればPowerPointアプリ自体を非表示にできる と書いてあったので試したものの、うちのバージョンではエラーが出て非表示にできなかった。

どれくらいの精度でコピーできる?

とりあえず、完璧ではない。

実際にスクリプト実行後すべてのファイルを見てみたものの、

  • コピーができなかったスライド(原因不明):1つ
  • レイアウトが崩れてしまった)スライド:2つ

あった。まあ92スライド中3スライドだけだったので上出来か。

レイアウトが崩れてしまう理由

レイアウトについてはスライドマスターの状態から多少でもレイアウトをいじっていると、確実に崩れるようで、スライドマスターに登録されていないレイアウトを使うと確実にずれます。

例えばわたしが良く使う上下に2コンテンツみたいなレイアウトとかをするときは、必ずそのレイアウトをスライドマスターに登録しておく必要があります(スライドマスターに登録してあれば問題ありません*2 )。

今回上手くいかなかったのは、スライドマスターの設定を変更し忘れたり、微妙にレイアウトを変更していたスライドでした。

スライドの確認は必須。でも効果は十分

はいっているはずのスライドがはいっていなかったり、レイアウトが崩れてしまったりなど、予期せぬ問題があるため、スライドの確認は必須。ただツールとしては十分有益だったかなと思います。

ComObjectの利用例は少ないためツールを作るのもそこそこに大変ですが、とりあえず使ってみる価値はあるかなと。

*1:PowerPointのリファレンスだっていうのにAccessとかExcelの情報とか平気で引っかかるし、一部のメソッド名が翻訳されてたりするし

*2:それでもそこから少しでもレイアウトをいじっているとやっぱりずれます