Office書類をPDFに変換するワンライナー（macOS）

## はじめに

### この記事を読むとできること

macOSのコマンド一行で、Microsoft Office書類をPDFに変換できるようになります

- Microsoft Officeは不要です
- フォルダ下のすべての書類をまとめて変換できます
- VBスクリプトと比べてかなり速いです（約3.5倍）

### コードを書くにいたった背景

Office書類を受け取るものの、編集したいわけでなく、印刷したりiPadでメモしながら読むためにPDFに変換したいことが頻繁にあります。

付録に記したように[これまでもいろいろ試行錯誤して効率化をはかってきましたが](#これまでに試してきたこと)、「macOSで動くスクリプトでなんとかならないものか」とおもいました。

Windows + Pythonだと、`pywin32`モジュールをつかって`win32com`を動かす方法があるのですが、macOSではその手は使えません。あきらめずに調べていると、オープンソースの[LibreOffice](https://ja.libreoffice.org/discover/libreoffice/)をつかう方法があるとのこと。

試してみると、思いのほかすごく良いし速いので、ご紹介いたします。

## 動きの概要

LibreOfficeさえインストールすれば、macOSのターミナルからコマンド一発です。

```bash
find . \( -name '*.doc*' -o -name '*.xls*' -o -name '*.ppt*' \) -print0 \
  | xargs -0 /Applications/LibreOffice.app/Contents/MacOS/soffice \
  --headless --convert-to pdf
```

実行時間は、4フォルダ・21ファイル（合計9.6MB）を変換した場合で26秒でした。おなじものをVBスクリプトで変換すると90秒でしたので、3倍以上速くなっています。めちゃハッピーです。

## 詳細

### LibreOfficeのインストール

https://ja.libreoffice.org/discover/libreoffice/

からダウンロードしてインストールします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/ee4b4a37-459a-e439-c69a-fc1a2ac44a09.png" width=50%>

バージョンは7.2.5にしましたが、安定版の7.1.8でいいとおもいます。

### フォントのコピー

たとえば`MS 明朝`がmacOSにインストールされていないと、別のフォントに置き換わってしまいます。必要なフォントをコピーします。`C:\Windows\Fonts\`下にあります。

### コマンドの実行

terminalを起動し、Officeが入っているフォルダに行きます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/d88a3539-531b-869a-0f33-7720102f3298.png" width=50%>

コマンドを実行します。

```bash
find . \( -name '*.doc*' -o -name '*.xls*' -o -name '*.ppt*' \) -print0 \
  | xargs -0 /Applications/LibreOffice.app/Contents/MacOS/soffice \
  --headless --convert-to pdf
```

コマンドを実行したディレクトリに、変換済みPDFが保存されています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/32303800-0015-d6db-95ac-cddfe4fbbba5.png" width=50%>

すこしコマンドの補足をします。

```bash
find . \( -name '*.doc*' -o -name '*.xls*' -o -name '*.ppt*' \) -print0
```

`( -name ... )` で、拡張子が`doc/docx/xls/xlsx/ppt/pptx`であるファイルを拾っています。`-print0`は、ファイル名に空白が含まれている場合の対策です。

```bash
xargs -0 /Applications/LibreOffice.app/Contents/MacOS/soffice \
  --headless --convert-to pdf
```

`xargs -0`は、さきほどの`find -print0`とセットで使っています（ファイル名に空白が含まれていても動くようにしている）。`/Applications/LibreOffice.app/Contents/MacOS/soffice`でLibreOfficeを実行しています。`--headless`でLibreOfficeを画面表示なしで起動しています。`--convert-to pdf`でPDFに変換するよう指示しています。

### スクリプト化

コマンドでも便利ですが、さらにラクをするために、スクリプトを書きます。ファイル名は`off2pdf.command`などと、拡張子を`.command`にします（デフォルトアプリがterminalになります）。

```off2pdf.command
#!/bin/bash

CURRENT=$(cd $(dirname $0);pwd)

cd $CURRENT
time find . \( -name '*.doc*' -o -name '*.xls*' -o -name '*.ppt*' \) -print0 | xargs -0 /Applications/LibreOffice.app/Contents/MacOS/soffice --headless --convert-to pdf
```

さらに、

```shell
$ chmod u+x off2pdf.command
```

として、スクリプトファイルに実行権限を付与します。

このスクリプトを、Office書類が入ったフォルダに移動し、Finderでスクリプトをダブルクリックすると、terminalが起動し、変換がはじまります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/ae6ed68f-a327-2f02-8114-3a8e6b0f9d86.png" width=50%>

## おわりに



### 参考リンク

LibreOfficeの使用について：
[【Python】Excel を PDF に変換する（Alpine Linux + LibreOffice ） - 7839](https://serip39.hatenablog.com/entry/2020/10/23/070000)

フォントのコピーについて：
[フォントデータを移行する方法【Windows10】 | 石川パソコン修理センター](https://ishi-pc.net/colum/font-export/)

`find`および`xargs`コマンドについて：
[find-xargs-grepで特定文字列を含むファイルの検索 - OpenGroove](https://open-groove.net/linux-command/find-xargs-grep/)
[findとxargsコマンドで-print0オプションを使う理由(改) - Qiita](https://qiita.com/maskedw/items/2dfdf6fa7eee991ddc45)

### 環境


ここで書いていることは、下記のバージョンで実施しました。

- LibreOffice 7.2.5
- macOS Monterey 12.1
- MacBook Pro (13-inch, 2020, Four Thunderbolt 3 Ports)

### これまでに試してきたこと

#### step 1: クイックアクセスツールバー

macOS版のOfficeもありますが、Windows版とやはり微妙にちがうので、Parallels上でOfficeを動かしています。`ファイル > 保存と送信 > PDF/XPSドキュメントの作成`という操作はいかにもめんどうなので、クイックアクセスツールバーに`PDFまたはXPS形式で発行`ボタンを追加しました。これで、ちょっとはラクになりました。

![SS 2022-01-25 23.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184128/aed8aac7-8765-bafa-e9a3-c4240e16d999.png)

#### step 2: VBスクリプト

クイックアクセスツールバーからワンクリックでずいぶんラクになりましたが、20ファイルとかやると嫌になってきます。そこで下記のサイトを参考にして、VBスクリプトを作成して変換していました。

[VBSでExcel、Word、PowerPointを一括でPDFに変換してみる | ドラブロ](https://www.doraxdora.com/2017/12/07/post-3384/)

わりといい感じだったので、2年ほどはこれで満足していたのですが

- まあまあ遅い（Parallels経由だからかもしれない）
- Windowsのメジャーアップデートのたびに起動しなくなる
- 途中でキャンセルできない

など微妙なところが気になってきていました。

MS Officeを完全停止することはむずかしいと思いますが（最後はそれが`正`なので）、ほとんどのケースではmacOS上で完結させられそうで、とてもしあわせです。