Lewati ke konten

Pemecahan masalah paket NextPDF Laravel

Gunakan halaman ini untuk memetakan setiap kegagalan paket yang terlihat ke akar penyebab di tingkat sumber yang telah diverifikasi. Setiap entri mencantumkan gejala, penyebab, dan perbaikannya.

Terminal window
composer require nextpdf/laravel
php artisan vendor:publish --tag=nextpdf-config

Sebagian besar masalah yang dilaporkan masuk ke lima kelompok: penemuan, resolusi kontainer, penandatanganan, job antrean, dan nama berkas Hypertext Transfer Protocol (HTTP). Paket ini sengaja dirancang agar gagal secara jelas. Fitur opsional yang tidak dikonfigurasi mengembalikan null, dan input yang tidak aman melempar eksepsi bertipe. Gejala biasanya langsung menunjuk ke penyebabnya.

GejalaPenyebab terverifikasiPerbaikan
Provider tidak terdaftar setelah pemasanganAplikasi menonaktifkan penemuan dengan extra.laravel.dont-discoverHapus paket dari dont-discover, atau daftarkan NextPdfServiceProvider secara manual di bootstrap/providers.php
config('nextpdf') kosongKonfigurasi tidak digabungkan karena belum ada binding yang diiklankan yang diresolusi (provider yang ditangguhkan)Resolusikan salah satu entri provides(), atau konfirmasi penemuan dengan php artisan package:discover --ansi
config/nextpdf.php tidak dibuat oleh publishTag publish tidak cocokGunakan tag yang tepat: php artisan vendor:publish --tag=nextpdf-config
RuntimeException: “NextPDF requires the ext-mbstring/ext-zlib PHP extension”Ekstensi Hypertext Preprocessor (PHP) yang diperlukan tidak tersedia saat runtimePasang atau aktifkan mbstring dan zlib di php.ini
GejalaPenyebab terverifikasiPerbaikan
app(SignerInterface::class) mengembalikan nullPenandatanganan dinonaktifkan, atau sertifikat di nextpdf.signature kosongSetel signature.enabled = true dan isi signature.certificate yang valid; pasang nextpdf/premium untuk menyediakan implementasi konkret penanda tangan
app(TsaClient::class) mengembalikan nullnextpdf.tsa.url kosongKonfigurasikan tsa.url (dan credentials/pins sesuai kebutuhan)
Class-not-found untuk tipe versi PDF/Anextpdf.pdfa bukan null tetapi nextpdf/premium tidak terpasangPasang nextpdf/premium, atau setel kembali pdfa ke null
Class-not-found saat meresolusi kontrak e-invoiceBinding terdaftar, tetapi implementasi konkret Premium tidak adaPasang nextpdf/premium; kontrak e-invoice diresolusi secara lazy dan baru gagal saat resolusi pertama tanpa Premium
Dokumen yang sama dimutasi di dua operasi logisBinding dokumen adalah factory; Anda menggunakan kembali satu instance yang telah diresolusiResolusikan PdfDocumentInterface yang baru untuk setiap dokumen

Kontainer tanpa entri memunculkan eksepsi not-found pada get() (PHP Standard Recommendation 11 (PSR-11) §1.1.2). Kontrak e-invoice terikat, jadi has() pada kontainer mengembalikan true. Implementasi konkret Premium yang hilang memunculkan galat saat konstruksi, bukan dari kontainernya sendiri.

GejalaPenyebab terverifikasiPerbaikan
InvalidArgumentException: Path traversal sequences are not allowedPath output berisi segmen ..Gunakan path absolut tanpa traversal di bawah direktori penyimpanan Anda
InvalidArgumentException: Stream wrappers are not allowedPath menggunakan skema seperti php://Gunakan path sistem berkas biasa
InvalidArgumentException: Output path contains null bytesPath berisi bita \0Bersihkan path sebelum dispatch
InvalidArgumentException: Output path must end with .pdf extensionPath tidak diakhiri dengan .pdf (tidak peka huruf besar/kecil)Gunakan akhiran .pdf (atau .PDF)
Job berjalan tetapi berkas kosong atau salahClosure builder tidak mengembalikan dokumen yang sudah dikonfigurasiKembalikan dokumen dari builder; job menyimpan nilai yang dikembalikan
Job menggunakan antrean atau timeout yang salahnextpdf.queue.* tidak disetel seperti yang diharapkanSetel queue.queue, queue.connection, dan queue.timeout; tries dan backoff memerlukan subkelas

Pemeriksaan path dijalankan di dalam handle() pada worker, jadi path yang buruk gagal selama eksekusi, bukan saat dispatch. Ini disengaja: worker memvalidasi payload antrean terserialisasi tepat di titik payload itu dikonsumsi.

GejalaPenyebab terverifikasiPerbaikan
Nama berkas unduhan secara tak terduga menjadi document.pdfAnda meneruskan nama berkas kosong; factory menggunakan nilai standarTeruskan nama berkas yang tidak kosong
Nama berkas kehilangan path atau karakter khususProses pembersihan nama berkas menghapus pemisah path, karakter kontrol, dan bita nullTeruskan hanya nama berkas dasar; pengerasan ini memang diharapkan
Nama berkas non-ASCII menampilkan mojibake di sebagian klienRespons memancarkan RFC 5987 Request for Comments 5987 filename*= untuk nama non-ASCII; klien lama membaca cadangan ASCIISesuai harapan; sediakan nama yang aman untuk ASCII jika klien lama harus cocok persis
Respons stream tidak memiliki Content-LengthRespons stream sengaja menghilangkan Content-Length (output dikirim per potongan)Sesuai harapan; gunakan inline()/download() non-stream jika header panjang diperlukan
Terminal window
# Confirm the provider is discovered
php artisan package:discover --ansi
# Inspect merged configuration
php artisan tinker --execute="dump(config('nextpdf.queue'));"
resource: src/Laravel/NextPdfServiceProvider.php (null-check pattern)
<?php
declare(strict_types=1);
use NextPDF\Contracts\SignerInterface;
$signer = app(SignerInterface::class);
if ($signer === null) {
// Signing not configured, or nextpdf/premium not installed.
// Continue without a signature, or fail with a clear message.
}
  • Dengan provider yang ditangguhkan, pemasangan baru bisa tampak “rusak” hingga resolusi relevan pertama. Anggap pencantuman paket oleh package:discover sebagai sinyal keberhasilan.
  • Ketika image_cache_mb = null, paket beralih ke 50 MB; hanya 0 yang menonaktifkan cache. Laporan “cache tidak nonaktif” biasanya menggunakan null.
  • Ketika signature.level = null, paket beralih diam-diam ke PDF Advanced Electronic Signatures (PAdES) B-B. Laporan “B-B tak terduga” biasanya membiarkan level tidak disetel.

Jika beberapa permintaan pertama pada worker berumur panjang terasa lambat, registri fon sedang mengurai sesuai permintaan. Isi nextpdf.preload_fonts agar pemanasan berjalan satu kali saat boot worker. Lihat /integrations/laravel/configuration/ dan /integrations/laravel/boot-and-discovery/ untuk detailnya.

Penolakan path dan nama berkas merupakan kontrol keamanan, bukan bug. Jangan menyiasatinya dengan melakukan pra-dekode atau melonggarkan pemeriksaan. Sebagai gantinya, arahkan output berkas melalui path penyimpanan yang terkendali. Lihat /integrations/laravel/security-and-operations/.

KlaimSumberKlausareference_id
Entri kontainer yang hilang memunculkan not-found pada get()PSR-11 Container§1.1.2
  • /integrations/laravel/install/ — langkah penemuan dan publish
  • /integrations/laravel/configuration/ — setiap kunci dan nilai standarnya
  • /integrations/laravel/production-usage/ — pola dependency injection (DI) dan antrean
  • /integrations/laravel/security-and-operations/ — alasan keberadaan pemeriksaan path