Berikut adalah tutorial lengkap tentang bagaimana cara menampilkan data ke dalam format PDF di Laravel dengan bantuan library dompdf. Kita akan membuat HTML terlebih dahulu, lalu mengubahnya menjadi file PDF.

Langkah 1: Instalasi DomPDF

Laravel menyediakan dukungan untuk dompdf melalui package barryvdh/laravel-dompdf. Langkah pertama adalah menginstal package ini.

Jalankan perintah berikut di terminal untuk menginstal package:

composer require barryvdh/laravel-dompdf

Setelah itu, tambahkan service provider ke dalam file config/app.php (di Laravel 9/10 sudah otomatis terdeteksi):

'providers' => [ Barryvdh\DomPDF\ServiceProvider::class, ],

Dan juga tambahkan alias:

'aliases' => [ 'PDF' => Barryvdh\DomPDF\Facade::class, ],

Setelah itu, publikasikan konfigurasi dengan perintah berikut:

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

Langkah 2: Membuat Route dan Controller

Sekarang, buat route baru untuk menampilkan data dan mengekspornya ke dalam format PDF.

Tambahkan Route di routes/web.php:

use App\Http\Controllers\PDFController;

Route::get('/generate-pdf', [PDFController::class, 'generatePDF'])->name('generate.pdf');

Buat Controller untuk menangani pembuatan PDF

Jalankan perintah berikut untuk membuat controller:

php artisan make:controller PDFController

Lalu, buka file app/Http/Controllers/PDFController.php dan tambahkan metode berikut:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use PDF;

class PDFController extends Controller
{
    public function generatePDF()
    {
        // Data yang akan ditampilkan di PDF (contoh menggunakan array sederhana)
        $data = [
            'title' => 'Laravel PDF Export Example',
            'date' => date('m/d/Y'),
            'content' => 'This is an example of generating a PDF in Laravel using DOMPDF library.'
        ];

        // Generate PDF menggunakan view 'myPDF'
        $pdf = PDF::loadView('myPDF', $data);

        // Mengirimkan file PDF ke browser
        return $pdf->download('example.pdf');
    }
}

Langkah 3: Buat View HTML

Sekarang, buat tampilan HTML yang nantinya akan di-render menjadi file PDF.

Buat file resources/views/myPDF.blade.php:

<!DOCTYPE html>
<html>
<head>
    <title>{{ $title }}</title>
    <style>
        body {
            font-family: Arial, sans-serif;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        table, th, td {
            border: 1px solid black;
        }
        th, td {
            padding: 8px;
            text-align: left;
        }
    </style>
</head>
<body>

    <h1>{{ $title }}</h1>
    <p>Date: {{ $date }}</p>
    <p>{{ $content }}</p>

    <h3>Data Table</h3>
    <table>
        <thead>
            <tr>
                <th>No</th>
                <th>Item</th>
                <th>Description</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>Item 1</td>
                <td>Description for item 1</td>
            </tr>
            <tr>
                <td>2</td>
                <td>Item 2</td>
                <td>Description for item 2</td>
            </tr>
            <tr>
                <td>3</td>
                <td>Item 3</td>
                <td>Description for item 3</td>
            </tr>
        </tbody>
    </table>

</body>
</html>

Di sini kita membuat tampilan sederhana yang terdiri dari judul, tanggal, konten paragraf, dan sebuah tabel data.

Langkah 4: Testing

Sekarang Anda bisa mengakses route /generate-pdf untuk menghasilkan file PDF.

Buka browser dan masukkan URL berikut:

http://localhost:8000/generate-pdf

File PDF akan dihasilkan dan diunduh dengan nama example.pdf yang berisi tampilan dari HTML.

Langkah 5: Menampilkan PDF di Browser (Opsional)

Jika Anda ingin menampilkan PDF di browser alih-alih mengunduhnya, ubah return statement pada metode generatePDF():

return $pdf->stream('example.pdf');

Dengan ini, PDF akan langsung ditampilkan di browser tanpa harus diunduh terlebih dahulu.

Kesimpulan

Dengan tutorial ini, Anda telah berhasil mengintegrasikan Dompdf ke dalam Laravel untuk mengekspor data dari tampilan HTML ke dalam format PDF. Jik tutorial ini berhasil, maka akan seperti berikut:

Langkah 6: Mengambil data dari database

Berikut tutorial Jika ingin menggunakan data dari database. kita akan menggunakan database yang sudah ada pada tutorial sebelumnya yaitu Belajar CRUD lengkap dengan fitur upload gambar di Laravel. Edit file PDFController menjadi sebagai berikut:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Post; // Import model Post
use PDF;

class PDFController extends Controller
{
    public function generatePDF()
    {
        // Ambil semua data dari tabel 'posts'
        $posts = Post::all();

        // Kirim data ke view 'postsPDF'
        $pdf = PDF::loadView('myPDF', compact('posts'));

        // Kirimkan file PDF ke browser untuk di-download
        return $pdf->download('posts.pdf');
    }
}

Dan ubah view yang ada di resources/views/myPDF.blade.php menjadi sebagai berikut:

<!DOCTYPE html>
<html>
<head>
    <title>Posts PDF</title>
    <style>
        body {
            font-family: Arial, sans-serif;
        }
        table {
            width: 100%;
            border-collapse: collapse;
        }
        table, th, td {
            border: 1px solid black;
        }
        th, td {
            padding: 8px;
            text-align: left;
        }
        th {
            background-color: #f2f2f2;
        }
    </style>
</head>
<body>

    <h1>Posts List</h1>

    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>Title</th>
                <th>Content</th>
                <th>Created At</th>
            </tr>
        </thead>
        <tbody>
            @foreach($posts as $post)
            <tr>
                <td>{{ $post->id }}</td>
                <td>{{ $post->title }}</td>
                <td>{{ $post->body}}</td>
                <td>{{ $post->created_at }}</td>
            </tr>
            @endforeach
        </tbody>
    </table>

</body>
</html>

Kemudian lakukan testing. Hasilnya sebagai berikut: