はじめに
ちょっとしたアプリをサンデープログラミング作っていて、アップロードしたパワポファイルやPDFのプレビューやサムネイル機能を付けたいなーと思ったので、その前提となるファイルの変換について説明します。環境はVagrant上で起動したUbuntu 14.04です。
一番簡単な方法
PDFであれば一番簡単な方法はunoconvとimagemagickの組み合わせでいける。以下のようにして必要なコマンドをインストールします。
sudo apt-get install unoconv
sudo apt-get install imagemagick
ここまで出来たら、以下のようにコマンドを実行します。
convert -density 600 -geometry 1000 hoge.pdf hoge_%03d.jpg
ただし、変換後の画像が汚いのが気に食わない..
綺麗に変換する方法
上の方法は簡単だけど、画像が汚いと意味がないので、もう一段工夫します。ここではxpdfを使って、pdfを一度ppmに変換し、その後画像に変換することにします。
まずxpdfをインストールします。
sudo apt-get install xpdf
その上で以下のように実行します。
pdftoppm hoge.pdf hoge
mogrify -format jpg hoge*.ppm
比べてみると分かりますが、だいぶ画像が綺麗です。
パワポのファイルから変換をしたい場合
パワーポイントのファイルを直接unoconvで変換することは出来ないので、OpenOfficeとの組み合わせ技でいきます。OpenOfficeはGUIがあるので、仮想バッファフレームが必要です。
まず、Xvfbをインストールして起動します。
sudo apt-get install xvfb
export DISPLAY=:1.0
Xvfb :1 &
日本語フォントをインストールします。適当に入れてください。なお、オープンソースのフォントであれば問題ないですが、例えばMacやWindowsに入っているフォントをそのまま持っていくのはライセンス違反になると思うので注意が必要です。
sudo apt-get install ttf-mscorefonts-installer
sudo apt-get install fonts-vlgothic
sudo apt-get install fonts-mplus
sudo apt-get install fonts-migmix
次にOpenOfficeをインストールします。日本語入りのPDFを変換するだろうと思うので、日本語版のOpenOfficeが良いかと思います。
wget "http://downloads.sourceforge.net/project/openofficeorg.mirror/4.1.1/binaries/ja/Apache_OpenOffice_4.1.1_Linux_x86-64_install-deb_ja.tar.gz"
tar xvfz Apache_OpenOffice_4.1.1_Linux_x86-64_install-deb_ja.tar.gz
cd ja/DEBS
sudo dpkg -i *.deb
これでOpenOfficeはインストールできたので、unoconvをlistener付きで起動します。
unoconv --listener &
起動すると、以下のようなプロセスがいるはずです。
/usr/lib/libreoffice/program/soffice.bin
これで準備が整ったので、パワーポイントファイルを変換します。
unoconv -f pdf Fuga.pptx
pdftoppm Fuga.pdf Fuga
mogrify -format jpg Fuga*.ppm
各種デーモンを自動起動するようにしておく
ここまででやりたいことは終わっているのですが、サーバ再起動した際などに自動でデーモンを動くようにしたいので、supervisordを使って制御します。
まだsupervisordをインストールしていない場合は以下のようにインストールします。
sudo apt-get install supervisor
設定ファイルを、/etc/supervisor/conf.d/unoconv.conf
などの名前で以下の内容で作成します。
[program:xvfb]
command=Xvfb :1
user=vagrant
autostart=true
autorestart=true
stdout_logfile=/var/log/xvfb.log
redirect_stderr=true
[program:unoconv]
command=unoconv --listener
user=vagrant
autostart=true
autorestart=true
stdout_logfile=/var/log/unoconv.log
redirect_stderr=true
environment=DISPLAY=:1
stopasgroup=true
終わったら一旦起動しているプロセスをkillした上で、supervisorを再起動すればOKです。サーバを再起動しても動作することを確認しておくと良いでしょう。