Memaginasi tabel HTML besar ke beberapa halaman
Sekilas
Bagian berjudul “Sekilas”Teruskan satu <table> besar ke writeHtml(). Mesin memaginasinya menjadi sebanyak halaman PDF yang dibutuhkan oleh baris-barisnya. <thead> diulang di bagian atas setiap halaman, sehingga setiap halaman tetap berfungsi sebagai tabel yang lengkap. Resep ini merender laporan 91 baris yang mengalir ke beberapa halaman. Anda tidak perlu memecah tabel sendiri atau menghitung pemisah halaman.
Instalasi
Bagian berjudul “Instalasi”composer require nextpdf/coreGambaran konseptual
Bagian berjudul “Gambaran konseptual”Ketika sebuah tabel lebih tinggi daripada satu halaman, pertahankan tabel itu sebagai satu elemen <table>. Mesin mengukur setiap baris, mengisi tinggi halaman yang dapat digunakan, membuka halaman baru, dan melanjutkan tabel yang sama. Mesin kembali merender baris <thead> di bagian atas setiap halaman lanjutan. Halaman lanjutan tetap mempertahankan margin atas dan bawah dokumen, sehingga baris pertama pada halaman baru dimulai di bawah margin atas, bukan di tepi halaman.
Tempatkan sel header di dalam <thead> dan baris data di dalam <tbody>. Hanya <thead> yang diulang. Pastikan setiap baris tetap dapat dipecah. Satu baris yang lebih tinggi daripada tinggi halaman yang dapat digunakan tidak dapat dipaginasi dan akan memunculkan UnsplittableContentException.
Permukaan API
Bagian berjudul “Permukaan API”| Simbol | Lokasi | Peran |
|---|---|---|
Document::writeHtml(string $html): static | NextPDF\Core\Concerns\HasTextOutput | Merender HTML dan memaginasi tabel sesuai kebutuhan. |
Document::createStandalone(): self | NextPDF\Core\Document | Membuat dokumen mandiri. |
Document::addPage(): static | NextPDF\Core\Document | Membuka halaman pertama dan menetapkan ukuran serta margin halaman. |
Contoh kode — Mulai cepat
Bagian berjudul “Contoh kode — Mulai cepat”<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$rows = '';for ($i = 1; $i <= 91; $i++) { $rows .= "<tr><td>{$i}</td><td>Item {$i}</td><td>In stock</td></tr>";}
$doc = Document::createStandalone();$doc->addPage();$doc->writeHtml( '<table>' . '<thead><tr><th>#</th><th>Name</th><th>Status</th></tr></thead>' . "<tbody>{$rows}</tbody>" . '</table>');$doc->save(__DIR__ . '/large-table.pdf');Sebanyak 91 baris tersebut mengalir ke beberapa halaman, dan header #/Name/Status diulang di setiap halaman.
Contoh kode — Produksi
Bagian berjudul “Contoh kode — Produksi”Contoh mandiri ini memberi gaya pada header, menerapkan striping pada baris, dan menulis PDF ke jalur yang disediakan harness.
<?php
declare(strict_types=1);
require_once __DIR__ . '/vendor/autoload.php';
use NextPDF\Core\Document;
$rows = '';for ($i = 1; $i <= 91; $i++) { $bg = $i % 2 === 0 ? '#F8FAFC' : '#FFFFFF'; $rows .= "<tr style=\"background-color: {$bg};\">" . "<td style=\"border: 1px solid #CBD5E1; padding: 4px;\">{$i}</td>" . "<td style=\"border: 1px solid #CBD5E1; padding: 4px;\">Item {$i}</td>" . "<td style=\"border: 1px solid #CBD5E1; padding: 4px;\">In stock</td>" . '</tr>';}
$html = <<<HTML<table style="width: 100%; border-collapse: collapse;"> <thead> <tr style="background-color: #1E3A8A; color: #FFFFFF;"> <th style="border: 1px solid #1E3A8A; padding: 6px;">#</th> <th style="border: 1px solid #1E3A8A; padding: 6px;">Name</th> <th style="border: 1px solid #1E3A8A; padding: 6px;">Status</th> </tr> </thead> <tbody>{$rows}</tbody></table>HTML;
$doc = Document::createStandalone();$doc->setTitle('Inventory report');$doc->addPage();$doc->writeHtml($html);
$out = getenv('NEXTPDF_OUT');$doc->save($out !== false ? $out : __DIR__ . '/paginate-large-html-tables.pdf');
echo "Wrote the paginated table PDF\n";Margin halaman lanjutan
Bagian berjudul “Margin halaman lanjutan”Halaman lanjutan memakai margin atas dan bawah dokumen. Baris pertama setelah pemisah halaman dimulai di bawah margin atas, dan baris terakhir sebelum pemisah berakhir di atas margin bawah. Hal ini mencegah tabel panjang terpotong di tepi halaman. Aturan yang sama berlaku untuk blok multihalaman dan tabel multihalaman.
Kasus tepi & jebakan
Bagian berjudul “Kasus tepi & jebakan”- Paginasi yang berhasil tidak memancarkan peringatan. Ketika sebuah tabel mengalir secara bersih ke beberapa halaman, mesin tidak memancarkan peringatan apa pun. Mesin memunculkan peringatan
TABLE_ROW_OVERFLOWhanya untuk tata letak yang terdegradasi: ketika tidak ada page-break sink, atau ketika sebuah baris harus dipindahkan ke awal halaman. Perlakukan peringatan itu sebagai sinyal untuk menyederhanakan tabel, bukan sebagai kegagalan. - Tempatkan header di
<thead>. Hanya baris<thead>yang diulang. Baris header yang dibiarkan di<tbody>hanya muncul sekali. - Baris harus dapat dipecah. Satu baris yang lebih tinggi daripada tinggi halaman yang dapat digunakan memunculkan
UnsplittableContentException. Pecah konten baris tersebut, atau persingkat. rowspanterdegradasi saat melintasi pemisah. Selrowspanyang melintasi batas halaman akan terfragmentasi (ADR-007). Untuk pengelompokan yang harus tetap utuh selama paginasi, gunakan baris header kategori sebagai gantinya. Lihat Fitur CSS yang tidak didukung.
Performa
Bagian berjudul “Performa”Rendering berskala secara linear terhadap jumlah baris. Mesin mengalirkan keluaran halaman demi halaman dan tidak pernah mempertahankan pohon dokumen, sehingga penggunaan memori untuk tabel panjang tidak bertambah seiring jumlah halaman. Anggaran untuk resep ini adalah wall_ms: 2000, peak_mb: 96.
Catatan keamanan
Bagian berjudul “Catatan keamanan”Validasikan jumlah baris dan panjang data sel yang disediakan pengguna agar ukuran keluaran tetap terbatas. Mesin merender teks alih-alih menafsirkannya, dan tidak menjalankan skrip apa pun.
Kesesuaian
Bagian berjudul “Kesesuaian”| Pernyataan | Spesifikasi | Klausa | reference_id |
|---|---|---|---|
| Grup header tabel diulang melintasi kontainer fragmentasi ketika sebuah tabel dipecah. | W3C CSS Tables 3 | css_tables_3#x1.x7.x2 | 53622ccb1bce2a0cc53bd70919fa4633a9376e2050f63a31a3fde9cb6595ec78 |
Konteks komersial
Bagian berjudul “Konteks komersial”Tidak berlaku.
Lihat juga
Bagian berjudul “Lihat juga”- HTML: subsistem rendering HTML+CSS ke PDF — rendering satu lintasan dan perilaku paginasi.
- Menata letak tabel di HTML — penentuan ukuran kolom,
colspan, dan garis tepi. - Memaginasi konten HTML panjang — pemisah halaman untuk konten blok campuran.
- Matriks dukungan CSS — status dukungan untuk tabel dan paginasi.