Zend_Pdf を使ってみる

Zend_Pfd を使って、PDF を生成してみました。結果からいうと日本語でもフォントさえあればちゃんと描画できるようです。画像を表示するには php-gd が入っている必要があります。

Util_PDF

IPAゴシックフォントを入手して、適当なところに置き、その場所を指定します。Zend_Pdf_XXX と何百回も書かなくてもすますためのラッパーです。

<?php
class Util_PDF {
    public $pdf;
    public $font;
    public $page;
    
    /**
     * コンストラクタ
     */
    public function Util_PDF() {
        $this->pdf  = new Zend_Pdf();
        $this->font = Zend_Pdf_Font::fontWithPath('/somewhere/ipag.ttf');
    }

    /**
     * 新しいページを作る
     */
    public function newPage() {
        $this->page = $this->pdf->newPage(Zend_Pdf_Page::SIZE_A4);
        $this->page->setFont($this->font,36);
        $this->pdf->pages[] = $this->page;
        return $this->page;
    }

    /**
     * ページの幅を得る
     */
    public function pageWidth() {
        return $this->page->getWidth();
    }

    /**
     * ページの高さを得る
     */
    public function pageHeight() {
        return $this->page->getHeight();
    }

    /**
     * 画像を描画する
     * @args $path 画像のフルパス
     * @args $x 
     * @args $y 
     * @args $w 
     * @args $h 
     */
    public function drawImage($path, $x, $y, $w, $h) {
        $image = Zend_Pdf_Image::imageWithPath($path);
        $pagew = $this->pageWidth();
        $pageh = $this->pageHeight();
        $y = $pageh - $y - $h;
        $this->page->drawImage($image, $x, $y, $x + $w, $y + $h);
    }

    /**
     * 直線を描画する
     * @args $x1 
     * @args $y1 
     * @args $x2 
     * @args $y2 
     * @args $html_color 描画色(#000000形式)
     */
    public function drawLine($x1, $y1, $x2, $y2, $html_color = '#000000') {
        $this->page->setLineColor(new Zend_Pdf_Color_Html($html_color));
        $pagew = $this->pageWidth();
        $pageh = $this->pageHeight();
        $y1 = $pageh - $y1;
        $y2 = $pageh - $y2;
        $this->page->drawLine($x1, $y1, $x2, $y2);
    }

    /**
     * 矩形を描画する
     * @args $x1 
     * @args $y1 
     * @args $x2 
     * @args $y2 
     * @args $html_color 描画色(#000000形式)
     */
    public function drawRect($x1, $y1, $x2, $y2, $html_color = '#000000') {
        $this->page->setLineColor(new Zend_Pdf_Color_Html($html_color));
        $pagew = $this->pageWidth();
        $pageh = $this->pageHeight();
        $y1 = $pageh - $y1;
        $y2 = $pageh - $y2;
        $this->page->drawRectangle($x1, $y1, $x2, $y2, Zend_Pdf_Page::SHAPE_DRAW_STROKE);
    }

    /**
     * 直線を描画する
     * @args $text 文字列(SJIS)
     * @args $x 
     * @args $y 
     * @args $html_color 描画色(#000000形式)
     */
    public function drawText($text = '', $x, $y, $html_color = '#000000') {
        $this->page->setFillColor(new Zend_Pdf_Color_Html($html_color));
        $pagew = $this->pageWidth();
        $pageh = $this->pageHeight();
        $y = $pageh - $y;
        $this->page->drawText($text, $x, $y, 'SJIS');
    }

    /**
     * PDFを描画する
     */
    public function render() {
        return $this->pdf->render();
    }
}

test.php

ヘッダを指定する以外は非常に簡単に PDF を生成できることがわかると思います。日本語フォントはメモリを馬鹿食いするので、かなり大きめにメモリを確保しておかないと死にます。

<?php
ini_set('memory_limit','-1');
header('Content-Type: application/pdf');
header('Content-Disposition: attachment; filename=test' . time() . '.pdf');

$pdf = new Util_PDF();

$pdf->newPage();
$pdf->drawImage('/somewhere/hogehoge.jpg',0,0,$pdf->pageWidth(),$pdf->pageHeight());
$pdf->drawLine(0,80,60,160,'#FF0000');

$pdf->newPage();
$pdf->drawRect(0,160,60,240,'#00FF00');
$pdf->drawText("テスト",50,300,'#0000FF');

echo $pdf->render();