Cara Membuat Invoice PDF Otomatis di Laravel: Nota Profesional + Unduh (Panduan 2026)
Cara Membuat Invoice PDF Otomatis di Laravel: Nota Profesional + Unduh (Panduan 2026)
Cara termudah membuat invoice PDF otomatis di Laravel adalah memakai package barryvdh/laravel-dompdf: install via Composer, buat template invoice dalam bentuk Blade, lalu panggil Pdf::loadView('pdf.invoice', $data)->download('invoice.pdf'). Agar benar-benar otomatis, generate PDF-nya saat order berstatus sukses lewat model observer atau event, simpan hasilnya ke storage, dan kirim sebagai lampiran email ke pembeli.
Apa itu invoice otomatis dan kenapa penting untuk toko online?
Invoice adalah bukti transaksi resmi berisi rincian barang, harga, pajak, dan nomor dokumen. Untuk kamu yang menjual produk digital atau source code, invoice otomatis menyelesaikan tiga masalah sekaligus: pembeli langsung dapat bukti bayar tanpa menunggu admin, kamu punya arsip rapi untuk laporan keuangan, dan website terlihat profesional seperti marketplace besar.
Kebanyakan tutorial hanya menunjukkan cara men-download PDF dari tombol. Di panduan ini kita bangun alur yang dipakai aplikasi sungguhan: nomor invoice otomatis yang tidak duplikat, PDF ter-generate sendiri begitu pembayaran sukses, tersimpan di server, terkirim via email, dan bisa diunduh ulang dari halaman riwayat order.
Bagaimana cara kerja generate PDF di Laravel?
Ada dua pendekatan populer, dan pilihannya tergantung kebutuhanmu:
| Aspek barryvdh/laravel-dompdf spatie/laravel-pdf | ||
| Cara render | Konversi HTML Blade ke PDF (murni PHP) | Render via headless Chrome (Browsershot) |
| Kebutuhan server | Tidak butuh apa-apa selain PHP | Butuh Node.js + Puppeteer di server |
| Dukungan CSS | Terbatas (hindari flexbox/grid) | Penuh, seperti di browser modern |
| Kecepatan | Cepat untuk dokumen sederhana | Lebih lambat, cocok untuk layout kompleks |
| Cocok untuk | Invoice, laporan, struk | Brosur, sertifikat, layout rumit |
Untuk invoice, barryvdh/laravel-dompdf sudah lebih dari cukup: ringan, jalan di shared hosting, dan tidak butuh Node.js. Itulah yang kita pakai di panduan ini. Menurut README resmi package-nya, sejak versi 3.x akses remote (gambar dari URL luar) dimatikan secara default demi keamanan — detail penting yang akan kita bahas di bagian template.
Apa saja yang dibutuhkan sebelum mulai?
- Laravel 9/10/11/12 atau 13 (semua versi modern didukung package ini)
- PHP 8.1 atau lebih baru
- Tabel
ordersdengan relasi keorder_items(sesuaikan dengan strukturmu) - Composer
Contoh di panduan ini memakai format nomor invoice INV/2026/X/0001 dan mata uang Rupiah.
Bagaimana cara install dan setup laravel-dompdf?
Langkah 1 — Install package via Composer:
Langkah 2 — (Opsional) Publish file konfigurasi:
File config/dompdf.php memungkinkanmu mengatur ukuran kertas default, font default, dan opsi keamanan seperti enable_remote. Biarkan default-nya dulu kecuali kamu paham risikonya: mengaktifkan enable_remote berarti server-mu akan mengambil konten dari URL eksternal saat render PDF, yang bisa disalahgunakan bila template menerima input pengguna.
Bagaimana cara membuat template invoice Blade yang rapi?
Buat file resources/views/pdf/invoice.blade.php. Aturan emasnya: gunakan tabel dan inline CSS sederhana. Dompdf tidak merender flexbox dan CSS grid dengan benar, jadi layout invoice yang aman adalah tabel klasik.
Perhatikan font-family: DejaVu Sans — ini font bawaan dompdf yang mendukung karakter Indonesia dengan benar. Font kustom memang bisa ditambahkan, tapi butuh konversi dan registrasi manual; untuk invoice, DejaVu Sans sudah rapi dan aman.
Soal logo: karena akses remote dimatikan di versi 3.x, jangan pakai <img src="https://...">. Solusi paling aman adalah meletakkan logo di folder public dan merujuknya dengan path lokal via public_path(), atau mengubahnya menjadi base64. Cara ini juga membuat PDF tetap tampil benar meski server sedang offline dari internet.
Bagaimana cara generate dan mengunduh PDF dari controller?
Buat route dan controller sederhana:
Tiga metode output yang tersedia: download() untuk langsung mengunduh, stream() untuk preview di browser, dan save($path) untuk menyimpan ke disk. Untuk halaman "riwayat order", stream() memberi pengalaman lebih baik karena pembeli bisa melihat dulu sebelum mengunduh.
Bagaimana membuat nomor invoice otomatis yang tidak duplikat?
Nomor invoice harus unik dan berurutan — dua order tidak boleh dapat nomor sama walau dibuat di detik yang sama. Pola yang aman: kunci baris counter di database dalam satu transaksi.
lockForUpdate() adalah kuncinya: tanpa lock, dua request bersamaan bisa membaca angka yang sama sebelum salah satunya menyimpan. Jujur saja, untuk toko kecil yang ordernya puluhan per hari, risiko tabrakan memang kecil — tapi pola ini murah untuk diterapkan dan menyelamatkanmu saat ada flash sale.
Bagaimana cara membuat invoice ter-generate otomatis saat pembayaran sukses?
Inilah bagian yang membedakan tutorial biasa dari implementasi produksi. Jangan generate PDF di dalam controller checkout — itu memperlambat respons dan gagal total bila render PDF error. Polanya: event saat order lunas → job antrean → generate + simpan + kirim email.
Lalu dispatch job ini dari event OrderPaid (atau langsung setelah callback payment gateway mengonfirmasi status sukses — misalnya setelah integrasi QRIS dinamis Midtrans menandai order lunas). File tersimpan di storage/app/invoices/ dan kolom invoice_path membuat tombol "Unduh Invoice" di riwayat order tinggal membaca file yang sudah ada — tanpa render ulang setiap diklik.
Kalau kamu belum memakai queue di project-mu, pelajari dulu panduan kirim email otomatis dengan queue — konsep worker-nya sama persis, dan invoice ini adalah kasus penggunaan ideal berikutnya.
Bagaimana cara mengirim invoice PDF sebagai lampiran email?
Setelah PDF tersimpan, lampirkan ke notifikasi order sukses:
attachData() lebih praktis daripada attach() karena membaca langsung dari storage tanpa perlu path publik. Satu invoice rata-rata hanya 50–150 KB, jadi aman untuk dilampirkan ke email.
Apa batasan laravel-dompdf yang harus diketahui?
Jujur soal batasan adalah bagian dari kode yang profesional:
- CSS terbatas. Flexbox, grid, dan CSS modern tidak dirender dengan benar. Tetaplah pada tabel, float, dan inline style. Kalau desainmu butuh layout kompleks, pertimbangkan
spatie/laravel-pdf. - Gambar remote dimatikan di v3.x. Pakai path lokal atau base64 untuk logo, seperti dibahas di atas.
- Render PDF besar lambat. Invoice dengan ratusan baris item bisa memakan beberapa detik dan banyak memori — di sinilah queue menjadi wajib, bukan opsional.
- Font non-latin butuh font yang di-embed. DejaVu Sans bawaan sudah mencakup kebutuhan Bahasa Indonesia; font kustom butuh langkah tambahan.
- Bukan untuk PDF interaktif. Dompdf menghasilkan dokumen statis — tidak ada form yang bisa diisi atau JavaScript di dalam PDF.
Cara ini tidak cocok jika kamu butuh invoice dengan desain sangat artistik per halaman atau tanda tangan digital tersertifikasi — untuk kebutuhan itu, gunakan library khusus PDF digital signature atau layanan e-invoice.
Kapan sebaiknya memakai alternatif lain?
Tetaplah dengan dompdf bila kebutuhanmu adalah invoice, struk, dan laporan tabular — ia ringan dan jalan di shared hosting. Pindahlah ke spatie/laravel-pdf (berbasis headless Chrome) bila desainmu memakai Tailwind penuh, flexbox, atau grafik SVG kompleks, dengan catatan server-mu harus bisa menjalankan Node.js dan Puppeteer — yang berarti VPS, bukan shared hosting biasa.
FAQ
Apakah barryvdh/laravel-dompdf gratis untuk dipakai komersial? Ya. Package ini berlisensi MIT (pembungkus dari dompdf yang berlisensi LGPL), jadi bebas dipakai di project komersial termasuk source code yang kamu jual, selama kamu mematuhi ketentuan lisensinya.
Apakah bisa generate invoice otomatis tanpa tombol download? Bisa — itulah pola yang dipakai di panduan ini. Generate PDF lewat job antrean saat order lunas, simpan ke storage, lalu kirim via email. Tombol download di halaman riwayat order tinggal menyajikan file yang sudah ada.
Bagaimana cara mencegah nomor invoice duplikat? Gunakan tabel counter dengan lockForUpdate() di dalam transaksi database, seperti contoh InvoiceNumberService di atas. Jangan mengandalkan Order::max('id') + 1 karena rentan race condition.
Kenapa gambar/logo tidak muncul di PDF? Sejak versi 3.x, akses remote dimatikan secara default. Pakai path file lokal (public_path()) atau embed sebagai base64. Cek juga permission baca file-nya.
Berapa ukuran file invoice PDF yang dihasilkan? Untuk invoice 1–2 halaman dengan logo, biasanya 50–150 KB. Cukup kecil untuk dilampirkan ke email maupun disimpan ribuan file di server.
Apakah PDF yang disimpan perlu di-backup? Ya. File di storage/app/invoices/ adalah dokumen keuangan — masukkan ke strategi backup rutinmu bersama database dan file upload, seperti dibahas di panduan backup otomatis Laravel.
Bisakah invoice digabungkan dengan voucher diskon di checkout? Bisa. Hitung total setelah voucher diterapkan, lalu teruskan nilai akhirnya ke template invoice. Kalau kamu memakai sistem kupon, panduan membuat sistem voucher diskon di Laravel bisa dikombinasikan langsung dengan alur invoice ini.
Kesimpulan
Membuat invoice PDF otomatis di Laravel sederhananya tiga langkah: install barryvdh/laravel-dompdf, buat template Blade berbasis tabel, dan render lewat Pdf::loadView(). Yang membuatnya berkelas produksi adalah empat lapisan di atasnya: nomor invoice anti-duplikat dengan database lock, generate via job antrean saat pembayaran sukses, penyimpanan ke storage untuk diunduh ulang, dan pengiriman otomatis via email. Terapkan pola ini sekali, dan setiap source code toko online yang kamu jual akan punya fitur billing yang terlihat profesional sejak hari pertama.
Artikel Terkait
WordPress 7.1.3 Rilis 6 Oktober 2026: 7 Patch Keamanan — Dua Rilis Darurat dalam 2 Minggu
25 Oct 2026
WordPress 7.2 Beta 1 Rilis 20 Oktober 2026: Fitur Baru & Checklist Uji Tema-Plugin Sebelum Final 8 Desember
25 Oct 2026
PHP2Shell: Celah Keamanan PHP CVSS 9.2 — Update ke 8.4.27, 8.3.36, atau 8.2.35 Sekarang
23 Oct 2026
Cara Membuat Fitur Pencarian Produk di Laravel: dari LIKE ke Full-Text Search (Panduan 2026)
21 Oct 2026