PHP7でPDFを日本語出力する(FPDF, FPDI, fpdi-tfpdf)

バージョンアップに伴うアップデートを想定。





fpdi-tfpdfのインストール



インストール自体は基本的に以下で可能
composer require setasign/fpdi-tfpdf:2.2
いくつか機能が分かれているようなのでcomposer経由でないと面倒な設定が必要になる。


フォントファイル(.ttf)を用意して配置する必要がある。
IPA明朝あたりがライセンス的にも使いやすい。
https://ipafont.ipa.go.jp/old/ipafont/download.html

vender/setasign/tfpdf/font/unifont
以下に配置するのが一番問題が少ないようだ(ちょっと抵抗があるが)

以下が動作サンプル
<?php

require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
use setasign\Fpdi\Tfpdf\Fpdi;

$pdf=new Fpdi();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
// 配置したフォントファイル名を指定する
$pdf->AddFont('IPA','','ipamp.ttf',true);
$pdf->SetFont('IPA','',14);
$pdf->Write(8,'Japanese: 日本語テスト');

$pdf->Output();



ここまでなら

http://www.fpdf.org/

のUTF-8 Supportからダウンロードして直接配置するだけでも動作する。

ただしテンプレートファイルに埋め込んで出力するような場合FPDIが別途必要になる(composer経由ならいい感じにしてくれる)

埋め込んだ場合のやり方は以下参照。
setSourceFileを使用する。

https://www.setasign.com/products/fpdi/about/



Ellipseなどを使用している場合以下のスニペット。

<?php

require_once $_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php';
use setasign\Fpdi\Tfpdf\Fpdi;

class myFPDF extends Fpdi
{

    function Circle($x, $y, $r, $style='D')
    {
        $this->Ellipse($x,$y,$r,$r,$style);
    }

    function Ellipse($x, $y, $rx, $ry, $style='D')
    {
        if($style=='F')
            $op='f';
        elseif($style=='FD' || $style=='DF')
            $op='B';
        else
            $op='S';
        $lx=4/3*(M_SQRT2-1)*$rx;
        $ly=4/3*(M_SQRT2-1)*$ry;
        $k=$this->k;
        $h=$this->h;
        $this->_out(sprintf('%.2F %.2F m %.2F %.2F %.2F %.2F %.2F %.2F c',
            ($x+$rx)*$k,($h-$y)*$k,
            ($x+$rx)*$k,($h-($y-$ly))*$k,
            ($x+$lx)*$k,($h-($y-$ry))*$k,
            $x*$k,($h-($y-$ry))*$k));
        $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c',
            ($x-$lx)*$k,($h-($y-$ry))*$k,
            ($x-$rx)*$k,($h-($y-$ly))*$k,
            ($x-$rx)*$k,($h-$y)*$k));
        $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c',
            ($x-$rx)*$k,($h-($y+$ly))*$k,
            ($x-$lx)*$k,($h-($y+$ry))*$k,
            $x*$k,($h-($y+$ry))*$k));
        $this->_out(sprintf('%.2F %.2F %.2F %.2F %.2F %.2F c %s',
            ($x+$lx)*$k,($h-($y+$ry))*$k,
            ($x+$rx)*$k,($h-($y+$ly))*$k,
            ($x+$rx)*$k,($h-$y)*$k,
            $op));
    }
}

Fpdiの代わりにmyFPDFを使用する。



参考



http://www.fpdf.org/
https://kantaro-cgi.com/blog/php/fpdf_fpdi_utf8_japanese.html
https://landhere.jp/blog/a176.html
https://github.com/Setasign/FPDI/blob/master/local-tests/tfpdf.php


2020年1月16日木曜日