SVGファイルをPowerPointで編集できる図形として読み込むには？

# あらすじ

「Microsoft Office で SVG ファイルを取り込んでパスを編集したい！」
「InkScape や Illustrator で編集したファイルや、FontAwesome のアイコンを、
PowerPoint や Excel でちょっと変更して使いたいんだ！」
ということを自動でやるために調べた内容をまとめました。

※この方法だとExcelに貼り付けできず、一度PowerPointを介する必要があります。

# SVGとは

最近流行の SVG ファイル。みなさんご存じの軽量フォーマットです。
なぜ軽いかって、拡大縮小してもファイルサイズが一定だからです。
ベクター形式だから、ラスター形式と比較して、
「画面サイズ×複雑度」の数値が小さいほど軽くなります。
軽くしたい界隈に行くと、そこら中で出回っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/168e18d3-aaf9-38af-2d5e-5a88255502e0.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/3dc6676a-29f2-9aa9-7f09-1e379a058bb0.png)

ベクター⇔ラスター

※[マークアップ・エンジニアのためのSVG入門](https://app.codegrid.net/entry/svg-basic)

# 問題

### 画像になってしまう

SVGファイルを直接PowerPoint内に貼り付けすると、
ベクター形式ではなく画像として貼り付けられます。
そのため、右クリックメニューから「パスの編集」などの
コマンドを使用して変形することはできません。

### Officeのバージョンを上げれば大丈夫

[Office 2016 以降のバージョン](https://support.microsoft.com/ja-jp/office/microsoft-office-%E3%81%A7%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%82%92%E6%8C%BF%E5%85%A5%E3%81%99%E3%82%8B-e2459f17-3996-4795-996e-b9a13486fa79)や[Office 365](https://support.microsoft.com/ja-jp/office/microsoft-office-365-%E3%81%A7-svg-%E7%94%BB%E5%83%8F%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B-69f29d39-194a-4072-8c35-dbe5e7ea528c) などでは、
「アイコンの挿入」という機能があります。
これを利用すると、SVGファイルを取り込むことが出来ます。
また[SVG 画像を Office 図形に変換する](https://support.microsoft.com/ja-jp/office/microsoft-office-365-%E3%81%A7-svg-%E7%94%BB%E5%83%8F%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B-69f29d39-194a-4072-8c35-dbe5e7ea528c)機能も標準で備わっています。

### ところがどっこい

いまだにOffice 2013や2010、はたまた、2007を利用している企業もあったりします。
[Office にはサポート期限があります](https://www.microsoft.com/ja-jp/atlife/article-office2010-eos.aspx)ので、
セキュリティ対策の視点では買い替えをお勧めします。
しかし、そんなところでは、予算を通すのも大変なので、
とりあえず[OSS](https://www.designet.co.jp/faq/term/?id=T1NT)とかWindows標準機能で何とかしたいという状況も存在します。

### Officeが最新だとしても

他にも、「新しい機能を覚えるとか面倒だからコピペさせて」
といった無茶な要望を受けることもあるかもしれません。

さて、どう対処しましょう。

# 何をするの

### 大すじ

大きく以下の３つの流れでOKです。

1. svg→emf
1. Officeに貼り付け
1. グループ解除

### 変換

まず、Office図形として編集が可能な状態で貼り付けするには、
あらかじめ「[拡張メタファイル](https://ja.wikipedia.org/wiki/Windows_Metafile)」という形式に変換する必要があります。
例えば「peacemark.svg」があったら「peacemark.emf」にします。

### 貼付

次に、このEMF形式になったファイルをOfficeにコピー＆ペーストまたは、ドラッグ＆ドロップします。

### グループ

貼り付けしたら、Office上でその図形を右クリックしてグループ解除します。

### 微修正

あとは細かい修正です。
グループ解除した時に「ページ枠みたいなもの」を消したり、
なぜか無駄に付いた「図形の輪郭」を消したりします。

以上です。簡単ですね。

# 肝心の変換処理

### Inkscapeでやろう

Inkscapeを変換に使います。
Inkscapeは有名な[OSS](https://www.designet.co.jp/faq/term/?id=T1NT)ですので、利用するのに抵抗のある人は少ないでしょう。
括りとしては、「[Gimp](https://gimp.org/)・[Inkscape](https://inkscape.org/)・[Blender](https://blender.org/)・[FreeCAD](https://freecadweb.org/)・[LibreOffice](https://ja.libreoffice.org/)」というグループに属すると思います。
![128px-Inkscape_Logo.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/02f2543e-bee6-3167-06e5-017702a99de8.png)
Inkscapeのインストール作業の説明は省きます。

### 変換開始

さあ、変換しましょう。
Inkscapeで開いて、EMF形式で名前を付けて保存することもできます。
しかし、これはエンジニアとしてあるまじき行為。

### コマンドライン

なぜなら、Inkscapeにはコマンドラインオプションがあるからです。
エンジニアと名乗るからには、[退屈なことはスクリプトに、やらせ](https://www.amazon.co.jp/%E9%80%80%E5%B1%88%E3%81%AA%E3%81%93%E3%81%A8%E3%81%AFPython%E3%81%AB%E3%82%84%E3%82%89%E3%81%9B%E3%82%88%E3%81%86-%E2%80%95%E3%83%8E%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AB%E3%82%82%E3%81%A7%E3%81%8D%E3%82%8B%E8%87%AA%E5%8B%95%E5%8C%96%E5%87%A6%E7%90%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-Al-Sweigart/dp/487311778X)たいものです。

# 変換用スクリプト

### バッチファイルを作ろう

変換するためのスクリプトファイルをCMD形式で作成します。
メモ帳でもvscodeでも何でもよいですが、
以下のプログラムを書いて「SvgToEmf.cmd」のような、CMD形式で保存します。

```posh:SvgToEmf.cmd
@echo off
set inkscape1="%ProgramFiles%\Inkscape\bin\inkscape.com"
%inkscape1% --export-filename=%~n1.emf %1
```

### 出来たスクリプトの使い方

こうして出来上がったCMDファイルにSVGファイルをドラッグ＆ドロップすると、同じフォルダにEMFファイルが出現します。

コマンドラインの場合、コマンドプロンプトなどで、`SvgToEmf.cmd`が置かれたフォルダに移動します。そして、`SvgToEmf.cmd 変換したいファイル.svg`と入力すると、`SvgToEmf.emf`が作成されます。

### スクリプトの中身の説明

- `%1`は、`SvgToEmf.cmd`に渡された最初の引数を指します。
  - これは、変換したい元のファイル（例えば、SVGファイル）のパスです。
- `%~n1`は、`%1`で指定されたパスから拡張子を除いたファイル名を取得しています。
  - 例えば、`%1`が`C:\path\to\file.svg`だった場合、`%~n1`は`file`になります。

### EMF以外もできる

`--export-filename`というオプションを使うと、自動でファイル形式を認識して変換してくれます。

たとえば、この`%~n1.emf`という部分の`emf`を変えて`%~n1.ps`とするとPhotoshopの形式に変換できたりします。

「svg、png、ps、eps、pdf、emf、wmf、xaml」とかを使えるみたいです。
詳しくは、[公式リファレンス](https://wiki.inkscape.org/wiki/index.php?title=Using_the_Command_Line)を読んでください。

# 発展

### 正式リリースでInkscapeは大きく変化したらしい

#### 実行ファイルの拡張子

上記で作成したスクリプトの中に、`inkscape.com`という部分があります。
Inkscapeの正式リリースバージョン`1.0.0`から、EXEではなくCOMに変更されたらしいです。

#### GUIのダークモード標準対応

今までダークモードはなかったですが、ダークモードが使えるようになりました。
本稿とは全く関係ないですね。

### Powershellで書いた場合

Powershellで書くと、以下のような感じになります。

```posh:SvgToEmf.ps1
$Inkscape="$env:ProgramFiles\inkscape\bin\inkscape.com"
$SourceFileName="source.svg"
$ExportFileName="export.emf"
Start-Process -FilePath $Inkscape -ArgumentList $($SourceFileName,'--export-filename="$ExportFileName"')
```

※ドラッグ＆ドロップはできません。~~セキュリティーポリシー関連とかコーディングが面倒です。~~

# 環境

Inkscape 1.0
Windows 10
PowerShell 7

# 一次情報

- [公式リファレンス | Inkscape](https://wiki.inkscape.org/wiki/index.php?title=Using_the_Command_Line)

それではみなさん、
素敵なSVGライフをお楽しみください！
最後まで目を通してくださり、ありがとうございます！

**Excelsior!**