Ответ 1
Мне приходят два метода.
Способ 1:
Создайте собственную собственную функцию заголовка (например, в примере 3 TCPDF), которая автоматически добавляет ячейки заголовка на каждую страницу. В этом случае вы переместите код размещения ячейки заголовка в метод Header
в своем классе и нарисуйте заголовки на фиксированную позицию на странице. Поскольку метод Header
вызывается автоматически при добавлении новой страницы, ваши заголовки таблиц будут добавляться сразу после создания страницы. Это, конечно, быстрее и менее интенсивно, чем метод 2, но это может быть немного сложно.
Способ 2:
Используйте транзакции TCPDF, чтобы обнаружить, когда строка вот-вот сломает страницу, а затем откат. Вы бы тогда AddPage
сами; снова нарисуйте заголовки; и продолжить отображение. Вы можете сделать это, получив количество страниц перед тем, как сделать строку, и сравните ее с количеством страниц после. Пример того, как вы могли бы сделать это следующим образом:
//Separated Header Drawing into it own function for reuse.
public function DrawHeader($header, $w) {
// Colors, line width and bold font
// Header
$this->SetFillColor(233, 136, 64);
$this->SetTextColor(255);
$this->SetDrawColor(128, 0, 0);
$this->SetLineWidth(0.3);
$this->SetFont('', 'B');
$num_headers = count($header);
for($i = 0; $i < $num_headers; ++$i) {
$this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
}
$this->Ln();
// Color and font restoration
$this->SetFillColor(224, 235, 255);
$this->SetTextColor(0);
$this->SetFont('');
}
// Colored table
public function ColoredTable($header,$data) {
$w = array(10, 40, 20, 20, 20, 20, 20);
$this->DrawHeader($header, $w);
// Data
$fill = 0;
foreach($data as $row) {
//Get current number of pages.
$num_pages = $this->getNumPages();
$this->startTransaction();
$this->Cell($w[0], 6, $row[0], 'LR', 0, 'C', $fill);
$this->Cell($w[1], 6, $row[1], 'LR', 0, 'L', $fill);
$this->Cell($w[2], 6, $row[2], 'LR', 0, 'C', $fill);
$this->Cell($w[3], 6, $row[3], 'LR', 0, 'C', $fill);
$this->Cell($w[4], 6, $row[4], 'LR', 0, 'C', $fill);
$this->Cell($w[5], 6, $row[5], 'LR', 0, 'C', $fill);
$this->Cell($w[6], 6, $row[6], 'LR', 0, 'C', $fill);
$this->Ln();
//If old number of pages is less than the new number of pages,
//we hit an automatic page break, and need to rollback.
if($num_pages < $this->getNumPages())
{
//Undo adding the row.
$this->rollbackTransaction(true);
//Adds a bottom line onto the current page.
//Note: May cause page break itself.
$this->Cell(array_sum($w), 0, '', 'T');
//Add a new page.
$this->AddPage();
//Draw the header.
$this->DrawHeader($header, $w);
//Re-do the row.
$this->Cell($w[0], 6, $row[0], 'LR', 0, 'C', $fill);
$this->Cell($w[1], 6, $row[1], 'LR', 0, 'L', $fill);
$this->Cell($w[2], 6, $row[2], 'LR', 0, 'C', $fill);
$this->Cell($w[3], 6, $row[3], 'LR', 0, 'C', $fill);
$this->Cell($w[4], 6, $row[4], 'LR', 0, 'C', $fill);
$this->Cell($w[5], 6, $row[5], 'LR', 0, 'C', $fill);
$this->Cell($w[6], 6, $row[6], 'LR', 0, 'C', $fill);
$this->Ln();
}
else
{
//Otherwise we are fine with this row, discard undo history.
$this->commitTransaction();
}
$fill=!$fill;
}
$this->Cell(array_sum($w), 0, '', 'T');
}