Bỏ qua để đến nội dung

Phân trang bảng HTML lớn trên nhiều trang

Truyền một <table> lớn vào writeHtml(). Engine sẽ phân trang bảng đó thành số trang PDF cần thiết theo số hàng. Phần <thead> được lặp lại ở đầu mỗi trang, nên mỗi trang hoạt động như một bảng hoàn chỉnh. Công thức này kết xuất một báo cáo 91 hàng trải trên nhiều trang. Bạn không cần tự chia bảng hay tự tính điểm ngắt trang.

Terminal window
composer require nextpdf/core

Khi một bảng cao hơn một trang, hãy giữ bảng đó dưới dạng một phần tử <table> duy nhất. Engine đo từng hàng, lấp đầy chiều cao trang khả dụng, mở trang mới rồi tiếp tục với cùng bảng đó. Engine kết xuất lại các hàng <thead> ở đầu mỗi trang tiếp nối. Các trang tiếp nối giữ nguyên lề trên và lề dưới của tài liệu, nên hàng đầu tiên trên trang mới bắt đầu bên dưới lề trên, không phải sát mép trang.

Đặt các ô tiêu đề trong một <thead> và các hàng dữ liệu trong một <tbody>. Chỉ <thead> được lặp lại. Hãy giữ từng hàng ở trạng thái có thể chia tách. Một hàng đơn lẻ cao hơn chiều cao trang khả dụng thì không thể phân trang và sẽ làm phát sinh UnsplittableContentException.

Ký hiệuVị tríVai trò
Document::writeHtml(string $html): staticNextPDF\Core\Concerns\HasTextOutputKết xuất HTML và phân trang bảng khi cần.
Document::createStandalone(): selfNextPDF\Core\DocumentTạo một tài liệu độc lập.
Document::addPage(): staticNextPDF\Core\DocumentMở trang đầu tiên, đồng thời đặt kích thước trang và lề.
<?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');

91 hàng trải trên nhiều trang, và tiêu đề #/Name/Status được lặp lại trên mỗi trang.

Ví dụ hoàn chỉnh này định kiểu tiêu đề, tô màu xen kẽ cho các hàng, và ghi PDF vào đường dẫn do harness cung cấp.

<?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";

Các trang tiếp nối dùng lề trên và lề dưới của tài liệu. Hàng đầu tiên sau một lần ngắt trang bắt đầu bên dưới lề trên, và hàng cuối cùng trước một điểm ngắt dừng lại bên trên lề dưới. Điều này giúp bảng dài không bị cắt sát mép trang. Cùng quy tắc này áp dụng cho khối nhiều trang và bảng nhiều trang.

Trường hợp đặc biệt & điểm cần lưu ý

Phần tiêu đề “Trường hợp đặc biệt & điểm cần lưu ý”
  • Không phát cảnh báo phân trang khi thành công. Khi một bảng được dàn gọn gàng qua nhiều trang, bảng không phát ra cảnh báo nào. Engine chỉ phát sinh cảnh báo TABLE_ROW_OVERFLOW khi bố cục bị suy giảm: không có sink ngắt trang, hoặc một hàng phải được dời sang trang mới để mở đầu trang đó. Hãy xem cảnh báo này là tín hiệu cần đơn giản hóa bảng, không phải lỗi.
  • Đặt tiêu đề trong <thead>. Chỉ các hàng <thead> được lặp lại. Một hàng tiêu đề bị đặt trong <tbody> chỉ xuất hiện một lần.
  • Các hàng phải có thể chia tách. Một hàng đơn lẻ cao hơn chiều cao trang khả dụng sẽ làm phát sinh UnsplittableContentException. Hãy tách nhỏ nội dung của hàng đó hoặc rút ngắn lại.
  • rowspan suy giảm khi băng qua một điểm ngắt. Một ô rowspan vượt qua một ranh giới trang sẽ bị phân mảnh (ADR-007). Với các nhóm phải giữ nguyên vẹn khi phân trang, hãy dùng một hàng tiêu đề danh mục thay thế. Xem Các tính năng CSS không được hỗ trợ.

Chi phí kết xuất tăng tuyến tính theo số hàng. Engine phát luồng đầu ra theo từng trang và không bao giờ giữ lại toàn bộ cây tài liệu, nên bộ nhớ cho một bảng dài không tăng theo số trang. Ngân sách cho công thức này là wall_ms: 2000, peak_mb: 96.

Hãy xác thực số hàng và độ dài ô trong dữ liệu do người dùng cung cấp để giữ kích thước đầu ra trong giới hạn. Engine kết xuất văn bản thay vì diễn giải văn bản đó, và không chạy script nào.

Phát biểuĐặc tảĐiều khoảnreference_id
Một nhóm tiêu đề bảng lặp lại trên các vùng chứa phân mảnh mà một bảng được chia vào.W3C CSS Tables 3css_tables_3#x1.x7.x253622ccb1bce2a0cc53bd70919fa4633a9376e2050f63a31a3fde9cb6595ec78

Không áp dụng.