技術・業務

【TCPDF】Cellのストレッチモードの活用方法

初めまして。システムデザイン開発のA.Oです。
今回はPHPPDFを表示する際のTCPDFというライブラリについて紹介したいと思います。

TCPDFとは、PHPPDFを出力してくれるライブラリです。実際に業務で使用していて、セル内の文字の収め方、均等割り付けによる表示について、便利だと思ったことを書いていきたいと思います。

Cellの引数について

Cellは矩形領域(セル)を出力するメソッドです。引数は以下の通りになります。

引数
 $width セルの幅
 $height セルの高さ
 $text 出力する文字
 $border 左右上下の境界線
 $ln 改行
 $align 文字の整列指定
 $fill セルの塗りつぶし
 $link 登録するリンク先のURL
 $stretch 文字の伸縮
 $ignore_min_height セルの高さの最小値調整
 $calign 指定されたY座標に対するセルの配置
 $valign セル内の文字の垂直方向の配置

今回は$stretchの設定によるストレッチモードの活用方法について紹介します。

ストレッチモードの設定内容について

Cellにはいくつかのストレッチモードがあり、出力内容に合わせて設定する事が可能です。
ストレッチモードは、セルの枠に合わせてテキストを伸縮させます。

まずは、簡単に設定内容を説明します。

・$stretch →1 必要に応じて縮む。枠内に収まるように表示される。
・$stretch →2 文字幅が狭いと縮む。広い場合は文字が横に伸びる。
・$stretch →3 文字が狭い場合のみ、文字の間隔が均一になる。
・$stretch →4 幅が広い場合は文字の間隔が均一になる。狭い場合は文字が重なる。

上記の他に、ブランクや、”0”が設定されている場合は、文字の伸縮が行われなくなります。

出力する文字を境界線内に収める方法

出力する文字が長い場合、下記のように$width(2番目の引数)で設定した枠に収まらず表示されます。四角く囲っている箇所が本来の幅ですが、出力する文字が枠に収まらない場合は、画像1のようにそのまま文字が収まらない状態で出力されます。

$pdf->Cell(20, 10, 'あいうえお', '1', '', 'L', false, '', '');

画像1

$border(4番目の引数)を使用しない場合は、境界線が表示されない事もあり、文字が枠に収まらなくても表示に問題ありません。

しかし、$borderを使用する場合は画像1のように、Cellの横幅よりも文字が長い場合、文字と境界線が重なってしまう為、
$width(1番目の引数)でCellの横幅を広くする又は、文字サイズの調整を行うsetFontSizeメソッドを使用して文字のフォントサイズを小さくするといった対応を行う事になります。
ただし、この方法はCellの横幅に依存する為、あらかじめ最大文字数が決められている必要があります。

今回は出力する文字数が決まっていない場合の使用方法を紹介します。

まずは、枠幅に収まらない文字数への対応方法です。

枠幅に収まらない文字数を表示する場合、特に設定を行わずに表示すると、画像1と同様に画像2の一番上の結果で表示されます。

そこで使用するのは$stretch(9番目の引数)です。

$stretchに1~4の値を設定する事で、文字の伸縮やスペース埋めが適用されます。

テキストをセルの幅に収めたい場合、$stretch1、または2にすると枠に収まるように文字が自動で縮まります。

$stretchを1で出力したのが画像2の2段目、$stretchを2で出力したのが画像2の一番下になります。

// 伸縮なし
$pdf->Cell(20, 10, 'あいうえお', '1', '1', 'L', false, '', '');
// $stretch = 1
$pdf->Cell(20, 10, 'あいうえお', '1', '1', 'L', false, '', '1');
// $stretch = 2
$pdf->Cell(20, 10, 'あいうえお', '1', '1', 'L', false, '', ');

画像2

これで文字数が多くなっても枠内に収めた状態で表示することができます。

次に、文字数が少ない場合の対応について説明します。

枠幅を超える文字数の場合だと先述の説明の通り、$stretchが1、2どちらでも良いように見えますが、指定した幅よりも文字が少ない場合に挙動が変わります。

// 伸縮なし
$pdf->Cell(20, 10, 'あい', '1', '1', 'L', false, '', '');
// $stretch = 1
$pdf->Cell(20, 10, 'あい', '1', '1', 'L', false, '', '1');
// $stretch = 2
$pdf->Cell(20, 10, 'あい', '1', '1', 'L', false, '', '2');

画像3

枠の幅は変えずに文字数だけ変えました。画像3の一番上が伸縮なし、画像3の2段目が$stretchを1に設定した場合の表示です。

伸縮なし、$stretchが1の場合は通常通り表示されています。

画像3の一番下が$stretchを2に設定した場合の表示です。$stretchが2の場合だと文字が横に伸びているように見えると思います。

$stretchが1の場合、枠内に収まる文字数であれば、文字の伸縮は行われません。

$stretchを2に設定した場合は、画像2の一番下の表示になります。文字が枠からはみ出す場合の挙動は$stretchが1の時と同じですが、枠内に収まる文字数の場合は枠全体まで文字が広がります。

文字がはみ出る場合のみ文字を縮めたい場合は、$ stretchの設定を1にするのがおすすめです。ただし、枠幅に対して文字数が多くなれば多くなるほど文字が縮まってしまい、場合によっては文字が小さくなりすぎて読めないようになる可能性もある為、注意が必要です。

幅に合わせて文字の間隔を広げる方法(均等割り付け)

文字を枠内に縮めるとは逆に、枠全体に文字を広げていく方法を紹介します。

まずは幅が広いときの挙動を見ていきます。引数は先ほどと同じく$stretch を使用します。設定するには3か4を設定値に使用します。

画像4の一番上が伸縮なしでの表示です。

$stretchを3に設定した場合は、画像4の2段目の表示になります。必要に応じて文字が均等に配置されるため、幅が狭い場合は特に変化しません。

$stretchを4に設定した場合は、画像4の一番下の表示になります。幅の長さに限らずに文字が均等割り付けされます。文字と文字の間が均一になるため見やすくなります。

// 伸縮なし
$pdf->Cell(40, 10, 'あいうえお', '1', '1', 'L', false, '', '');
// $stretch = 3
$pdf->Cell(40, 10, 'あいうえお', '1', '1', 'L', false, '', '3');
// $stretch = 4
$pdf->Cell(40, 10, 'あいうえお', '1', '1', 'L', false, '', '4');

画像4

次に幅が狭いときに挙動を見ていきます。

画像5の一番上が伸縮なしでの表示です。

画像5の2段目が$stretchを3に設定、一番下が$stretchを4に設定した場合の表示になります。$stretchが3,4の両方のパターンとも文字が幅に合わせて小さくなるため、文字が重なって出力されます。

// 伸縮なし
$pdf->Cell(20, 10, 'あいうえお', '1', '1', 'L', false, '', '');
// $stretch = 3
$pdf->Cell(20, 10, 'あいうえお', '1', '1', 'L', false, '', '3');
// $stretch = 4
$pdf->Cell(20, 10, 'あいうえお', '1', '1', 'L', false, '', '4');

画像5

$stretchを3に設定しても、文字が枠内に収まる場合のみ動くため、基本的に文字が重なった状態での表示となります。幅に合わせて均一に幅を広げたい場合は$stretchを4に設定し、文字の入る幅を広めに取ると見栄えが良くなります。

まとめ

出力する内容や目的によってストレッチモードを活用する場面は多々あるかと思います。
文字を枠内に収めた場合は$stretch の値を1に、均等割り付けを行いたい場合は4を使用すると良いと思います。
私自身プログラム開発の時に悩むことがあり、こういった記事を書きました。


システムデザイン開発は、北海道の地で35年以上の歴史があります。企業向けのシステム設計~開発・構築~保守運用までワンストップサービスを提供するシステム開発会社です。豊富な開発実績と高い技術力を強みとして、北海道から全国へ幅広い分野・業種へトータルにサポートいたします。

システムの導入やご検討、お困りごとがありましたら、お気軽にご相談・お問合せください。

SDDの受託システムとは?

お問い合わせはこちら

タイトルとURLをコピーしました