make is.dev make it simple. development.
2024年5月2日

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 );
PHP

EXCELファイルを開いて、それぞれのライブラリでPDF保存するだけのもの。

実利用のイメージとしては、テンプレートファイルを開いて、加筆して、PDF保存して帳票を作成するといった使い方を想定している。

検証に使用したEXCELファイル

見積書っぽいレイアウトのEXCELファイル。
EXCEL方眼気味に作られたフォーマットで、セル結合や印刷範囲の調整や罫線、印(画像)、印刷範囲や縮尺などあり。

なお、これをEXCELでPDF形式で保存すると以下のようなPDFになる。

出力結果

TCPDFの出力

mPDFの出力

Dompdfの出力

所感

どれもEXCELのPDF保存には遠い。

フォーマットの作りによって使える範囲に納めていくことを考えるなら、掲載範囲(横)にほぼ対応出来ているように見えるmPDFが近そう。

ただそれでも、画像により行ズレが出ている(=画像入れると崩れそう)ことや、罫線が欠損していることなどを考えると、整えるのは結構大変そうではある。