Rate this post

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

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now