Laravel barryvdh/laravel-dompdf 一个 pdf 中的多个视图组件
Laravel barryvdh/laravel-dompdf multiple components of view in one pdf
我正在使用 barryvdh/laravel-dompdf 生成 pdf。
我正在尝试从数据生成一个包含多页的 pdf 文件 collection 问题是我只得到第一个元素和一页。使用 foreach 循环生成页面。我也试图在我的 blade 中使用 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');
}
我的 blade 文件可能有问题:
<!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>
您提供的代码片段中存在某些错误,我将首先解释这些错误,然后提供正确的方法(为此我得到了结果)。
- 首先
你用过with & compact,不知道结果对不对,你应该用其中任何一个,或者用视图方法的数组语法。
- 其次
你在做什么 你正在将视图渲染到 html 然后连接它,所以,你的 html 看起来像,
<html>
.... content
</html>
<html>
.... content
</html>
& so on.
- 第三
您 css 搞砸了并且无法正常工作,因为您添加了内联 css。
解决方案
我会使用 View Components 来创建具有不同数据的相似视图。
所以我们将在 resources/views/components/single.blade.php 中创建一个组件(这里我将其命名为 single)。
从您的角度来看,我已将您的重复代码添加到单个组件中。现在你的优惠券divclass在组件单中
<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>
使用page-break class 来创建分页符,我已经使用计数条件删除了一个额外的分页符。我正在将 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');
}
我正在使用 barryvdh/laravel-dompdf 生成 pdf。
我正在尝试从数据生成一个包含多页的 pdf 文件 collection 问题是我只得到第一个元素和一页。使用 foreach 循环生成页面。我也试图在我的 blade 中使用 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');
}
我的 blade 文件可能有问题:
<!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>
您提供的代码片段中存在某些错误,我将首先解释这些错误,然后提供正确的方法(为此我得到了结果)。
- 首先
你用过with & compact,不知道结果对不对,你应该用其中任何一个,或者用视图方法的数组语法。
- 其次
你在做什么 你正在将视图渲染到 html 然后连接它,所以,你的 html 看起来像,
<html>
.... content
</html>
<html>
.... content
</html>
& so on.
- 第三
您 css 搞砸了并且无法正常工作,因为您添加了内联 css。
解决方案
我会使用 View Components 来创建具有不同数据的相似视图。 所以我们将在 resources/views/components/single.blade.php 中创建一个组件(这里我将其命名为 single)。 从您的角度来看,我已将您的重复代码添加到单个组件中。现在你的优惠券divclass在组件单中
<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>
使用page-break class 来创建分页符,我已经使用计数条件删除了一个额外的分页符。我正在将 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');
}