Lewati ke konten

Memaginasi tabel HTML besar ke beberapa halaman

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.

Terminal window
composer require nextpdf/core

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.

SimbolLokasiPeran
Document::writeHtml(string $html): staticNextPDF\Core\Concerns\HasTextOutputMerender HTML dan memaginasi tabel sesuai kebutuhan.
Document::createStandalone(): selfNextPDF\Core\DocumentMembuat dokumen mandiri.
Document::addPage(): staticNextPDF\Core\DocumentMembuka halaman pertama dan menetapkan ukuran serta margin halaman.
<?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 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";

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.

  • 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_OVERFLOW hanya 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.
  • rowspan terdegradasi saat melintasi pemisah. Sel rowspan yang 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.

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.

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.

PernyataanSpesifikasiKlausareference_id
Grup header tabel diulang melintasi kontainer fragmentasi ketika sebuah tabel dipecah.W3C CSS Tables 3css_tables_3#x1.x7.x253622ccb1bce2a0cc53bd70919fa4633a9376e2050f63a31a3fde9cb6595ec78

Tidak berlaku.