PhpSpreadsheet tips #6
・ PDF保存を試してみる
PhpSpreadsheetは別途PDF生成用のライブラリを組み合わせる事でPDF保存が出来るので、試してみる。
公式ドキュメントによると、対応しているのは TCPDF、mPDF、Dompdf の3つ。
(参考)
https://phpspreadsheet.readthedocs.io/en/latest
先に結論
帳票をPDF出力するならば、TCPDF、mPDF、Dompdf いずれも実用に耐えないように思われる。
(帳票 = 書式や罫線、印刷レイアウトなどを整えた書類のようなものの意)
EXCELでのPDF出力に近い出力が出来る方法としては、別記事でLibreOfficeを試しているのでそちらを使う事が望ましい。
使用環境
・ PHP 8.2.9
・ phpoffice/phpspreadsheet version 2.0.0 (Composerでインストール済み)
・ tecnickcom/tcpdf version 6.7.5
・ mpdf/mpdf version 8.2.3
・ dompdf/dompdf version 2.0.8
事前準備
各ライブラリをcomposerで入れる。
composer require tecnickcom/tcpdf
composer require mpdf/mpdf
composer require dompdf/dompdf
日本語を扱う場合はフォントの準備も必要だが、本検証では英数のみとしてフォント周りは省略。
検証に使用したコード
<?php
require '../vendor/autoload.php';
use PhpOffice\PhpSpreadsheet\Reader\Xlsx as XlsxReader;
// 元になるファイルをスプレッドシートに読み込む
$reader = new XlsxReader();
$spreadsheet = $reader->load( './template.xlsx' );
// TCPDFでPDF形式で保存する
$TCPDF_Writer = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Tcpdf($spreadsheet);
$TCPDF_Writer->save( './TCPDF_output.pdf' );
// mPDFでPDF形式で保存する
$mPDFWriter = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf($spreadsheet);
$mPDFWriter->save( './mPDF_output.pdf' );
// DompdfでPDF形式で保存する
$DompdfWriter = new \PhpOffice\PhpSpreadsheet\Writer\Pdf\Dompdf($spreadsheet);
$DompdfWriter->save( './Dompdf_output.pdf' );
// スプレッドシートを閉じてメモリを解放
$spreadsheet->disconnectWorksheets();
unset( $spreadsheet );
PHPEXCELファイルを開いて、それぞれのライブラリでPDF保存するだけのもの。
実利用のイメージとしては、テンプレートファイルを開いて、加筆して、PDF保存して帳票を作成するといった使い方を想定している。
検証に使用したEXCELファイル
見積書っぽいレイアウトのEXCELファイル。
EXCEL方眼気味に作られたフォーマットで、セル結合や印刷範囲の調整や罫線、印(画像)、印刷範囲や縮尺などあり。
なお、これをEXCELでPDF形式で保存すると以下のようなPDFになる。
出力結果
TCPDFの出力
mPDFの出力
Dompdfの出力
所感
どれもEXCELのPDF保存には遠い。
フォーマットの作りによって使える範囲に納めていくことを考えるなら、掲載範囲(横)にほぼ対応出来ているように見えるmPDFが近そう。
ただそれでも、画像により行ズレが出ている(=画像入れると崩れそう)ことや、罫線が欠損していることなどを考えると、整えるのは結構大変そうではある。