文字を自動的に改行させる
showTextメソッドやshowTextNextLineメソッドでは、指定した位置から文字を開始することはできますが、文章が長い場合には、ページのサイズからはみ出してしまう問題もあります。このような場合に、Haruでは文字の自動改行を行うことが可能です。
その場合には、まずテキストとして出力する領域を決めます。次に、この領域にテキストを流し込むような形で文字を表示していきます。以下に実際のコードと実行結果を示します。
$page->beginText();
// 指定した四角の中で改行されるように文字を出力する
$page->textRect(
100, // left
600, // top
180, // right
400, // bottom
encode("Haruの使い方を紹介します。\n続いて、自動的に改行をする出力の方法です"),
HaruPage::TALIGN_LEFT
);
$page->endText();
こちらの記述の場合には、文字列内に改行を含ませた場合、そのままPDFへも改行が反映されます。また、領域を指定する際には、topよりもbottomの方が値が小さくなりますので注意してください。
文字に色を付ける
次に文字に色を付けます。
文字の出力の前にsetRGBFillメソッドで色を指定します。(1)で赤を指定し、(2)で青を指定しています。また、色を指定する方法にはRGB以外にも、setCMYKFillメソッドでCYMK方式でも指定できます。
$y = $page->getHeight();
$page->beginText();
$page->setRGBFill(1,0,0); // <---- (1)
$page->textOut(100,$y-200,encode("赤文字"));
$cp = $page->getCurrentTextPos();
$page->setRGBFill(0,0,1); // <---- (2)
$page->textOut($cp['x'],$y - 200,encode("青文字"));
$page->endText();
文字に下線や打ち消し線を引く
Haruでは直接、文字に下線を引いたり、取消線を引いたりするメソッドはありません。このため、文字の位置と、線を引くことで装飾を行っていきます。
以下は、文字に下線を引くコードです。
getCurrentTextPosメソッドを文字の出力前(1)と出力後(2)で取得しておき、その文字で移動した位置を取得します。下線を引くためには、文字の下のY値と移動したX値に線を引けば下線が実現できます。
まず、(3)で線の太さを指定します。0が最も細い線です。(4)で線の色を指定して、(5)で線の始点を指定し、(6)(7)で線を引きます。下線の位置が文字にかかってしまうことを避けるために、Y値を多少調整します。
$y = $page->getHeight();
$page->beginText();
$page->setRGBFill(0,0,0);
$page->moveTextPos(100,$y - 200);
$p1 = $page->getCurrentTextPos(); // <---- (1)
$text = encode("文字に下線を引きます");
$page->showText($text);
$p2 = $page->getCurrentTextPos(); // <---- (2)
$page->endText();
$page->setLineWidth(0); // <---- (3)
$page->setRGBStroke(0,0,0); // <---- (4)
$page->moveTo($p1['x'],$p1['y']-2); // <---- (5)
$page->lineTo($p2['x'],$p1['y']-2); // <---- (6)
$page->stroke(); // <---- (7)
同様の手順で、今度は文字に取消線を書き出します。
取消線は、文字の中央の高さなのでフォントサイズの中央で引けばよいのですが、今回は、より中央に表示されるようにフォントデータから高さを算出して、線を引くようにします。ただし、フォントの高さを求めるには、以下の図のように、フォント内のいくつかの情報を調べる必要があります。
$font_size = 20;
// 省略
$size = $font->getAscent() + // <---- (1)
$font->getDescent(); // <---- (2)
$size = $size / 1000 * $font_size;
$y = $p1['y'] + $size / 2;
$page->setLineWidth(1);
$page->setRGBStroke(0,0,0);
$page->moveTo($p1['x'],$y);
$page->lineTo($p2['x'],$y);
$page->stroke();
(1)getAscentメソッドはベースラインから上に向かう高さ、(2)getDescentメソッドはベースラインから下に向かう高さです。文字によっては、ベースラインより下に出てしまうものもありますので、このような高さの区別があります。
このコードを実行した結果が以下のようになります。
囲み文字を実現する
次に、以下のような少々複雑な文字を表示してみます。
$char_space = 10;
$page->setCharSpace($char_space); // <---- (1)
$text = "囲み文字";
$text_width = $font->getTextWidth(encode($text));
$text_w = $text_width['width'] * $font_size/1000 +
($char_space * (mb_strlen($text,"UTF-8") -1 )); // <---- (2)
$text_h = ($font->getCapHeight() * $font_size / 1000 )
- ($font->getDescent() * $font_size / 1000); // <---- (3)
$margin_h = 20; // 縦のマージン
$margin_x = 20; // 横のマージン
$page->setRGBFill(0.5,0.5,0.5); // 四角形の色をグレーにする
$page->setRGBStroke(0,0,0); // 四角形のボーダーを黒にする
$page->rectangle(100 ,
$y - ( 200 + $margin_h/2),
$text_w + $margin_x ,
($text_h + $margin_h )); // <---- (4)
$page->fillStroke();
$page->setRGBFill(1,1,1); // <---- (5)
$page->beginText();
$page->moveTextPos(100 + $margin_x /2 ,$y - 200); // <---- (6)
$page->showText(encode($text));
$page->endText();
まず(1)setCharSpaceメソッドで文字の間隔を広げます(英語の場合は単語の間隔を指定する別のメソッドもあります)。文字の間隔も考慮すると、(2)のようにして実際の幅を算出します。
また、文字の高さを(3)算出すれば、表示四角形の縦、横サイズが計算できたことになります。後はそのサイズに沿った四角形を描写します。
このときに、ある程度のマージン(margin_xとmargin_h)を考慮し、(4)四角形を描写します。次に文字色を白に指定(5)してから、描写した四角形の上に配置されるように文字の出力位置を指定し(6)、文字を出力します。文字を出力してから、四角形を描写すると文字がすべて隠れてしまいますので、順番には注意してください。
最後に
今回はHaruを使ってPDFを作成する基本的な流れから、文字を出力する方法を紹介しました。ここまでの内容を参考にしてリファレンスを読むことで、もっといろいろなことができます。特に、文字に関する細かいデータを取得できることが分かったと思います。
次回は画像の表示やPDFの暗号化(パスワードでのプロテクト処理)などの処理と、少々複雑なレイアウト処理などの実装方法を紹介します。
