Laravel:PDFデータ作成が簡単にできるプラグイン

Laravelで領収書のPDF化を実装してみた

だいぶ慣れてきたLaravel。せかっくなのでPDFの扱いもやってみようと実装してみました。

『Laravel PDF 作成』で検索しHITするツールを利用。

barryvdh/laravel-dompdf

困った問題もありましたが非常に簡単だったので備忘録に書き溜めます。

基本的な操作はPDF化したいURLを記載しコールするだけ

 public function receipt_pdf($id) {
      
    $pdf = \PDF::loadView('PDF化する領収書のリンク');
    return $pdf->stream('領収書.pdf');

/*   ダウンロードさせる場合はこっちを記載する。
*    画面遷移は起こらずダウンロードが開始する
*/   return $pdf->download('領収書.pdf');

laravel-dompdfの基本的な使い方はコントローラーに上記コードを記載するだけ。

驚くほど簡単でした。

参考としたサイトには引数を渡すときの記載方法など明示されてなかったので補足として記載します。

■View

  //領収書PDF
  Route::get('pdf/billings/{id}', 'HomeController@receipt_pdf');

■Controller(※例はHomeController)

<?PHP<?PHP
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use App\Models\Billing;
use App\Models\Billingstatement;
use App\Models\Applicant;



 public function receipt_pdf($id) {
      
        $billingstatements = Billingstatement::where('billing_id',$id)->get();
        $prices = DB::select(
                'SELECT 
                    billings.id, 
                    sumprice.salculation, 
                    sumprice.taxs,  
                    sumprice.applicost,
                    billings.date, 
                    billings.billing, 
                    billings.contents, 
                    billings.memo
                FROM billings 
                INNER JOIN 
                    (
                    SELECT 
                        billingstatements.billing_id,
                        ROUND(
                            SUM(
                                billingstatements.price *
                                billingstatements.number *
                                (1 + billingstatements.taxrate)
                                )
                            ,0) as salculation,
                        ROUND(
                            SUM(
                                billingstatements.price *
                                billingstatements.number *
                                billingstatements.taxrate
                                )
                            ,0) as taxs,
                       SUM(
                                billingstatements.price *
                                billingstatements.number 
                            )as applicost 
                    FROM billingstatements
                    Group BY billingstatements.billing_id
                    ) AS sumprice 
                ON billings.id = sumprice.billing_id
                WHERE (billings.onoff = 1) AND (billings.id = '.$id.')'
                );

        $applicant =Applicant::where('id',1)->first();
        $billing = Billing::find($id);
        

        $pdf = \PDF::loadView('pdf/receipt',['prices' => $prices], compact('billing','applicant','billingstatements'));
        return $pdf->stream('領収書.pdf');
    }
}

テーブルbillings=請求情報の親

テーブルbillingstatements=購入履歴
※どの請求情報に入れるかbillingstatements.billing_idでリレーションしています。

テーブルapplicants=購入者情報
※上記例は1システム1社の仕様なのでレコードのリレーションはありませんが、billingstatementsにapplicant_id を設定し多対多リレーションを組む事で複数の購入者にも対応できます。

クエリビルダーでの売価計算がグチャグチャし理解出来なかったため、売価の計算は直接クエリを作り実行してます。直接クエリを記載した場合は引数の書き方が変わるので要注意。

$pdf = \PDF::loadView('pdf/receipt',['prices' => $prices], compact('billing','applicant','billingstatements'));’

’pdf/receipt’=PDF化したいHTML(receipt.blade.php)の保管フォルダとファイル名
※例の場合は、resources/pdf/receipt.php があります。

['prices' => $prices]=DB::select( )にてSQLクエリを直指定した場合の引数の渡し方。

compact('billing','applicant','billingstatements')=クエリビルダなど、Laravelのツールを利用したデータの渡し方。

こんな感じで書いてあげると、URLのGETに入った値を$idとして取得し、クエリで抽出。
欲しいデータのPDFが簡単に作れます。

laravel-dompdf の欠点。

こんな簡単にPDF化してくれる barryvdh/laravel-dompdf ですが、困った欠点がありました。

CSSの理解が超悪い!

出力する画面を receipt.blade.php に書いていったのですが、上記注意点を知らずCSSを多用して作成していました。
class分けして class='hoge' なんて呼び出しをしたのですが、崩れる崩れる。

センタリングしたはずなのになってないとか、文字サイズ変えたはずなのに変わってないとか罫線を指定したはずなのに出てこないとか...。

それもそのはず。
調べたところ、理解できるスタイルシートはとても狭く極力CSSを使わない記載方法に直してあげる必要がありました。
面倒くさいですが、PDF化がこれだけ簡単なので仕方ないですよね。

まとめ

  1. LaravelでのPDF化には laravel-dompdf が超簡単

  2. 但し、CSSは理解してくれないのでPDF化画面でのCSS多用は控えるべき

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください