読者です 読者をやめる 読者になる 読者になる

Yii2でPDFを出力する(tcpdfとfpdiのインストール)

単にPDFを出力するだけならすぐできたのだけれど、既存のPDFを読み込んでそこに動的にデータを出力するためのfpdiがインストールできず、四苦八苦したのでメモしておきます。

 

とりあえず素のYii2 advancedが動いている状態です。

f:id:wigwamania:20160813114316p:plain

今回はサンプルなので、siteコントローラーのpdfアクションに、既存のPDFを取り込んで値をセットして表示するということにします。

 

まず、composerで以下の2つのライブラリをインストールします。

% composer require setasign/fpdi

% composer require setasign/fpdi-tcpdf 

 一応結果を貼っておくと

% composer require setasign/fpdi
Using version ^1.6 for setasign/fpdi
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing setasign/fpdi (1.6.1)
Loading from cache

setasign/fpdi suggests installing setasign/fpdf (FPDI will extend this class but as it is also possible to use "tecnickcom/tcpdf" as an alternative there's no fixed dependency configured.)
setasign/fpdi suggests installing setasign/fpdi-fpdf (Use this package to automatically evaluate dependencies to FPDF.)
setasign/fpdi suggests installing setasign/fpdi-tcpdf (Use this package to automatically evaluate dependencies to TCPDF.)
Writing lock file
Generating autoload files

 

% composer require setasign/fpdi-tcpdf
Using version ^1.6 for setasign/fpdi-tcpdf
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
- Installing tecnickcom/tcpdf (6.2.12)
Loading from cache

- Installing setasign/fpdi-tcpdf (1.6.1)
Loading from cache

Writing lock file
Generating autoload files

ちなみに、Yii2をインストールした直後だとエラーが出る場合があると思うので、先に

% composer update

を実行しておきましょう。

 

次にベースとなるPDFを作成しておきます。

PDF自体は何でもよいのですが、私は以下のようなPDFを作成して、Yii2アプリケーションの一番上の階層(frontendやbackendと同じレベル)にpdfというディレクトリを作成し、そこにPDFを置きました。template.pdfという名前にしています。

f:id:wigwamania:20160813120918p:plain

準備段階の最後に、今のままでは日本語が使用できないので、適当なフォントを入れておきます。

私はmigmix-2pを使うことにしたので、以下のサイトから該当ファイルをダウンロードします。

MigMixフォント : M+とIPAの合成フォント

ダウンロードしたら解凍したファイルの中にある「migmix-2p-bold.ttf」と「migmix-2p-regular.ttf」を、vendor/tecnickcom/tcpdf/fontsディレクトリにコピーしておきます。

 

ふぅ、ここまでくれば、あとはプログラムを書いていくだけです。

サンプルなので、アクションとしてベタに書いてしまっていますが、ソースは以下のとおりです。

public function actionPdf()
{
$template = new \FPDI();
$font = new \TCPDF_FONTS();

// フォントを登録
$fontPathRegular = Yii::getAlias('@vendor').'/tecnickcom/tcpdf/fonts/migmix-2p-regular.ttf';
$regularFont = $font->addTTFfont($fontPathRegular, '', '', 32);

$fontPathBold = Yii::getAlias('@vendor').'/tecnickcom/tcpdf/fonts/migmix-2p-bold.ttf';
$boldFont = $font->addTTFfont($fontPathBold, '', '', 32);

$template->SetFont($regularFont, '', 11);

$template->AddPage();
$template->setSourceFile(Yii::getAlias('@app') . '/../pdf/template.pdf'); //PDF読込
$tplIdx = $template->importPage(1); //1ページ目を取得
$template->useTemplate($tplIdx, null, null, null, null, true); //それをテンプレートとして使用
$template->SetXY(42, 30);
$template->Write(0, '2016/08/13');
$template->SetXY(80, 30);
$template->Write(0, 'PDFを作成する');
$template->Output('newpdf.pdf', 'I');
}

 実行結果は以下のとおり。

f:id:wigwamania:20160813122328p:plain

お疲れ様でした。