🤖
PowerShellでPowerPointの新規スライドに1ページずつSVGファイルを貼り付けて「図形に変換」も実行するスクリプト
以下の一連の処理を行うPowerShellのスクリプトを作成しました。このページでは作成したスクリプトを共有します。
- PowerPointのアプリケーションを起動してスライドを新規作成する
- 指定したフォルダ内に格納された複数のSVGの画像ファイルを1枚ずつスライドにページを分けて貼り付ける
- その際、SVG画像がスライドのページ全体を覆う大きさで貼り付ける
- 貼り付けたSVG画像に対して「図形に変換」を実行する
- 「図形に変換」により分解されたすべての図形に対して、フォントサイズの微調整を実行する
- スライドをファイルに保存してからクローズする
- 最後にPowerPointのアプリケーションを終了する
スクリプトを作成したきっかけ
生成AIで作成した複数のスライド風のSVG画像をPowerPointのスライドに1枚ずつ貼り付ける作業を自動化したかったため作成しました。
スクリプトの前提条件
- Windows 11 PCで実行されること
- PowerPointがPCにインストールされていること
- SVG画像のアスペクト比が16:9であること
- SVG画像のファイルの拡張子が「.svg」であること
- SVG画像のファイル名のサフィックスに連番が振られていること(例:slide000.svg)
- このスクリプトは、この連番の昇順でSVG画像をスライドに貼り付けます
動作確認した環境
- OS: Windows 11 Pro 23H2
- PowerShell: バージョン5.1.22621.4391
- PowerPoint: Microsoft® PowerPoint® for Microsoft 365 MSO (バージョン 2505 ビルド 16.0.18827.20060) 64 ビット
スクリプト
# パラメータ設定
param(
[Parameter(Mandatory=$true)]
[string]$SVGFolderPath,
[Parameter(Mandatory=$true)]
[string]$OutputPath
)
# PowerPointアプリケーションを起動
$PowerPoint = New-Object -ComObject PowerPoint.Application
$PowerPoint.Visible = [Microsoft.Office.Core.MsoTriState]::msoTrue
# 新しいプレゼンテーションを作成
$Presentation = $PowerPoint.Presentations.Add()
# デフォルトの最初のスライドを削除(オプション)
if ($Presentation.Slides.Count -gt 0) {
$Presentation.Slides.Range(1).Delete()
}
# フォルダからSVGファイルを取得
$SVGFiles = Get-ChildItem -Path $SVGFolderPath -Filter "*.svg"
# ファイル名から数字を抽出してソート
$SortedSVGFiles = $SVGFiles | ForEach-Object {
$match = [regex]::Match($_.BaseName, '(\d+)$')
if ($match.Success) {
[PSCustomObject]@{
File = $_
SortNumber = [int]$match.Groups[1].Value
}
} else {
[PSCustomObject]@{
File = $_
SortNumber = 0
}
}
} | Sort-Object SortNumber
if ($SortedSVGFiles.Count -eq 0) {
Write-Warning "指定されたフォルダにSVGファイルが見つかりませんでした。"
$PowerPoint.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($PowerPoint)
exit
}
# スライドのサイズを設定
$Presentation.PageSetup.SlideWidth = 960
$Presentation.PageSetup.SlideHeight = 540
# 各SVGファイルをスライドに挿入
foreach ($SVGFileObj in $SortedSVGFiles) {
$SVGFile = $SVGFileObj.File
# 新しいスライドを追加(空白レイアウト)
$SlideIndex = $Presentation.Slides.Count + 1
$SlideLayout = [Microsoft.Office.Interop.PowerPoint.PpSlideLayout]::ppLayoutBlank
$Slide = $Presentation.Slides.Add($SlideIndex, $SlideLayout)
# 追加したスライドを選択する
$Slide.Select()
# SVGファイルを挿入
$Picture = $Slide.Shapes.AddPicture(
$SVGFile.FullName,
[Microsoft.Office.Core.MsoTriState]::msoFalse,
[Microsoft.Office.Core.MsoTriState]::msoTrue,
0,
0,
$Presentation.PageSetup.SlideWidth,
$Presentation.PageSetup.SlideHeight
)
Write-Host "処理中: $($SVGFile.Name)"
# SVG画像を図形に変換
try {
# 挿入したSVG画像を選択
$Picture.Select()
# 「図形に変換」を実行
$PowerPoint.CommandBars.ExecuteMso("SVGEdit")
# 変換されたすべての図形を選択
$Slide.Shapes.SelectAll()
# フォントサイズの微調整
# 「フォントサイズの縮小」を3回実行
$PowerPoint.CommandBars.ExecuteMso("FontSizeDecrease")
$PowerPoint.CommandBars.ExecuteMso("FontSizeDecrease")
$PowerPoint.CommandBars.ExecuteMso("FontSizeDecrease")
}
catch {
Write-Warning " 図形に変換できませんでした: $_"
}
}
# プレゼンテーションを保存
$Presentation.SaveAs($OutputPath)
Write-Host "プレゼンテーションが正常に作成されました: $OutputPath"
# プレゼンテーションを閉じる
$Presentation.Close()
# プレゼンテーションが閉じられるのを待つ
Start-Sleep 2
# PowerPointを終了する
$PowerPoint.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($PowerPoint)
スクリプトの実行方法
上記のスクリプトを任意のファイル名で保存した後、コマンドプロンプトから以下のようにして実行します。
※ここではPowerShellのターミナルでスクリプト実行が無効になっている前提で、コマンドプロンプトを経由してPowerShellのスクリプトを実行しています。
powershell -NoProfile -ExecutionPolicy Unrestricted <保存したスクリプトファイルのパス> -SVGFolderPath <SVGファイルが格納されたフォルダへのパス> -OutputPath <作成するpptxファイルのパス>
「図形に変換」について
PowerPointの「図形に変換」を実行することで、スライドに貼り付けたSVG画像をOfficeの図形オブジェクトに分割できます。分割後、図形オブジェクトごとにPowerPoint上で様々な編集が行えます。「図形に変換」については、以下のページを参考にしました。
- Microsoft 365 で SVG イメージを編集する - Microsoft サポート
- Convert to Shape - VBA Function - Microsoft Community
フォントサイズの微調整について
「図形に変換」で分割されたOfficeの図形オブジェクトの文字が若干大きめに感じられました。そのため、スクリプトの処理でフォントサイズを3段階小さくすることで図形オブジェクトの文字の大きさを微調整しています。
まとめ
このページでは、PowerShellからPowerPointのアプリケーションを操作してスライドにSVG画像の貼り付けと「図形に変換」を実行するスクリプトを紹介しました。
PowerPointのスライドを直接出力する生成AIサービスが複数存在しますが、そのようなサービスを使用せずに生成AIでスライドを1ページずつ個別にSVG画像として作成するときなどにご参考ください。
Discussion