【導入】
PDF_fit_textlineの「fitmethod」オプションで「nofit」以外のどれを選んでもフォントサイズが変更される可能性がある。
ここで、チラシに複数の店舗名を縦に列記するという例を考えてみると、下記のような要求をされることが多い。
・1つの店舗当たりの領域(横幅)は同一
・店舗名の文字数に関わらずフォントサイズは同一
この場合「フォントサイズは同一」ということを実現するためには「nofit」を選ぶしかないが、
文字数が多いと領域からはみ出してしまう。
これを解決するためには「1文字あたりの文字幅を縮小する」しかない。
【文字数から1文字あたりの縮小率を割り出す】
まず、下準備として領域内の最大文字数を決める必要がある。
これは、領域幅が固定、フォントサイズも固定であるのだから容易に割り出せるはず。
$lengthを出力する文字数、$max_lengthを領域内の最大文字数とすると、
$ratio = $max_length / $length * 100;
で求められる$ratioが1文字幅の縮小率である。
(ただし、「$length <> 0」 かつ 「$max_length < $length」)
この縮小率をPDF_fit_textlineの「horizscaling」オプションにセットすればよい。
【例1】
1文字当たりの縮小率を算出する処理
/* ================================================== */
/* 文字幅比率の決定
/* ================================================== */
function GetLetterWidthRatio($text,$max_length) {
$ratio = 0;
//文字数を取得
$length = mb_strlen($text);
//最大文字数を超える場合は比率を算出
if ($max_length < $length) {
$ratio = $max_length / $length * 100;
}
//最大文字数以内ならば等倍
else {
$ratio = 100;
}
return $ratio;
}
/* ================================================== */
【例2】
(x1,y1)(x2,y2)=(0,0)(100,200)の領域に
「x軸左寄せy軸中央配置」で「1文字の幅を縮小率80%」で
文字列"abcde"を出力する
//出力文字列
$val = "abcde";
//始点
$x = 0;
$y = 0;
//領域サイズ指定
$box_w = 100;
$box_h = 200;
//寄せの指定
$align_x = "0";
$align_y = "50";
//フィットタイプの指定
$fittype = "nofit";
//縮小率の指定
$horizscaling = "80";
//オプション引数の組み立て
$opt_str = "boxsize {".$box_w." ";
$opt_str .= $box_h."} ";
$opt_str .= "position {".$align_x." ";
$opt_str .= $align_y."} ";
$opt_str .= "fitmethod $fittype ";
$opt_str .= "horizscaling $horizscaling";
//テキスト描画実行
PDF_fit_textline($pdf_obj,$val,$x,$y,$opt_str);
The Owl's Nest Cottage
http://www.newadvent.org/cathen/07251c.htm
龠龠龠
The Owl's Nest Cottage
http://www.newadvent.org/cathen/07251c.htm
龠龠龠
The Owl's Nest Cottage
http://www.newadvent.org/cathen/07251c.htm
龠龠龠