Chào mừng các bạn đến với CodeTutHub! Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách tạo và xuất các tệp PDF trong ứng dụng Laravel 12 một cách dễ dàng bằng cách sử dụng thư viện Dompdf.
Việc tạo PDF từ nội dung HTML là một tính năng rất hữu ích cho nhiều ứng dụng web, từ báo cáo, hóa đơn, vé điện tử cho đến các tài liệu in ấn. Dompdf là một thư viện mã nguồn mở cho phép bạn chuyển đổi HTML và CSS thành các tệp PDF.
Hãy cùng bắt đầu nào!
1. Cài đặt Dompdf
Đầu tiên, chúng ta cần cài đặt thư viện Dompdf vào dự án Laravel của mình thông qua Composer. Mở Terminal hoặc CMD tại thư mục gốc của dự án và chạy lệnh sau:
composer require barryvdh/laravel-dompdfSau khi cài đặt xong, bạn có thể cần publish các file cấu hình của Dompdf (đối với Laravel 12, quá trình auto-discovery đã xử lý phần lớn, nhưng việc publish file cấu hình có thể hữu ích để tùy chỉnh):
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider" --tag="config"Lệnh này sẽ tạo ra file config/dompdf.php trong dự án của bạn, nơi bạn có thể điều chỉnh các tùy chọn như cỡ giấy, hướng giấy (portrait/landscape), font chữ mặc định, v.v.
2. Tạo Controller để Xử lý PDF
Tiếp theo, chúng ta sẽ tạo một Controller để xử lý logic tạo và tải về file PDF. Hãy tạo một Controller mới bằng lệnh Artisan:
php artisan make:controller PdfControllerMở file app/Http/Controllers/PdfController.php và thêm phương thức generatePdf như sau:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf; // Import Facade của Dompdf
class PdfController extends Controller
{
/**
* Generate PDF file from a view.
*
* @return \Illuminate\Http\Response
*/
public function generatePdf()
{
// Dữ liệu mẫu để truyền vào view PDF
$data = [
'title' => 'CodeTutHub - Hóa Đơn Mẫu',
'date' => date('d/m/Y'),
'items' => [
['description' => 'Sản phẩm A', 'quantity' => 2, 'price' => 150000],
['description' => 'Sản phẩm B', 'quantity' => 1, 'price' => 250000],
['description' => 'Sản phẩm C', 'quantity' => 3, 'price' => 50000],
],
'total' => 0,
];
// Tính tổng tiền
foreach ($data['items'] as $item) {
$data['total'] += $item['quantity'] * $item['price'];
}
// Load view vào Dompdf
$pdf = Pdf::loadView('pdf.invoice', $data); // 'pdf.invoice' là tên view của bạn
// Tải về file PDF hoặc hiển thị trong trình duyệt
return $pdf->download('hoa_don_codetuthub.pdf'); // Tải về với tên file đã cho
// return $pdf->stream('hoa_don_codetuthub.pdf'); // Hiển thị trong trình duyệt
}
}
Trong đoạn code trên:
- Chúng ta sử dụng
use Barryvdh\DomPDF\Facade\Pdf;để có thể sử dụng FacadePdf. - Tạo một mảng
$datachứa thông tin sẽ hiển thị trong PDF (ví dụ: hóa đơn, báo cáo). - Sử dụng
Pdf::loadView('pdf.invoice', $data)để tải một Blade view (mà chúng ta sẽ tạo ở bước tiếp theo) và truyền dữ liệu vào đó. $pdf->download('hoa_don_codetuthub.pdf')sẽ buộc trình duyệt tải về tệp PDF với tên đã cung cấp.$pdf->stream('hoa_don_codetuthub.pdf')sẽ hiển thị PDF trực tiếp trong trình duyệt.
3. Tạo Blade View cho PDF
Bây giờ, chúng ta cần tạo một Blade view sẽ được chuyển đổi thành PDF. Hãy tạo một thư mục mới có tên pdf trong resources/views và một file invoice.blade.php bên trong:
resources/views/pdf/invoice.blade.phpMở file resources/views/pdf/invoice.blade.php và thêm nội dung HTML/CSS cho hóa đơn của bạn. Dompdf hỗ trợ một phần CSS 3, nhưng bạn nên giữ CSS đơn giản và inline nếu có thể để đảm bảo tương thích tốt nhất.
