TCPDF Добавить & quot; Вернуться к содержанию & quot; Нижний колонтитул

Я пытаюсь динамически генерировать PDF-файлы из предоставленного HTML-кода. Форматирование содержимого отключено, но я застрял при попытке заставить нижний колонтитул работать правильно. Это нижний колонтитул из трех частей с именем автора, обозначением страницы и ссылкой «Вернуться к ToC», за исключением того, что ссылка не работает.

  1. Я в курсе TCPDF Как сделать ссылку на оглавление (TOC)? и уже пытались его решить, вариант ссылки, найденной в официальном пример 045, безуспешно. Я попробовал как решение, так и пример, в котором ссылка объявлена ​​в соответствии с TCPDF_STATIC::$alias_num_page а не фактическая страница. Оба создали ссылку без какой-либо функциональности (даже значок мыши не меняется при наведении курсора, и это также относится к их файлу примера).
  2. Подражая созданию ссылки TCPDF::addTOCPage() функция. Это привело к функционированию ссылок, но они указывали только на верхнюю часть страницы, где находилась страница, на которую нажимали.
  3. Работа с имитацией создания ссылки TCPDF::addTOCPage() функция, я понял, что TCPDF::SetLink() функция соответствует сгенерированной странице, а не TCPDF_STATIC::$alias_num_page значение (конечное значение номера страницы). Таким образом, поскольку ToC является последней созданной страницей, ее значение должно соответствовать TCPDF_STATIC::$alias_tot_pages, Итак, я попытался установить ссылку на это, но это работало только из ToC. На всех других страницах была ссылка без функциональности или со значком мыши.
  4. Я создал новую переменную класса и две функции для установки и получения ее значения, но это, опять же, было бесполезно из-за того, что переменная была установлена ​​при создании страницы ToC и ссылки в нижних колонтитулах были установлены до ее генерации, делая все они используют значение по умолчанию «1».

Ниже моя текущая версия MYPDF класс подробно описан в пуле 4.

class MYPDF extends TCPDF {
protected $tocPageNo = 1;

public function getTocPageNo() {
return $this->tocPageNo;
}

public function setTocPageNo($num) {
$this->tocPageNo = is_int($num) ? $num : $this->tocPageNo;
return;
}

public function Footer() {
if($this->PageNo() !== 1) {
$this->SetY(-15);
$this->SetFont('Helvetica', 'I', 8);
$margins = $this->getMargins();
$width = ($this->getPageWidth() - $margins['left'] - $margins['right']) / 3;
$this->MultiCell($width, 0, $GLOBALS['author'], 0, 'L', false, 0);
$this->MultiCell($width, 0, 'Page ' . $this->getAliasNumPage() . '/' . $this->getAliasNbPages(), 0, 'C', false, 0);
$link = $this->AddLink();
$this->SetLink($link, 0, $this->getTocPageNo());
$this->Write(0, 'Return to Table of Contents', $link, false, 'R');
}
return;
}
}

Заметка: Использование глобальной переменной только для базового тестирования.

1

Решение

Добавление * прежде чем номер страницы должен достичь результата, который вы ищете. Префикс номера страницы с символом * предотвратит изменение ссылки при добавлении страницы оглавления. Это изменение, которое должно быть сделано:

// $this->SetLink($link, 0, $this->getTocPageNo());
$this->SetLink($link, 0, '*' . $this->getTocPageNo());

Вы можете прочитать документацию для этого метода в коде здесь на GitHub.

Кроме того, изменение условия в нижнем колонтитуле предотвратит его печать на странице оглавления. В текущей конфигурации будет пропущена первая страница контента. Это изменение:

// if($this->PageNo() !== 1) {
if (!$this->tocpage) {

Вот полный пример:

<?php
require_once('tcpdf_include.php');

class MYPDF extends TCPDF {
public function Footer() {
if (!$this->tocpage) {
$this->SetY(-15);
$this->SetFont('Helvetica', 'I', 8);
$margins = $this->getMargins();
$width = ($this->getPageWidth() - $margins['left'] - $margins['right']) / 3;
$this->MultiCell($width, 0, "Author", 0, 'L', false, 0);
$this->MultiCell($width, 0, 'Page ' . $this->getAliasNumPage() . '/' . $this->getAliasNbPages(), 0, 'C', false, 0);
$link = $this->AddLink();
$this->SetLink($link, 0, '*1');
$this->Write(0, 'Return to Table of Contents', $link, false, 'R');
}
return;
}
}
$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
for ($i = 1; $i < 10; $i++) {
$pdf->AddPage();
$pdf->Bookmark('Chapter '.$i, 0, 0, '', 'B', array(0,64,128));
$pdf->Cell(0, 10, 'Chapter '.$i, 0, 1, 'L');
}
$pdf->addTOCPage();
$pdf->MultiCell(0, 0, 'Table Of Content', 0, 'C', 0, 1, '', '', true, 0);
$pdf->Ln();
$pdf->addTOC(1, 'courier', '.', 'INDEX', 'B', array(128,0,0));
$pdf->endTOCPage();
$pdf->Output('example.pdf', 'I');
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]