PHPでPDF出力 5(縮小・折り返しで全体表示)
5.「縮小・折り返して全体を表示する」の処理の追加
文字表示の体裁も罫線もは整ったのだが、Excelのセル書式には、「縮小して全体を表示する」と「折り返して全体を表示する」のオプションがある。
ジェネレーターでは、値が可変の場合に対応できないため、PHP側で出力時に定義することになる。
TCPDFには、文字列を出力する時の幅と高さを取得する関数が用意されている。
getStringWidth(セル幅、文字列)
getStringHeight(文字列、フォント名、フォントスタイル、フォントサイズ、文字単位)
出力するセル幅はと高さはジェネレーターで取得し、Cell関数に引数として渡している。
縮小して全体を表示は、
セル幅に出力する文字列が収まるかを判定し、収まらない場合はフォントサイズを下げて再度セル幅をチェックすればいい。
関数化したソースは以下のようになる。
-----------------------------------------------------------------------------
//$source:文字列, $width:表示する幅, $font:フォント名, $size:フォントサイズ
public function adjustToWidth($source, $width, $font, $size) {
global $tcpdf;
$text = mb_substr($source,$pos, null,"UTF-8");
$fontsize = $size;
while(1) {
// $width - 0.5は、二重線対応(0.5ミリずらす)
if ($tcpdf->GetStringWidth($text,$font,"",$fontsize) <= ($width-0.5)) {
break;
} else {
$fontsize = $fontsize - 1;
//フォントサイズの最小は6ポイントに設定
if ($fontsize < 7) break; }
}
return $fontsize;
}
-----------------------------------------------------------------------------
折り返して全体を表示は、
セル幅に出力する文字列が収まるかの判定は、「縮小して全体を表示」と同じであるが、オーバーした文字列を改行して表示する必要がある。
残念ながら、TCPDFにはセル内改行の機能はないので、縦横の座標を変えて表示することとした。
-----------------------------------------------------------------------------
//$source:文字列, $pos:開始文字位置, $maxwidth:表示エリア幅, $width:表示する幅, $height:行の高さ
public function adjustToHeight($source, $pos, $maxwidth, $width, $height) {
global $tcpdf;
$info = array(); //連想配列で返す
$text = mb_substr($source,$pos, null,"UTF-8");
//文字高さを取得
$hei = $tcpdf->getStringHeight(0,mb_substr($text,0,1,"UTF-8"));
$info["text"] = $text; //表示する文字列
$info["height"] = $hei; //高さ
$info["length"] = -1; //折り返す文字数 -1:折り返しなし
if ($pos == 0 ) {
$info["height"] = $height;
}
//文字列の文字単位で幅を配列で取得
$arrlen = $tcpdf->GetStringWidth($text,"","","",true);
$len = 0;
if ($tcpdf->GetStringWidth($text) > $maxwidth) {
$blktxt = $text;
$text="";
for ($j =0; $j < count($arrlen); $j++) {
$len += $arrlen[$j];
if ($len > $width) {
$info["text"] = $text;
$info["height"] = $hei;
$info["length"] = $j + $pos;
break;
}
$text .= mb_substr($blktxt,$j,1,"UTF-8");
}
if ($j == count($arrlen)) {
$info["length"] = -1; }
}
return $info;
}
-----------------------------------------------------------------------------
ジェネレーターを下記のソース出力に修正する。
$source ='120000';
$info = adjustToWidth($source, 18,kozgopromedium,18);
$tcpdf->SetFont('kozgopromedium', '',$info);
$tdpdf->SetXY($hPos, $pos);
$tcpdf->Cell(18,13, $source, 0, 0,'C',0,'',0,0,'T','M');
結果は、サイズが微妙に大きくなるが、ほぼ満足いくものであったが、
折り返して全体を表示するで、後に問題が発生する。
ジェネレーターで出力された定義をコピペで、PHPソースに貼り付けているのを、
ファイル出力で渡すことにした。
また、Excelは項目は固定ではなく可変であることを考慮して、関数はクラスに変更する。
次回は、それらをメモる。