SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine(コードジン) DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ライセンス制限が緩く高速でPDFを作成可能なPHPライブラリ「Haru」

PHP::Haruで基本的なPDFを作成する

ライセンス制限が緩く高速でPDFを作成可能なPHPライブラリ「Haru」(1)

文字を自動的に改行させる

 showTextメソッドやshowTextNextLineメソッドでは、指定した位置から文字を開始することはできますが、文章が長い場合には、ページのサイズからはみ出してしまう問題もあります。このような場合に、Haruでは文字の自動改行を行うことが可能です。

 その場合には、まずテキストとして出力する領域を決めます。次に、この領域にテキストを流し込むような形で文字を表示していきます。以下に実際のコードと実行結果を示します。

文字の自動改行(code_3.phpの一部)
$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方式でも指定できます。

プログラム4:文字色の指定(code_4.phpの一部)
$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値を多少調整します。

文字の下線(code_5.phpの一部)
$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)
実行結果
実行結果

 同様の手順で、今度は文字に取消線を書き出します。

 取消線は、文字の中央の高さなのでフォントサイズの中央で引けばよいのですが、今回は、より中央に表示されるようにフォントデータから高さを算出して、線を引くようにします。ただし、フォントの高さを求めるには、以下の図のように、フォント内のいくつかの情報を調べる必要があります。

フォントのサイズ構成
フォントのサイズ構成
文字の打ち消し線(code_6.phpの一部)
$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メソッドはベースラインから下に向かう高さです。文字によっては、ベースラインより下に出てしまうものもありますので、このような高さの区別があります。

 このコードを実行した結果が以下のようになります。

実行結果
実行結果

囲み文字を実現する

 次に、以下のような少々複雑な文字を表示してみます。

実行結果
実行結果
囲み文字(code_7.phpの一部)
$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の暗号化(パスワードでのプロテクト処理)などの処理と、少々複雑なレイアウト処理などの実装方法を紹介します。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
ライセンス制限が緩く高速でPDFを作成可能なPHPライブラリ「Haru」連載記事一覧
この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7141 2013/05/28 14:00

おすすめ

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー