Phân trang bảng HTML lớn trên nhiều trang
Tổng quan nhanh
Phần tiêu đề “Tổng quan nhanh”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.
Cài đặt
Phần tiêu đề “Cài đặt”composer require nextpdf/coreTổng quan khái niệm
Phần tiêu đề “Tổng quan khái niệm”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.
Bề mặt API
Phần tiêu đề “Bề mặt API”| Ký hiệu | Vị trí | Vai trò |
|---|---|---|
Document::writeHtml(string $html): static | NextPDF\Core\Concerns\HasTextOutput | Kết xuất HTML và phân trang bảng khi cần. |
Document::createStandalone(): self | NextPDF\Core\Document | Tạo một tài liệu độc lập. |
Document::addPage(): static | NextPDF\Core\Document | Mở trang đầu tiên, đồng thời đặt kích thước trang và lề. |
Mã ví dụ — bắt đầu nhanh
Phần tiêu đề “Mã ví dụ — bắt đầu nhanh”<?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.
Mã ví dụ — triển khai thực tế
Phần tiêu đề “Mã ví dụ — triển khai thực tế”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";Lề của trang tiếp nối
Phần tiêu đề “Lề của trang tiếp nối”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_OVERFLOWkhi 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. rowspansuy giảm khi băng qua một điểm ngắt. Một ôrowspanvượ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ợ.
Hiệu năng
Phần tiêu đề “Hiệu năng”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.
Ghi chú bảo mật
Phần tiêu đề “Ghi chú bảo mật”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.
Tuân thủ
Phần tiêu đề “Tuân thủ”| Phát biểu | Đặc tả | Điều khoản | reference_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 3 | css_tables_3#x1.x7.x2 | 53622ccb1bce2a0cc53bd70919fa4633a9376e2050f63a31a3fde9cb6595ec78 |
Bối cảnh thương mại
Phần tiêu đề “Bối cảnh thương mại”Không áp dụng.
Xem thêm
Phần tiêu đề “Xem thêm”- HTML: hệ thống con kết xuất HTML+CSS sang PDF — hành vi kết xuất một lượt và phân trang.
- Dàn bố cục bảng trong HTML — định kích thước cột,
colspan, và đường viền. - Phân trang nội dung HTML dài — ngắt trang cho nội dung khối hỗn hợp.
- Ma trận hỗ trợ CSS — trạng thái hỗ trợ cho bảng và phân trang.