PHPでPDFファイルを操作したり作成することって、結構ニーズがあると思うのです。しかしながら、ネットでやり方を検索してみますと、FPDFを使った記事が多くひっかかるけど、インストールとか日本語フォントの対応がめちゃくちゃ面倒。
で、躓きながらいろいろ試していましたら、PHP開発元であるZend社からZendPDFなるライブラリが出ているのを見つけまして、すっごい簡単にPDF操作ができましたのでやり方を備忘的に書いておきます。テンプレートとして作成したDFファイルにPHPで文字を載せる方法です。
なお、CodeigniterをComposerを使ってインストールしていること前提です。
ZendPDFをComposerに追加
まず、ZendPDFのライブラリをComposerに追加します。もちろん手動でダウンロード→解凍→配置、もできるのですが、それをするとバージョン管理であったり依存性解消であったりという恩恵が受けれないので、Composerでインストールします。
ということで、requireに、zendpdfを追加。packagestにあるのがありがたい。
"require": { "codeigniter/framework": "3.0.0", "zendframework/zendpdf": "2.0.2" },
で、composer updateを実行すると、vendor以下にzendpdfが追加されます。
Libraryを作成
別にControllerで作ってもいいのですが、私的にはComposerでインストールしたものってLibraryの一種な気がしているのでCodeigniterのLibraryで読み込むようにしています。
use ZendPdf\PdfDocument; use ZendPdf\Font; class Zendpdf { function __construct() { $this->ci =& get_instance(); } }
まず、ZendPdfをuseを使って呼び出します。これだけでパスが通るので、Composer便利(ここでエラーがでる人は、「application/config/config.php」の$config[‘composer_autoload’]が未設定であることを疑って下さい)
テンプレートPDFとfontを配置
で、Libraryのファイルと同じ階層にフォルダを作成し、テンプレートPDF(日付・宛先・金額の入っていない領収書のテンプレートなど)と、日本語フォントを配置します。
英字だったらフォントを配置しなくても操作可能なのですが、日本語はそういうわけにはいかないらしく。2-byte文字の宿命ですよね。ちなみに私は、migmix-2p-bold.ttfを使いました。
ライブラリでテンプレートPDFとfontを読み込み
そうしたら、先ほどのライブラリに関数を追加し、テンプレートPDFとfontを読み込みます。
function make_pdf() { // templateの読み込み $receipt = PdfDocument::load(dirname(__FILE__) . '/receipt/template.pdf'); // fontの読み込み $font = Font::fontWithPath(dirname(__FILE__) . '/receipt/migmix-2p-regular.ttf'); // templateの0ページ目に読み込んだfontをサイズ15で設定 $receipt->pages[0]->setFont($font, 15); }
ここまでで準備は完了です。この状態で、$receiptというキャンバスにテンプレートが読み込まれ、0ページ目に日本語フォントが設定されている状態になっています。
PDFに文字を描画
あとはキャンバスの上に、文字であったり、画像であったりを配置していくだけです。
例えば、「こんにちは」という文字を、左下から margin: 0 0 100px 50px(左から50px、下から100px)の位置には配置したかったら
$receipt->pages[0]->drawText("こんにちは", 50, 100, 'UTF-8');
というコードを追加します。左下を起点にして、この位置にこの文字であったり、画像であったり、を追加する、という方法で描画していくのです。
そして、returnでcontrollerに返してもいいですし、出力したければそのまま
header ('Content-Type:', 'application/pdf'); header ('Content-Disposition:', 'inline;'); echo $receipt->render();
を実行すれば、用意したテンプレートの上に、PHPで文字を描いたPDFファイルが表示されます。
環境依存も考えなくてもいいし、いろいろライブラリ自体をさわる必要もないし、FPDFに比べて簡単ですね。
それでは、また。