บทความนี้เกิดจากคำถามในกลุ่ม Laravel Thailand ซึ่งพบบ่อยพอสมควรว่าจะสร้าง PDF ภาษาไทยยังไง ก็เลยเขียนขึ้นมาซะเลย โดยในบทความนี้จะใช้ laravel-dompdf เป็นหลัก
ส่วนนี้จะสอนลง laravel-dompdf กับสร้าง PDF แบบพังๆขึ้นมา 1 ตัวเพื่อใช้ทดสอบ ถ้าทำเป็นแล้วข้ามไปได้เลยครับ
composer require barryvdh/laravel-dompdf
Barryvdh\DomPDF\ServiceProvider::class,
ลงไปในส่วนของ providers
และเพิ่ม
'PDF' => Barryvdh\DomPDF\Facade::class,
ลงในส่วนของ aliases
<html> <head> </head> <body> <h1>ใบแจ้งหนี้สำหรับ คุณ{{ $name }}</h1> ขอขอบคุณในการสั่งซื้อ </body> </html>
<?php Route::get('/pdf', function () { $data = [ 'name'=>'อะไรสักอย่าง ไม่รู้นามสกุลอะไร' ]; $pdf = PDF::loadView('pdf.invoice', $data); return @$pdf->stream(); });
ในบรรทัดที่ 8 จำเป็นต้องใส่ @ นำหน้า เพื่อปิด error บางตัว ที่อาจจะเกิดจากการหา fonts ไม่เจอ
ในขั้นนี้จะเป็นขั้นตอนจริงๆ เพื่อทำให้ laravel-dompdf รองรับภาษาไทยในการ render ต้องทำตามขั้นตอนต่อไปนี้เพื่อให้รองรับภาษาไทย โดยขั้นตอนนี้เป็นแบบง่าย ซึ่งในการสร้าง pdf ครั้งแรกสุดอาจจะทำให้ช้าได้ โดย font ไทยในครั้งนี้ผมเลือกใช้ THSarabunNew ครับ (ถ้าอยากดาวโหลดมาทำการทดสอบ สามารถดาวโหลดได้จากที่นี่)
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> </head> <body> <h1>ใบแจ้งหนี้สำหรับ {{ $name }}</h1> ขอขอบคุณในการสั่งซื้อ </body> </html>
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> @font-face { font-family: 'THSarabunNew'; font-style: normal; font-weight: normal; src: url("{{ public_path('fonts/THSarabunNew.ttf') }}") format('truetype'); } body { font-family: "THSarabunNew"; } </style> </head> <body> <h1>ใบแจ้งหนี้สำหรับ {{ $name }}</h1> ขอขอบคุณในการสั่งซื้อ </body> </html>
โดยส่วนของการประกาศ fonts คือบรรทัดที่ 6 – 10 ส่วนสำคัญคือบรรทัดที่ 10 ที่เป็นการบอกว่า fonts อยู่ที่ไหน
และส่วนที่บอกว่า ให้ใช้ fonts ทั้งเอกสารคือบรรทัดที่ 12 – 14 โดยเราสามารถแก้ไขได้เหมือน css ปกติเลยว่าส่วนไหนใช้ fonts ไหน
โดยเมื่อเราทำตามขั้นตอนด้านบนแล้วจะได้ดังภาพ
ปัญหาที่พบบ่อย
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style> @font-face { font-family: 'THSarabunNew'; font-style: normal; font-weight: normal; src: url("{{ public_path('fonts/THSarabunNew.ttf') }}") format('truetype'); } @font-face { font-family: 'THSarabunNew'; font-style: normal; font-weight: bold; src: url("{{ public_path('fonts/THSarabunNew Bold.ttf') }}") format('truetype'); } @font-face { font-family: 'THSarabunNew'; font-style: italic; font-weight: normal; src: url("{{ public_path('fonts/THSarabunNew Italic.ttf') }}") format('truetype'); } @font-face { font-family: 'THSarabunNew'; font-style: italic; font-weight: bold; src: url("{{ public_path('fonts/THSarabunNew BoldItalic.ttf') }}") format('truetype'); } body { font-family: "THSarabunNew"; } </style> </head> <body> <h1>ใบแจ้งหนี้สำหรับ {{ $name }}</h1> ขอขอบคุณในการสั่งซื้อ </body> </html>
ทีนี้พอเราสร้าง pdf ใหม่จะเห็นว่า สามารถใช้ภาษาไทยได้สมบูรณ์แล้ว
ในการสร้าง pdf ครั้งแรกมันจะสร้างได้ช้าพอสมควรเนื่องจากมันต้องไป download font มา (จากเครื่องตัวเองนั่นแหละ) จากนั้นมาแปลง fonts เป็น format ของมัน และ cache ลงใน storage/fonts ทำให้ครั้งแรกช้ากว่าปกติพอสมควร แต่หลังจากนั้นจะความเร็วปกติ (เพราะ cache ไว้แล้ว)