İçeriğe geç

Büyük bir HTML tablosunu sayfalara bölün

Büyük bir <table>’ı writeHtml()’e geçirin. Motor bunu, satırların gerektirdiği kadar PDF sayfasına böler. <thead> her sayfanın üstünde yinelenir; böylece her sayfa eksiksiz bir tablo gibi işlev görür. Bu tarif, birkaç sayfaya yayılan 91 satırlık bir raporu işler. Tabloyu elle bölmez veya sayfa sonlarını hesaplamazsınız.

Terminal window
composer require nextpdf/core

Bir tablo tek bir sayfadan daha uzun olduğunda, onu tek bir <table> öğesi olarak tutun. Motor her satırı ölçer, kullanılabilir sayfa yüksekliğini doldurur, yeni bir sayfa açar ve aynı tabloyu sürdürür. <thead> satırlarını her devam sayfasının üstünde yeniden işler. Devam sayfaları belgenin üst ve alt kenar boşluklarını korur; böylece yeni sayfadaki ilk satır sayfa kenarından değil, üst kenar boşluğunun altından başlar.

Başlık hücrelerini <thead> içine, veri satırlarını da <tbody> içine yerleştirin. Yalnızca <thead> yinelenir. Her satırın bölünebilir kalmasını sağlayın. Kullanılabilir sayfa yüksekliğinden daha uzun tek bir satır sayfalar arasında bölünemez ve UnsplittableContentException fırlatır.

SembolKonumRol
Document::writeHtml(string $html): staticNextPDF\Core\Concerns\HasTextOutputHTML’i işler ve tabloları gerektiği gibi sayfalara böler.
Document::createStandalone(): selfNextPDF\Core\DocumentBağımsız bir belge oluşturur.
Document::addPage(): staticNextPDF\Core\Documentİlk sayfayı açar ve sayfa boyutuyla kenar boşluklarını ayarlar.
<?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 satır birkaç sayfaya yayılır ve #/Name/Status başlığı her sayfada yinelenir.

Bu bağımsız örnek başlığı biçimlendirir, satırları dönüşümlü renklendirir ve PDF’i test düzeneğinin sağladığı yola yazar.

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

Devam sayfaları belgenin üst ve alt kenar boşluklarını kullanır. Sayfa sonundan sonra gelen ilk satır üst kenar boşluğunun altından başlar; sayfa sonundan önceki son satır ise alt kenar boşluğunun üstünde durur. Bu, uzun bir tablonun sayfa kenarına dayanıp kırpılmasını önler. Aynı kural, çok sayfalı bloklar ve çok sayfalı tablolar için de geçerlidir.

  • Başarılı sayfalama uyarı üretmez. Bir tablo sayfalara temiz biçimde aktığında hiçbir uyarı üretmez. Motor, TABLE_ROW_OVERFLOW uyarısını yalnızca yerleşimden ödün verilen durumlarda oluşturur: bir sayfa sonu alıcısı olmadığında veya bir satırın bir sayfanın başına alınması için yeniden konumlandırılması gerektiğinde. Uyarıyı başarısızlık olarak değil, tabloyu sadeleştirme sinyali olarak değerlendirin.
  • Başlığı <thead> içine koyun. Yalnızca <thead> satırları yinelenir. <tbody> içine yerleştirilen bir başlık satırı yalnızca bir kez görünür.
  • Satırlar bölünebilir olmalıdır. Kullanılabilir sayfa yüksekliğinden daha uzun tek bir satır UnsplittableContentException fırlatır. O satırın içeriğini parçalara ayırın veya kısaltın.
  • rowspan sayfa sonunu aştığında sadeleştirilir. Bir sayfa sınırını aşan bir rowspan hücresi parçalanır (ADR-007). Sayfalama boyunca bütünlüğünü koruması gereken gruplamalar için bunun yerine bir kategori başlığı satırı kullanın. Bkz. Desteklenmeyen CSS özellikleri.

İşleme, satır sayısıyla doğrusal olarak ölçeklenir. Motor çıktıyı sayfa sayfa akıtır ve hiçbir zaman bellekte tam bir belge ağacı tutmaz; böylece uzun bir tablo için bellek kullanımı sayfa sayısıyla büyümez. Bu tarif için bütçe wall_ms: 2000, peak_mb: 96 şeklindedir.

Çıktı boyutunun sınırlı kalması için kullanıcı tarafından sağlanan verilerin satır sayısını ve hücre uzunluğunu doğrulayın. Motor metni yorumlamak yerine işler ve hiçbir betik çalıştırmaz.

İfadeBelirtimMaddereference_id
Bir tablo başlığı grubu, tablo bölündüğünde oluşan parçalanma kapsayıcıları boyunca yinelenir.W3C CSS Tables 3css_tables_3#x1.x7.x253622ccb1bce2a0cc53bd70919fa4633a9376e2050f63a31a3fde9cb6595ec78

Uygulanamaz.