カテゴリー
Laravel
PHP
投稿日時
2017-12-28 13:57:05
今年最後の更新になります。
HTMLで表示した内容をPDFに出力したいという場合がたまにあると思います。
PHPのPDF出力ライブラリはいろいろなものがあるみたいですが、今回は比較的情報が豊富で使いやすいTCPDFで話を進めたいと思います。
# 手順1 TCPDFをインストール
まずはcomposer.jsonのrequireにtcpdfを追加します。
```json
"require": {
"php": ">=7.0.0",
"fideloper/proxy": "~3.3",
"laravel/framework": "5.5.*",
"laravel/tinker": "~1.0",
"tecnickcom/tcpdf": "6.2.*"
},
```
最後の行にtecnickcom/tcpdfという記述があるのがわかると思います(Laravelのバージョンに適したバージョンは確認してください)。
これを追加してからcomposer updateを実行します。
# 手順2 PDF出力用bladeを作成
通常のbladeと同じ要領で表示したい内容を作り込んでいきます。ただ、テンプレートはWebで表示する通常のページとは分けたほうがいいでしょう。
# 手順3 PDF出力メソッド作成
まずはコントローラの上の方でTCPDFを読み込ませます。
```php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use TCPDF; //追加!
```
次に、出力メソッドを作成します。
実際の出力メソッドはこんな感じです。メソッドの詳細の説明などは[公式ページ](https://tcpdf.org/)を見てください。
```php
<?php
public function download() {
//PDF作成
$pdf = new TCPDF('P', "mm",'A4');
// PDFの余白(左上右)を設定
$pdf->SetMargins(9, 9, 19, true);
// ヘッダー・フッターの出力を無効化
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->setLineWidth(0.2);
//フォント名,フォントスタイル(空文字でレギュラー),フォントサイズ
$pdf->setFont('kozminproregular','',10);
//ページを追加
$pdf->addPage();
//Bladeの内容を書き込む
$pdf->writeHTML(view('test.pdf')->render());
//出力ファイル名設定
$file_name = "PDF出力テスト.pdf";
$string = $pdf->Output($file_name, 'S');
//ファイル名を日本語にして出力
$file_name = mb_convert_encoding($file_name, 'SJIS', 'UTF-8');
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Transfer-Encoding: binary ");
header('Content-Type: application/octet-streams');
header("Content-Disposition: attachment; filename=\"{$file_name}\"");
echo $string;
return redirect()->back();
}
```
後、routes/web.php(5.3以降でのファイルです。5.2以下はそれに当たるルーティングファイル)の方に追加したメソッドを付け加えるのをお忘れなく。
# 手順4 出力内容の確認およびレイアウト調整
後は実際に出力してみてレイアウトでおかしなところがないかの確認です。
これが・・・

こんな風になっていればOKです。

実際にはWebページでだとうまく表示されているのにPDFにした途端にレイアウトが崩れてしまうケースが多々あります(特にテーブルとか)。その辺りは数値を変えたりして微調整していくしかなさそうです。
本当はもうちょっと詳しく書きたかったんですが、今回はこのくらいで。
それでは皆様、良いお年を。