「スクリプトで pptx を PDF に変換したのに、ファイルが出てこない」「出てきた PDF が白紙だった」「手元の画面で LibreOffice を開いている時に限って失敗する」。自動化を組んでいると、こうした変換の空振りに一度は当たります。
原因は変換そのものではなく、すでに起動している LibreOffice と設定フォルダ(プロファイル)を取り合っていることや、そもそも意図しないファイルを渡していることにあるケースが少なくありません。この記事では、soffice --headless --convert-to が空振りする時の切り分け方と、別プロファイルで安全に実行する方法をまとめます。
- 画面で LibreOffice を開いたまま headless 変換を流すと、既存のプロセスとぶつかって出力が崩れることがある
- 対策は
-env:UserInstallation で変換専用のプロファイルを指定すること - 「白紙」と分かったら、LibreOffice を疑う前に「渡したファイルが意図したものか」を確認する
- 止めたい時は
pkill -f soffice のような広い指定を避け、pgrep -a で見てから PID で止める 目次を開く
症状と最初の切り分け
まず、何が起きているかを次の表で分けます。
| 症状 | 疑うこと | 確認方法 |
|---|---|---|
| 出力ファイルが作られない | 既存プロセスとのプロファイル衝突 | pgrep -a soffice で起動中のプロセスを見る |
| 出力はあるが白紙・崩れている | 衝突、または渡したファイルが違う | 入力ファイルのページ数・内容を先に確認する |
| 自分の手元だけで再現する | 画面で開いている文書がある | 文書を閉じて再実行して差を見る |
| 毎回失敗する | コマンドの書き方・出力先 | --outdir の存在と書き込み権限を確認する |
起動中のプロセスを確認する
pgrep -a soffice 何か表示されれば、LibreOffice が動いています。画面で開いている文書がある場合や、前回の変換が終わり切っていない場合に出ます。
止めたい時は、コマンドの文字列に soffice を含む別の処理まで巻き込まないよう、まず PID を確認してから止めます。
pgrep -a soffice
kill <上で確認した PID> pkill -f soffice のように文字列だけで広く指定すると、コマンドラインに soffice を含む自分自身のシェルまで止めてしまうことがあります。画面で作業中の人がいるなら、勝手に止めず、次の別プロファイルで回避する方が安全です。
別プロファイルで変換する
変換専用の設定フォルダを指定すれば、起動中の LibreOffice と分離できます。
soffice -env:UserInstallation=file:///tmp/lo-profile-check \
--headless --convert-to pdf --outdir ./out deck.pptx ポイントは3つです。
-
-env:UserInstallationには、ファイルの場所を示す URL 形式(file:///で始まる形)で書く - プロファイル用のフォルダは、変換専用の名前にして使い回す(初回だけ作成に時間がかかる)
- 並列で複数本を変換する場合は、プロセスごとに別のプロファイルを渡す
複数ファイルを順に変換する例
mkdir -p ./out
for f in ./work/*.pptx; do
soffice -env:UserInstallation=file:///tmp/lo-profile-check \
--headless --convert-to pdf --outdir ./out "$f"
done
ls -l ./out 同じプロファイルで順に流すのは問題ありません。同時に走らせる時だけ、プロファイルを分けます。
「白紙」の時は入力ファイルを先に疑う
出力が白紙だった時、LibreOffice の不具合と決めつける前に、意図したファイルを渡しているかを確認します。
よくある実例が、ファイルを再帰的に探して変換する検査スクリプトです。Python の pptx ライブラリはパッケージの中に、白紙1枚のひな形の pptx を同梱しています。フォルダを再帰で探索すると、これを拾って「白紙になる」と誤診します。
find ./work -maxdepth 1 -name '*.pptx' 探索は作業フォルダの直下だけに限ります。-maxdepth 1 を付ければ、ライブラリ側のフォルダを拾いません。
出力の中身を確かめる
pdfinfo ./out/deck.pdf | grep Pages
pdftoppm -png -r 50 ./out/deck.pdf ./out/page
ls -l ./out ページ数が入力の枚数と合っているか、画像にして中身があるかを見ます。ここで枚数が合わなければ、変換の前段(渡したファイル)を確認します。
まとめ
- 画面で LibreOffice を開いている間の headless 変換は、
-env:UserInstallationで別プロファイルを指定して実行する - 起動中のプロセスは
pgrep -a sofficeで見て、止める時は PID を指定する - 「白紙」は入力ファイルの取り違えを先に疑い、探索を作業フォルダ直下に限る
- 出力は
pdfinfoとpdftoppmで枚数と中身を確かめる
よくある質問(FAQ)
別プロファイルを指定すると、変換の見た目は変わりますか?
設定フォルダを分けるだけなので、文書の変換処理自体は同じです。ただし、フォントなどの環境はマシンの設定に依存するため、手元の出力と見比べて確認してください。
プロファイルのフォルダは毎回作り直すべきですか?
使い回して問題ありません。初回だけ作成に時間がかかります。壊れた疑いがある時だけ、フォルダごと削除して作り直します。
起動中のプロセスを止めずに変換できますか?
別プロファイルを指定すれば、止めずに実行できます。画面で作業している人の文書を止めずに済むため、共有のマシンではこの方法が安全です。
それでも空振りする時は何を見ますか?
--outdir に指定したフォルダの存在と書き込み権限、入力ファイルのパスと拡張子、手元の版でのコマンドの書き方(soffice --help で確認)を順に見てください。
