PHP+LibreOfficeでEXCELファイルをPDFファイルを作成する

2021-07-13

CUI環境でLibreOfficeを利用して、EXCELファイルをPDFファイルを作成する

PHPを利用している環境でEXCELファイルをPDFファイルに変換する必要な開発案件がありました。
GUI環境をEXCELからPDFファイルを変換するならOffice系ソフトを利用すれば簡単にできますが、PHPを利用してCUI環境でしようするので、「LibreOffice」を利用してコマンドラインで変換します

【環境】

  • CentOS 7.7
  • LibreOffice 6.4.4

LibreOfficeをインストール

CUI環境でPDF変換するのでGUI環境のX-Windowは不要です。ファイルのダウンロードのURLはダウンロードされる時期によってバージョンが異なりますので使用環境で変更して下さい

$ sudo cd /usr/local/src
$ sudo curl -L -O "http://ftp-srv2.kddilabs.jp/office/tdf/libreoffice/stable/6.4.4/rpm/x86_64/LibreOffice_6.4.4_Linux_x86-64_rpm_langpack_ja.tar.gz"
$ sudo curl -L -O "http://ftp-srv2.kddilabs.jp/office/tdf/libreoffice/stable/6.4.4/rpm/x86_64/LibreOffice_6.4.4_Linux_x86-64_rpm_helppack_ja.tar.gz"
$ sudo curl -L -O "http://ftp-srv2.kddilabs.jp/office/tdf/libreoffice/stable/6.4.4/rpm/x86_64/LibreOffice_6.4.4_Linux_x86-64_rpm.tar.gz"
$ sudo tar xzvf LibreOffice_6.4.4_Linux_x86-64_rpm_langpack_ja.tar.gz
$ sudo tar xzvf LibreOffice_6.4.4_Linux_x86-64_rpm_helppack_ja.tar.gz
$ sudo tar xzvf LibreOffice_6.4.4_Linux_x86-64_rpm.tar.gz
$ sudo rpm -Uvh LibreOffice_6.4.4.2_Linux_x86-64_rpm/RPMS/*.rpm
$ sudo rpm -Uvh LibreOffice_6.4.4.2_Linux_x86-64_rpm_langpack_ja/RPMS/*.rpm
$ sudo rpm -Uvh LibreOffice_6.4.4.2_Linux_x86-64_rpm_helppack_ja/RPMS/*.rpm

シンボリックリンク作成

実行ファイルは、「/opt/libreoffice6.4/program/soffice」にインストールされます。このままだとバージョンが異なるごとにパスが変わるので「/usr/bin/soffice」にシンボリックリンク作成します

$ sudo ln -s /opt/libreoffice6.4/program/soffice /usr/bin/soffice
$ ls -l /usr/bin/soffice
lrwxrwxrwx 1 root root 35 Jun 25 16:50 /usr/bin/soffice -> /opt/libreoffice6.4/program/soffice

日本語フォントをインストール

PDF変換時に日本語の文字化けを防ぐ為、日本語フォントをインストールします

$ sudo yum install ipa-gothic-fonts ipa-pgothic-fonts
$ sudo fc-cache -fv

PHPでEXCELファイルからPDF変換

EXCELファイルをPDF変換するには、以下のようなPHPで変換できます

LibreOfficeはPDF変換時には、実行ユーザのホームディレクトリにテンポラリファイルを作成します。WEB環境でPHPを使用する場合は、利用者はapacheやnginxのホームディレクトリが無いユーザーで実行されるので、環境変数でHOME設定をおこない「/tmp」等の指定する必要があります

<?php
exec("export HOME=/tmp;/usr/bin/soffice \
--headless --convert-to pdf:writer_pdf_Export \
--outdir '/var/www/html/files/tmp' \
'/var/www/html/files/tmp/test.xlsx'");
?>