SHOEISHA iD

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

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

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

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

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

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

日本語出力での基本の流れ

 Haruの日本語でのPDFの書き出しの流れを、以下に示します。

日本語出力での基本の流れ(code_1.php)
<?php
//  空のページを作成
$haru_doc = new HaruDoc();

// 日本語を使うための処理
$haru_doc->useJPFonts();         // <--- (1)
$haru_doc->useJPEncodings();     // <--  (2)

//  ページを追加
$page = $haru_doc->addPage();   // <-- (3)

//  A4サイズ縦に指定
$page->setSize(HaruPage::SIZE_A4,HaruPage::PORTRAIT);  // <-- (4)

//  使用するフォントオブジェクトを作成
$font = $haru_doc->getFont('MS-PGothic','90msp-RKSJ-H');  // <-- (5)
$page->setFontAndSize($font,10);  // <-- (6)

//
// ・・・ここでデータを書き出す
//

//  指定したファイルに書き出す
$haru_doc->save("pdf/sample1_1.pdf"); // <-- (7)
?>

 (1)(2)で日本語フォントと、日本語エンコーディングのデータを内部にロードします。この処理は日本語を扱う場合に必要ですので、忘れずに実行してください。

 次に、(3)でドキュメントにページを追加します。PDFではページごとにサイズや方向を指定できます。A4のように規定のサイズの場合には(4)のようにsetSize()を使ってページサイズと方向(縦もしくは横)を指定します。A4以外にも通常使うサイズは定数として定義してありますので、詳しくはPHPのマニュアルを参照してください。また、setWidthメソッドやsetHeightメソッドなどを使って個別に指定することもできます。

 (5)では(1)や(2)でロードしたフォント情報を、ドキュメントオブジェクトから取得します。取得したフォントとフォントサイズを(6)でページに設定します。フォントを埋め込まずに指定できる日本語フォントは以下の4つです。

  • MS-Gothic(MS-ゴシック)
  • MS-PGothic(MS-ゴシック・プロポーショナルフォント)
  • MS-Mincyo(MS-明朝)
  • MS-PMincyo(MS-明朝・プロポーショナルフォント)

 フォント名に続いてカンマで区切った後に、イタリックとボールド指定が行えます。

  • MS-Gothic,Bold
  • MS-Gothic,Italic
  • MS-Gothic,BoldItalic

 また、エンコーディングは通常のSJISやUTF-8といったエンコーディングではなく、PDF特有のエンコーディングを指定する必要があります。日本語のエンコーディングは

  • 90ms-RKSJ-H(横書きでのShift_JIS)
  • 90ms-RKSJ-V(縦書きでのShift_JIS)
  • 90msp-RKSJ-H(プロポーショナルのShift_JIS)
  • EUC-H(横書きのEUC-JP)
  • EUC-V(縦書きのEUC-JP)

の5つが指定できます。

 このフォントとエンコーディングはPDFの仕様によって決められており、libharu側で実装されているもののみが指定可能です。libharuのドキュメントを読めば分かりますが、PHP側のマニュアルなどにその記載がないために何が指定できるのか悩むところでもあります。注意してください。

 最後に、PDFをファイルとして書き出す処理が、(7)のsaveメソッドです。引数にはファイル名を指定してください。また、ファイルに書き出す代わりにブラウザ上で直接PDFを表示させるには、以下のようにします。

ブラウザ上に直接PDFを表示させる
header("Content-Type: application/pdf");
$haru_doc->output();

文字を出力する

 続いて、実際に文字を出力します。

 その前に、日本語を出力する際には文字をエンコードする必要があります。この記事内では以下の関数を通してすべて文字を出力していきます。

文字コードの変換
function encode($text){
  return mb_convert_encoding($text,"SJIS-win", "UTF-8");
}

 文字の出力の方法には大きく分けて2つあります。まずは、もっとも基本的な文字の出力方法で、絶対位置に文字を表示します。変数名などは、先ほどの「日本語出力での基本の流れ」で指定したものに沿っています。

文字の出力(code_2.phpの一部)
$y = $page->getHeight();

$page->beginText();                                    // <---- (1)
$page->moveTextPos(100,$y - 200);                      // <-----(3)
//  以下の指定で1行当たりの高さを指定
$page->setTextLeading(14);                             // <---- (4)
$text1 = encode("Haruでの文字の表示方法です");
$page->showText($text1);                               // <---- (5)

//  指定した行の高さに従って表示
$text2 = encode("続いて、改行された文を出力します");
$page->showTextNextLine($text2);                       // <---- (6)
 
$page->setTextLeading(18);
$page->setFontAndSize($font,16);
$page->showTextNextLine(encode("途中で大きさを変えることもできます"));
 
$page->endText();                                     //  <----- (2)

 これを実行すると、以下のようになります。

実行結果
実行結果

 文字は必ず(1)beginTextメソッドと(2)endTextメソッドの間で出力します。また、(3)moveTextPosメソッドで文字の出力を始める(x,y)を設定し、(4)setTextLeadingメソッドで行間を指定します。これで、(5)showTextメソッドで最初の行を出力しますし、(6)showTextNextLineメソッドで改行した位置で文字を出力します。

 なお、途中で文字のサイズを変更することや、行間を変更することもできます。以下のように文字列内に改行コード(CRやLF)を含めても、PDFで出力される場合には改行はされませんので注意してください。

改行コードの注意点
$page->showText(encode("1行目\r\n2行目");

次のページ
文字を自動的に改行させる

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

ライセンス制限が緩く高速で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」など、さまざまなカンファレンスを企画・運営しています。

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

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

メールバックナンバー