Generate PDF In Laravel 8–11 with dompdf

Chavalit Koweerawong
ckartisan
Published in
2 min readNov 13, 2018

บางครั้งเราอาจต้องการแสดง Content ในรูปแบบของ PDF แทนที่จะแสดงผลหน้าเว็บทั่วไป เพื่อให้การจัดวางหน้ากระดาษเหมาะสำหรับงานพิมพ์ในทุกอุปกรณ์ ตัวอย่างนี้จะแนะนำการสร้าง PDF ผ่าน package ที่ชื่อว่า laravel-dompdf

Laravel wrapper for Dompdf HTML to PDF Converter

หลักๆ ก็คือเป็น library ที่ไปครอบ DomPDF อีกที ส่วนวิธีการใช้งานค่อนข้างง่าย มาดูกันว่าจะต้องมีขั้นตอนอะไรบ้าง

  1. ติดตั้ง package
composer require barryvdh/laravel-dompdf

2. Config

php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"

3.แก้ไข config/dompdf.php

'enable_remote' => true, //(โปรดใช้ด้วยความระมัดระวัง อาจใช้ร่วมกับ allowed_remote_hosts)

4. สร้างโฟลเดอร์ storage/fonts

  • ถ้าขาด step นี้เวลารันจะ Error เพราะหากที่เก็บ cache ของ font ไม่เจอ

5. เพิ่มใน .gitignore ด้วย

/storage/fonts

6. routes/web.php

Route::get('/test/pdf', function () {
$a = "hello";
$b = "world";
$c = "วันจันทร์";
$pdf = Pdf::loadView('testpdf', compact('a', 'b', 'c'));
return $pdf->stream();
});

7. resources/views/testpdf.blade.php (content)

<x-bootstrap-pdf>
<div>สวัสดีวันจันทร์</div>
<div>{{ $a }}</div>
<div>{{ $b }}</div>
<div>{{ $c }}</div>
<div class="row">
<div class="col-xs-6">1</div>
<div class="col-xs-6">2</div>
</div>
</x-bootstrap-pdf>

8.resources/views/components/bootstrap-pdf.blade.php (theme)

<html>
<head>
<meta http-equiv="Content-Language" content="th" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!-- Bootstrap 3.x only : DOMPDF support float, not flexbox -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.4.1/dist/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
<!-- thai font -->
<link href="https://fonts.googleapis.com/css2?family=Sarabun:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Sarabun', sans-serif;
line-height: 1;
}
</style>
</head>

<body>
{{ $slot }}
</body>

</html>
  • DOMPDF ไม่ support css flexbox layout ดังนั้นสาย bootstrap จะต้องย้อนกลับไปใช้ Version 3 ซึ่งใช้ float ในการจัด layout
  • แม้จะลำบากหน่อยแต่มีก็ยังดีกว่าไม่ได้เลย
  • ตัวอย่างนี้ใช้ Google Fonts : Sarabun
  • ส่วน Font อื่นๆ ก็ไปดูที่ลิงค์ได้ https://fonts.google.com/?subset=thai

Finally : (แบบ stream ขึ้น preview)

--

--

Chavalit Koweerawong
ckartisan

Lecturer of Computer Science @VRU, programmer, researcher, investor