PHPでPDFを生成する方法はいろいろありますが、実験的なモジュールではありますが、PHPのマニュアルにも掲載のあるlibHaruを使ったものを使ってみました。
環境は、Ubuntu12.04、PHP5.3です。
インストール
libharuを入れて、peclでインストールできます。
1 2 |
$ sudo apt-get install libhpdf-dev $ sudo pecl install haru |
PHPにharu.soを読み込む設定を追加してapacheを再起動します。
/etc/php5/apache2/conf.d/haru.ini
1 |
extension=haru.so |
phpinfo()の出力にharuが追加されていればOKです。
日本語文字出力にIPAフォントを使いますので、インストールしていない場合は、インストールします。
1 |
$ sudo apt-get install fonts-ipafont-gothic fonts-ipafont-mincho |
図形の描画
ドキュメントの左下が座標の原点となり、長さの単位はDTPポイントを使います。A4横の場合、幅は841.89001464844、高さは595.27600097656です。
コード例:ページの背景色をグレーに
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 |
<?php try { $doc = new HaruDoc; $doc->setPageMode(HaruDoc::PAGE_MODE_USE_THUMBS); $page = $doc->addPage(); $page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE); $page_w = $page->getWidth(); $page_h = $page->getHeight(); $page->setRGBStroke(0.7, 0.7, 0.7); $page->setRGBFill(0.7, 0.7, 0.7); $page->rectangle(0, 0, $page_w, $page_h); $page->fillStroke(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename=test.pdf'); $doc->output(); } catch(Exception $e) { echo $e->getFile().'('.$e->getLine().'):'.$e->getMessage(); } ?> |
コード例:基本的な図形の描画
図形の描画はペン(setRBGStroke, setDash, setLineWidth etc)と刷毛(setRGBFill etc)を選んで、描画(stroke, fillStroke)を行います。
直線はペンを始点に移動して終点を指定して描画します。少し違和感があるのが、円弧の開始角、終了角で、時計の12時の位置を0度として時計回りに角度を測ります。
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 |
<?php try { $doc = new HaruDoc; $doc->setPageMode(HaruDoc::PAGE_MODE_USE_THUMBS); $page = $doc->addPage(); $page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE); $page_w = $page->getWidth(); $page_h = $page->getHeight(); $page->setRGBStroke(0.7, 0.7, 0.7); $page->setRGBFill(0.7, 0.7, 0.7); $page->rectangle(0, 0, $page_w, $page_h); $page->fillStroke(); $page->setRGBStroke(1, 0, 0); $page->setRGBFill(0, 0, 1); // 直線 $page->moveTo(0, $page_h); $page->lineTo(100, $page_h - 100); $page->stroke(); // 円弧 $page->arc(100, $page_h - 100, 100, 0, 225); $page->stroke(); // 円 $page->setLineWidth(5); $page->circle(310, $page_h - 100, 100); $page->fillStroke(); // 楕円 $page->setDash(array(15, 3), 0); $page->ellipse(420, $page_h - 100, 120, 80); $page->stroke(); // 傾いた矩形 $page->setLineWidth(1); $page->setDash(array(), 0); $page->moveTo(200, $page_h - 350); $page->lineTo(200 + 80, $page_h - 350 + 60); $page->lineTo(200 + 80 - 30, $page_h - 350 + 60 + 40); $page->lineTo(200 + 80 - 30 - 80, $page_h - 350 + 60 + 40 - 60); $page->closePath(); $page->fillStroke(); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename=test.pdf'); $doc->output(); } catch(Exception $e) { echo $e->getFile().'('.$e->getLine().'):'.$e->getMessage(); } ?> |
ベジェ曲線も描画できますが今回は割愛します。
画像の挿入
画像を挿入するときに指定する座標は、画像の左上の位置になります。
コード例:PNG画像の挿入
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 |
<?php try { $doc = new HaruDoc; $doc->setPageMode(HaruDoc::PAGE_MODE_USE_THUMBS); $page = $doc->addPage(); $page->setSize(HaruPage::SIZE_A4, HaruPage::LANDSCAPE); $page_w = $page->getWidth(); $page_h = $page->getHeight(); $page->setRGBStroke(0.7, 0.7, 0.7); $page->setRGBFill(0.7, 0.7, 0.7); $page->rectangle(0, 0, $page_w, $page_h); $page->fillStroke(); $img = $doc->loadPNG(__DIR__ . '/Emacs23.png'); $page->drawImage($img, 0, $page_h - $img->getHeight(), $img->getWidth(), $img->getHeight()); header('Content-Type: application/pdf'); header('Content-Disposition: attachment; filename=test.pdf'); $doc->output(); } catch(Exception $e) { echo $e->getFile().'('.$e->getLine().'):'.$e->getMessage(); } ?> |
次回は文字についてみていきます。