Laravel 7과 Snappy로 PDF 출력

소개



Laravel에서 PDF를 출력하는 방법입니다.

완성판의 소스는 아래에 있습니다.
htps : // 기주 b. 이 m / naga 3 / s py py mp ぇ

Laravel에서 사용할 수 있는 PDF 출력 라이브러리


  • Laravel Browsershot: htps : // 기주 b. 이 m / ゔ ぇ m 콘시 ぃ m / ㄱ

  • Puppeteer 사용
  • 정확도로 가장?

  • Laravel DOMPDF: htps : // 기주 b. 코 m / 바 ryvdh / ぁらゔ ぇ l mpdf

  • DOMPDF 의 Laravel 래퍼
  • PHP만 있으면 움직이기 때문에 간편

  • Laravel Snappy: htps : // 기주 b. 코 m / 바 ryvdh / ぁらゔぇ ls py
  • Qt WebKit 렌더링 엔진을 사용하여 PDF를 출력하는 도구 wkhtmltopdf의 PHP 래퍼 Snappy
  • Laravel DOMPDF보다 빠릅니다


  • 이번에는 균형을 생각하고 Laravel Snappy를 선택했습니다.

    Laravel 프로젝트 만들기



    이쪽을 참고로 적당한 프로젝트를 작성합니다. Composer이 설치되어 있으면 쉽게 만들 수 있습니다.
    composer create-project --prefer-dist laravel/laravel snappy-sample
    cd snappy-sample
    

    Laravel Snappy 설치



    Laravel Snappy의 문서을보고 진행하십시오.

    우선 wkhtmltopdf를 설치합니다만, 이쪽도 Composer로 간단하게 도입할 수 있습니다. Windows 또는 Mac과 같은 바이너리가 적합하지 않은 경우 위 문서를 참조하십시오.
    composer require h4cc/wkhtmltopdf-amd64 0.12.x
    

    그런 다음 Laravel Snappy 본체를 설치합니다.
    composer require barryvdh/laravel-snappy
    

    config 파일을 만듭니다.
    php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"
    

    config 파일에 wkhtmltopdf 위치를 씁니다. 위와 같이 Composer에서 설치한 경우

    config/snappy.php
    'binary' => base_path('vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'),
    

    PDF 출력 테스트



    성공적으로 설치할 수 있는지 확인해 봅니다.

    routes/web.php
    Route::get('/hello', function () {
        return PDF::loadHTML('<h1>Hello!</h1>')->inline();
    });
    



    괜찮아 보이네요.

    Blade를 사용하여 PDF를 출력합니다.



    Snappy는 Blade에 그대로 HTML을 써서 출력할 수 있으므로 매우 편합니다. CSS도 2 정도 지금은 정확하게 효과가 있습니다.

    우선 Route의 부분입니다.

    routes/web.php
    Route::get('/members', function () {
        $member = Faker\Factory::create('ja_JP');
        return PDF::loadView('members', compact('member'))->inline();
    });
    

    Faker에서 무작위 데이터를 생성하고 view에 전달합니다.

    다음 템플릿의 부분입니다.

    resources/views/members.blade.php
    <!DOCTYPE html>
    <html lang="ja">
    
    <head>
      <meta charset="UTF-8">
      <title>名簿</title>
      <style>
        table {
          border-collapse: collapse;
        }
    
        tr {
          page-break-inside: avoid;
        }
    
        th,
        td {
          border: 1px solid black;
        }
      </style>
    </head>
    
    <body>
      <h1>名簿</h1>
      <table>
        <tr>
          <th>No.</th>
          <th>氏名</th>
          <th>住所</th>
          <th>電話番号</th>
          <th>備考</th>
          @for ($no = 1; $no <= 50; $no++) <tr>
            <td>{{ $no }}</td>
            <td style="white-space: nowrap">{{ $member->name }}</td>
            <td>{{ $member->address }}</td>
            <td>{{ $member->phoneNumber }}</td>
            <td>{{ $member->realText }}</td>
        </tr>
        @endfor
      </table>
    </body>
    
    </html>
    

    브라우저에서 확인해 봅니다.



    좋아 보인다.

    tr 요소에 page-break-inside: avoid; 를 적용하면 셀 중간에 페이지 나누기가 중단됩니다.

    이런 느낌.

    좋은 웹페이지 즐겨찾기