前回からの続きでlibHaruを使って文字列を扱ってみます。
文字の表示
IPAゴシック、IPA明朝の等幅フォントを使って文字を表示してみます。主なポイントは次の通りです。
- 日本語を使う場合は、useJPEncodings()で日本語エンコーディングを有効にする必要があります。今回はIPAフォントを使いますが、組み込みの日本語フォントを使う場合は、useJPFonts()で有効にします。
- getFont()の第2引数でエンコーディングを指定します。エンコーディングの一覧はこちら。日本語でつかえるのは、RKSJの付く3つとEUCで始まる2つです。名前の通り、前3つはSJIS、後の2つはEUCです。Hは横書き、Vは縦書きです。
- 文字をレンダリングするときのモードが塗りつぶしや外形のみなど8種類あり、setTextRenderingMode()で指定できます。
- beginText()でテキストの挿入開始、endText()終了。
- textOut()で挿入位置を指定しますが、文字のベースラインの開始点(横書きなら左端)が基準になります。文字の左下、左上ではないことに注意が必要です。
- ベースラインからの上下の幅はgetAscent(), getDescent()で得られます。フォントサイズに対するパーミル値を返しますので、1000で除したものをフォントサイズに乗ずれば幅が得られます。
コード例:日本語の表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
<?php try { $doc = new HaruDoc; $doc->setPageMode(HaruDoc::PAGE_MODE_USE_THUMBS); $doc->useJPFonts(); $doc->useJPEncodings(); $page = $doc->addPage(); $page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE); $page_w = $page->getWidth(); $page_h = $page->getHeight(); $font_name = $doc->loadTTF('/usr/share/fonts/opentype/ipafont-gothic/ipag.ttf', true); $ipag = $doc->getFont($font_name,'90msp-RKSJ-H'); $font_name = $doc->loadTTF('/usr/share/fonts/opentype/ipafont-mincho/ipam.ttf', true); $ipam = $doc->getFont($font_name,'90msp-RKSJ-H'); $page->setRGBStroke(1, 0, 0); $page->setRGBFill(0, 0, 0); $modes = array( HaruPage::FILL, HaruPage::STROKE, HaruPage::FILL_THEN_STROKE, HaruPage::INVISIBLE, HaruPage::FILL_CLIPPING, HaruPage::STROKE_CLIPPING, HaruPage::FILL_STROKE_CLIPPING, HaruPage::CLIPPING ); $page->beginText(); $i = 0; foreach($modes as $mode) { $page->setTextRenderingMode($mode); $page->setFontAndSize($ipag, 40); $ascent = ($ipag->getAscent() / 1000) * 40; $page->textOut(0, $page_h - $ascent - 40 * $i, mb_convert_encoding("薔薇、憂鬱、麒麟", 'SJIS-win', 'UTF-8')); $page->setFontAndSize($ipam, 40); $ascent = ($ipam->getAscent() / 1000) * 40; $page->textOut(400, $page_h - $ascent - 40 * $i, mb_convert_encoding("薔薇、憂鬱、麒麟", 'SJIS-win', 'UTF-8')); $i++; } $page->endText(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename=test.pdf'); $doc->output(); } catch(Exception $e) { echo $e->getFile().'('.$e->getLine().'):'.$e->getMessage(); } ?> |
文字列の幅
描画した文字列の幅を求めるには、HaruPage::getTextWidth()を使います。HaruFontにも同じ名前のメソッドがあるので要注意です。
コード例:アンダーライン
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
<?php try { $doc = new HaruDoc; $doc->setPageMode(HaruDoc::PAGE_MODE_USE_THUMBS); $doc->useJPFonts(); $doc->useJPEncodings(); $page = $doc->addPage(); $page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE); $page_w = $page->getWidth(); $page_h = $page->getHeight(); $font_name = $doc->loadTTF('/usr/share/fonts/opentype/ipafont-mincho/ipam.ttf', true); $ipam = $doc->getFont($font_name,'90msp-RKSJ-H'); $font_name = $doc->loadTTF('/usr/share/fonts/opentype/ipafont-mincho/ipamp.ttf', true); $ipamp = $doc->getFont($font_name,'90msp-RKSJ-H'); $page->setRGBStroke(1, 0, 0); $page->setRGBFill(0, 0, 0); $page->beginText(); $page->setTextRenderingMode(HaruPage::FILL); $text = mb_convert_encoding('等幅フォントとプロポーショナルフォント', 'SJIS-win', 'UTF-8'); $page->setFontAndSize($ipam, 36); $page->textOut(50, $page_h - 50, $text); $ipam_width = $page->getTextWidth($text); $ipam_descent = $ipam->getDescent(); $page->setFontAndSize($ipamp, 36); $page->textOut(50, $page_h - 100, $text); $ipamp_width = $page->getTextWidth($text); $ipamp_descent = $ipamp->getDescent(); $page->endText(); $page->moveTo(50, $page_h - 50); $page->lineTo(50 + $ipam_width, $page_h - 50); $page->stroke(); $page->moveTo(50, $page_h - 100); $page->lineTo(50 + $ipamp_width, $page_h - 100); $page->stroke(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename=test.pdf'); $doc->output(); } catch(Exception $e) { echo $e->getFile().'('.$e->getLine().'):'.$e->getMessage(); } ?> |
moveToTextPos()による位置決め
長い文章を表示する場合、textOut()での位置決めは大変ですので、moveTextPos()を使います。行の送り幅を定義(setTextLeading())して改行(showTextNextLine())で改行することもできます。
コード例:改行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
<?php try { $doc = new HaruDoc; $doc->setPageMode(HaruDoc::PAGE_MODE_USE_THUMBS); $doc->useJPFonts(); $doc->useJPEncodings(); $page = $doc->addPage(); $page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE); $page_w = $page->getWidth(); $page_h = $page->getHeight(); $font_name = $doc->loadTTF('/usr/share/fonts/opentype/ipafont-mincho/ipam.ttf', true); $ipam = $doc->getFont($font_name,'90msp-RKSJ-H'); $font_name = $doc->loadTTF('/usr/share/fonts/opentype/ipafont-mincho/ipamp.ttf', true); $ipamp = $doc->getFont($font_name,'90msp-RKSJ-H'); $page->setRGBStroke(1, 0, 0); $page->setRGBFill(0, 0, 0); $page->beginText(); $page->setTextRenderingMode(HaruPage::FILL); $text = mb_convert_encoding('moveToText()とshowText()で文字列を表示', 'SJIS-win', 'UTF-8'); $page->setFontAndSize($ipam, 18); $page->setTextLeading(18); $page->moveTextPos(0, $page_h - 18); $page->showText($text); $page->showText($text); $page->showTextNextLine($text); $page->endText(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename=test.pdf'); $doc->output(); } catch(Exception $e) { echo $e->getFile().'('.$e->getLine().'):'.$e->getMessage(); } ?> |
文字列の変形
setTextMatrix()で文字列を変形させることができます。
コード例:文字列の変形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
<?php try { $doc = new HaruDoc; $doc->setPageMode(HaruDoc::PAGE_MODE_USE_THUMBS); $doc->useJPFonts(); $doc->useJPEncodings(); $page = $doc->addPage(); $page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE); $page_w = $page->getWidth(); $page_h = $page->getHeight(); $font_name = $doc->loadTTF('/usr/share/fonts/opentype/ipafont-mincho/ipam.ttf', true); $ipam = $doc->getFont($font_name,'90msp-RKSJ-H'); $font_name = $doc->loadTTF('/usr/share/fonts/opentype/ipafont-mincho/ipamp.ttf', true); $ipamp = $doc->getFont($font_name,'90msp-RKSJ-H'); $page->setRGBStroke(1, 0, 0); $page->setRGBFill(0, 0, 0); $page->beginText(); $page->setTextRenderingMode(HaruPage::FILL); $text = mb_convert_encoding('変形', 'SJIS-win', 'UTF-8'); $page->setTextMatrix(2, pi()/8, pi()/4, 1, 0, 0); $page->setFontAndSize($ipam, 36); $page->textOut(50, $page_h - 200, $text); $page->setTextMatrix(1, pi()/4, pi()/4, 2, 0, 0); $page->setFontAndSize($ipam, 36); $page->textOut(250, $page_h - 200, $text); $page->setTextMatrix(1, pi(), pi(), 1, 0, 0); $page->setFontAndSize($ipam, 36); $page->textOut(350, $page_h - 200, $text); $page->endText(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename=test.pdf'); $doc->output(); } catch(Exception $e) { echo $e->getFile().'('.$e->getLine().'):'.$e->getMessage(); } ?> |
次回はパスワードの設定などについてみていきます。