【问题标题】:Laravel barryvdh/laravel-dompdf multiple components of view in one pdfLaravel barryvdh/laravel-dompdf 在一个 pdf 中查看多个组件
【发布时间】:2021-02-12 21:56:23
【问题描述】:

我正在使用 barryvdh/laravel-dompdf 生成 pdf。

我正在尝试从数据收集中生成一个包含多个页面的 pdf 文件,问题是我只得到第一个元素和一个页面。使用 foreach 循环生成页面。我也尝试在我的刀片中使用 foreach,但我只得到最后一页。

Controller:
public function multiplePagesPdf(Request $request)
    {
            $kuponai = Kuponas::all();
            //dd($kuponas);
            $html = '';
            foreach($kuponai as $kuponas)
            {
                $view = view('pdf.multiple')->with(compact('kuponas'));
                $html .= $view->render();
            }
            $pdf = PDF::loadHTML($html);            
            $sheet = $pdf->setPaper('a4', 'landscape');
            return $sheet->stream('sugeneruoti.pdf');             

    }

我的刀片文件中可能有问题:

    <!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Dovanų kuponas</title>
</head>
<body>
  <div class="coupon">
    <div class="page">
      <div class="subpage">
        <div class="container" style="
              width: 21cm;
              height: 16cm;
              position: absolute;
              top: 6.8cm;
              font-family: DejaVu Sans;
              background: white;
            ">
         <h2>{{!! $kuponas->kupono_nr !!}}</h2>
          <h3 style="margin-left: 3.2cm">
            Dovanų kupono numeris:
            <span style="color: black"></span>
          </h3>
        </div>
      </div>
    </div>
  </div>
</body>

</html>
<style>
  @page {
    size: A4;
    margin: 0;
  }

  @media print {
    .page {
      margin: 0;
      border: initial;
      border-radius: initial;
      width: initial;
      min-height: initial;
      box-shadow: initial;
      background: initial;
      page-break-after: always;
    }
  }
</style>

【问题讨论】:

标签: laravel dompdf


【解决方案1】:

您提供的代码 sn-p 中存在某些错误,我将首先解释这些内容,然后提供正确的方法(我得到了结果)。

  • 首先

你已经用&compact一起使用了,我不知道它是否得到正确的结果,但你应该使用其中任何一个或使用视图方法的数组语法。

  • 其次

你正在做什么你正在将视图呈现为 html 然后连接它,所以,你的 html 看起来像,

<html>
.... content
</html>
<html>
.... content
</html>
& so on.
  • 第三

由于您添加了内联 css,您的 css 被搞砸了,并且无法按您想要的方式工作。

解决方案

我会使用View Components 来创建具有不同数据的相似视图。 所以我们将在 resources/views/components/single.blade.php 中创建一个组件(这里我将其命名为 single)。 我已从您的视图中将您的重复代码添加到单个组件中。现在您的优惠券 div 类在组件单中。

<div class="coupon">
    <div class="page">
      <div class="subpage">
        <div>
         <h2>{{ $kuponas->kupono_nr }}</h2>
          <h3>
            Dovanų kupono numeris:
            <span></span>
          </h3>
        </div>
      </div>
    </div>
  </div>

那么在你看来,

<!DOCTYPE html>
<html lang="en">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<head>
  <title>Dovanų kuponas</title>
  <style>
    .page-break {
    page-break-after: always;
}
  </style>
</head>
<body>
  @php $count = 0;@endphp
  @foreach ($kuponai as $kuponas)
  @php $count++ @endphp
    <div class="container {{ (count($kuponai)-1 >= $count) ? 'page-break' : '' }}">
        @component('pdf.components.single', ['kuponas' => $kuponas])
        @endcomponent
    </div>    
  @endforeach
</body>

</html>

使用分页符类来创建分页符,我使用计数条件来删除一个额外的分页符。我正在将 kuponas 的数据传递给组件。

最后改变你的控制器,

public function multiplePagesPdf(Request $request)
    {
        $kuponai = Kuponas::all();
        //dd($kuponas);
        
        $view = view('pdf.multiple', ['kuponai' => $kuponai]);
        $html = $view->render();
        $pdf = PDF::loadHTML($html)->setPaper('a4', 'landscape');            
        return $pdf->stream('sugeneruoti.pdf');
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 2021-03-24
    • 2016-04-02
    • 2018-03-25
    • 2019-11-12
    • 2018-08-27
    相关资源
    最近更新 更多