アルアカ - Arcadia Academia

Arcadia Academiaは「エンジニアリングを楽しむ」を合言葉に日本のデジタル競争力を高めることをミッションとするテックコミュニティです。

LibreOffice の headless 変換が空振りする時の切り分けと別プロファイルでの実行

Featured image of the post

「スクリプトで pptx を PDF に変換したのに、ファイルが出てこない」「出てきた PDF が白紙だった」「手元の画面で LibreOffice を開いている時に限って失敗する」。自動化を組んでいると、こうした変換の空振りに一度は当たります。

原因は変換そのものではなく、すでに起動している LibreOffice と設定フォルダ(プロファイル)を取り合っていることや、そもそも意図しないファイルを渡していることにあるケースが少なくありません。この記事では、soffice --headless --convert-to が空振りする時の切り分け方と、別プロファイルで安全に実行する方法をまとめます。

💡
💡 30秒で要点
- 画面で 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 で確認)を順に見てください。

プログラミング学習でお悩みですか?

現役エンジニアがあなたの学習をマンツーマンでサポートします。

  • 学習の進め方がわからない
  • ポートフォリオの作り方を知りたい
  • 現場で使える技術を学びたい
まずは30分の無料相談

相談は完全無料・オンラインで気軽に

あなたを爆速で成長させるメンタリングプログラムはこちら

メンタープログラムバナー

学習・開発のお悩みは現役エンジニアに相談

メンタープログラムの詳細を見る

エンジニアの基礎学習ゲーム

プログラミング学習支援

無料相談はこちら