Laravel-dompdf でPDF領収書発行システムをA5横書きを指定して作成する
Laravel-dompdf でPDF領収書発行システムをA5横書きを指定して作成する
Laravel-dompdf、超便利です。
なんといっても、bladeを読み込んでそのままPDF化してくれるというこの機能!
ただ、私が四苦八苦したのは『横書き』の設定方法についての参考記事の少なさでした。
という事で、今後の為にも備忘録です。
Laravel-dompdfで出力用紙サイズの指定と向きを指示する方法
ノーマル状態だとA4縦書きになります。
$pdf = \PDF::loadView('pdf/receipts',
compact('billing')
);
return $pdf->stream('領収書.pdf');
compact()で渡しているのは領収書用blade(pdf/receipts)に送る変数です。
この中に税率10%の商品合計とかお支払とかそんな情報を入れてblade側でいつも通りに{{$billing->total}}とかで呼んであげればサクッとPDFが作れます。
用紙のサイズを指定したいときは【PDF::】にもう一つ値を加えてやります。
$pdf = \PDF::loadView('pdf/receipts',
compact('billing')
)->setPaper('a4', 'landscape');
return $pdf->stream('領収書.pdf');
上の例だと、A4横書きのPDFが作成できます。setPaperという指標で用紙サイズと向きを指定するだけという超簡単さ。
setPaperでの指示について今調べた範囲の情報まとめ
- setPaper('a4', 'landscape') => A4横書き
- setPaper('A5', 'landscape') => A5横書き ※Aは大文字小文字どちらでも問題なし
- setPaper('landscape') => A4縦書きで出力 ※横書きにならない。横書きにする場合用紙サイズの指定が必要
- setPaper([0, 0, 396.85, 685.98], 'landscape') => 用紙サイズを指示して出力 [横開始位置,縦開始位置,用紙縦サイズ,用紙横サイズ]となっている※'landscape'を忘れると強制的に縦書きになる
- setPaper([0, 0, 396.85, 685.98]) => 'landscape'を忘れると強制的に縦書きになるため、[0, 0, 685.98, 396.85]と同じ状態で出力される
setPaper('A5', 'portrait')という指標を使っている方がいたが、この意味についてはわからなかった。
portraitがついていてもいなくても縦書きになるので、基本的にはなくても良いのだと勝手に解釈する事にしました。
URLにアクセスしたらブラウザで開かずダウンロードさせたい
その場合はreturnでダウンロード指示すればOKです。
$pdf = \PDF::loadView('pdf/receipts',
compact('billing')
);
return $pdf->download('領収書.pdf');
これだけで『ファイル名:領収書.pdf』でアクセス時にダウンロードを行います。いやぁ~簡単便利。
縦書きと横書きを場合分けしたい
今回私が作成したかったのは2つありました。
某企業様用の『提案書作成ツール』と自社用の『領収書発行システム』。
自社用だけであれば領収書ですから場合分けは不要です。
しかし、受注したシステムの顧客要望は『縦書きと横書きの提案書がある』でしたからどうしても場合分けが必要。
そんな時は提案書テンプレートを格納するデータベースに縦横の指標を入れておけば簡単に解決します。
$proposal = Proposal::find($proposal_id);
if($proposal->direction === 1){
$pdf = \PDF::loadView('pdf/proposals',compact('proposal'))->setPaper('a4', 'landscape');
return $pdf->download('ご提案書.pdf');
}else{
$pdf = \PDF::loadView('pdf/proposals',compact('proposal'));
return $pdf->download('ご提案書.pdf');
}
上の例では、提案書を格納しているテーブルに『direction 』という項目(Flag)を加えて、1の時は横書きとして動作します。
まとめ
Laravel-dompdf、横書きも用紙指定も出来るとなればLaravelでは最強かもしれません。


