Laravel là một framework PHP mạnh mẽ và linh hoạt, được sử dụng rộng rãi trong phát triển ứng dụng web. Một trong những nhu cầu phổ biến của nhiều ứng dụng là tạo và tải xuống các tài liệu PDF từ nội dung HTML. Để giải quyết nhu cầu này, dompdf là một thư viện PHP tuyệt vời giúp chuyển đổi HTML thành PDF một cách dễ dàng. Bài viết này sẽ hướng dẫn bạn cách tạo PDF từ tệp view HTML và tải xuống bằng dompdf trong Laravel.
Cài đặt và cấu hình dompdf trong Laravel
Cài đặt dompdf
Để sử dụng dompdf trong Laravel, trước tiên bạn cần cài đặt gói thông qua Composer. Mở terminal và chạy lệnh sau:
composer require barryvdh/laravel-dompdf
Cấu hình dompdf
Sau khi cài đặt xong, bạn cần thêm service provider vào tệp config/app.php
để Laravel có thể sử dụng dompdf:
'providers' => [ // ... Barryvdh\DomPDF\ServiceProvider::class, ],
Thêm alias để tiện sử dụng:
'aliases' => [ // ... 'PDF' => Barryvdh\DomPDF\Facade::class, ],
Tiếp theo, bạn có thể xuất tệp cấu hình của dompdf bằng lệnh:
php artisan vendor:publish --provider="Barryvdh\DomPDF\ServiceProvider"
Tạo tệp view HTML
Giới thiệu về tệp view trong Laravel
View trong Laravel là các tệp HTML được lưu trữ trong thư mục resources/views
. Chúng giúp tách biệt logic xử lý và giao diện người dùng.
Tạo tệp view HTML mẫu
Hãy tạo một tệp view mới trong thư mục resources/views
với tên invoice.blade.php
:
<!DOCTYPE html> <html> <head> <title>Invoice</title> <style> body { font-family: DejaVu Sans, sans-serif; } .invoice-box { max-width: 800px; margin: auto; padding: 30px; border: 1px solid #eee; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .invoice-box table { width: 100%; line-height: inherit; text-align: left; } .invoice-box table td { padding: 5px; vertical-align: top; } </style> </head> <body> <div class="invoice-box"> <h2>Invoice #{{ $invoice->id }}</h2> <p>Date: {{ $invoice->date }}</p> <table> <tr> <td>Customer Name: {{ $invoice->customer_name }}</td> <td>Amount: {{ $invoice->amount }}</td> </tr> </table> </div> </body> </html>
Tạo Controller và Route để xử lý PDF
Tạo Controller mới
Sử dụng lệnh Artisan để tạo một Controller mới:
php artisan make:controller InvoiceController
Trong InvoiceController
, thêm phương thức để tạo PDF:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use PDF; class InvoiceController extends Controller { public function generatePDF($id) { $invoice = Invoice::find($id); // Giả sử bạn có model Invoice $pdf = PDF::loadView('invoice', compact('invoice')); return $pdf->download('invoice.pdf'); } }
Tạo Route
Thêm Route để liên kết với Controller:
Route::get('/invoice/{id}/pdf', [InvoiceController::class, 'generatePDF']);
Chuyển đổi view HTML thành PDF
Sử dụng dompdf để chuyển đổi view HTML thành PDF
Trong phương thức generatePDF
của InvoiceController
, sử dụng dompdf để chuyển đổi view invoice.blade.php
thành PDF và truyền dữ liệu từ Controller đến view.
Ví dụ mã nguồn sử dụng dompdf trong Controller
public function generatePDF($id) { $invoice = Invoice::find($id); $pdf = PDF::loadView('invoice', compact('invoice')); return $pdf->download('invoice.pdf'); }
Tải xuống PDF
Cách tạo file PDF và cung cấp chức năng tải xuống
Dompdf cho phép tạo file PDF từ view và cung cấp chức năng tải xuống một cách dễ dàng.
Cách cấu hình tiêu đề HTTP để tải xuống PDF
Sử dụng phương thức download
của dompdf để thiết lập tiêu đề HTTP tự động và tải xuống file PDF:
return $pdf->download('invoice.pdf');
Ví dụ về mã nguồn để tạo và tải xuống PDF
public function generatePDF($id) { $invoice = Invoice::find($id); $pdf = PDF::loadView('invoice', compact('invoice')); return $pdf->download('invoice.pdf'); }
Tùy chỉnh PDF
Tùy chỉnh giao diện PDF thông qua CSS và các tùy chọn dompdf
Bạn có thể tùy chỉnh giao diện của file PDF bằng cách sử dụng CSS trong tệp view HTML.
Các tùy chỉnh như kích thước trang, hướng trang, và font chữ
Dompdf cung cấp các tùy chọn để tùy chỉnh kích thước và hướng trang:
$pdf = PDF::loadView('invoice', compact('invoice'))->setPaper('a4', 'landscape');
Ví dụ về các tùy chỉnh CSS và cấu hình dompdf
<style> body { font-family: DejaVu Sans, sans-serif; } .invoice-box { max-width: 800px; margin: auto; padding: 30px; border: 1px solid #eee; box-shadow: 0 0 10px rgba(0, 0, 0, 0.15); } .invoice-box table { width: 100%; line-height: inherit; text-align: left; } .invoice-box table td { padding: 5px; vertical-align: top; } </style>
Xử lý các lỗi thường gặp
Các lỗi phổ biến khi tạo PDF bằng dompdf
- Không tìm thấy font chữ.
- Lỗi CSS không được áp dụng.
Hướng dẫn cách khắc phục các lỗi thường gặp
- Đảm bảo rằng bạn đã cài đặt các font chữ cần thiết.
- Kiểm tra lại đường dẫn CSS và các thuộc tính CSS.
Ví dụ minh họa về các lỗi và cách xử lý
// Lỗi không tìm thấy font chữ PDF::setOptions(['dpi' => 150, 'defaultFont' => 'DejaVu Sans']);
Kết luận
Trong bài viết này, chúng ta đã tìm hiểu cách tạo PDF từ tệp view HTML và tải xuống bằng dompdf trong Laravel. Việc tích hợp dompdf giúp bạn dễ dàng chuyển đổi nội dung HTML thành file PDF chuyên nghiệp và tùy chỉnh theo nhu cầu. Hãy tiếp tục khám phá và thực hành để nắm vững các kỹ thuật tạo PDF trong Laravel.
Tài liệu tham khảo