勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PhpSpreadsheetで作成したエクセルファイルをPDFファイルに変換する方法

  PHP

以前にPhpSpreadsheetでフォーマット用のエクセルを読み込み、指定したセルにデータを書き込んだ上で別名で保存するという記事を書いたが、その保存ファイルをPDFに変換したかった。LibreOfficeと連携させることである程度実用的な形になったので以下に実装方法をメモ。

 

前提

過去記事のようにPhpSpreadsheetを導入した上で、フォーマット用のExcelを読み込み、指定したセルにデータを書き込んだ上で別ファイル名としてサーバに保存した状態。ファイルは以下のような形。

 

LibreOfficeのインストール

サーバにSSH接続し以下コマンドでインストールする。

yum install -y libreoffice libreoffice-langpack-ja

 

ソースコード

<?php
//出力先のディレクトリ
$file_path = '/aaa/bbb/ccc';

//変換する元のエクセルファイル
$xlsx_path = $file_path . '/test.xlsx';

//エクセル→PDF変換
$command = 'export HOME=/tmp && /usr/bin/soffice --headless --convert-to pdf --outdir '.$file_path.' '.$xlsx_path;
exec($command);

「出力先のディレクトリ」「変換する元のエクセルファイル」部分は適宜変更する。

返還後のPDFは以下のような形になった。

 

気になる点

PDFの表示について

以下の点がちょっと気になるかも。

  • 高さが微妙に狭まっている
  • 日付部分(納品日、納期)が英語表記(月/日/年順)

日付の方はローカル等でエクセルを開き、書式を文字列に変更してからアップロードすることで解決できた。

高さの調整は解決方法が見つからず。

レンタルサーバの場合

以下の点によりレンタルサーバだと実装できない可能性が高そう。

  • LibreOfficeのインストールが難しそう
  • exec関数を使うため禁止されているサーバだと実装不可

 

所感

多少制限はあるもののVPSや専用サーバ、AWS等だと実装できそう。また、高さ以外の部分は見た目的にも問題無いかと思われるので引き出しの一つとして持っておきたい。

 

参考サイト

https://www.wantedly.com/companies/logical-studio/post_articles/309603

https://blog.alphalinknet.jp/excel-to-pdf-1

 - PHP

  関連記事

PHPとStripeを使ってサイト内でクレジットカード決済処理の実装方法

PHPとStripeの組み合わせでWebサービスにクレジットカード決済処理を導入 ...

PHPで住所や名前のテキストをランダム生成するライブラリFakerPHPの使い方

PHPでランダムなデータを生成したい際に値段や点数等の数値やパスワード等のランダ ...

PHPとStripeで定額課金(サブスクリプション)実装する方法

PHPとStripeで1ヶ月ごとに500円でサイト内のサービスを使い放題、といっ ...

ブラウザ上でファイルのアップ・ダウンロードが可能なTiny File Managerの利用方法

ブラウザ上でファイルのアップ・ダウンロードが可能なファイルマネージャーを設置した ...

PHP8系で追加されたJIT(Just-In-Time)の設定方法

PHP8系でOPcacheの拡張機能としてJIT(Just-In-Time)とい ...