TCPDF 添加"Return to Table of Contents"页脚链接



情况

我正在尝试通过提供的HTML代码动态生成PDF。我的内容格式已经下降了,但是我坚持尝试让页脚正确工作。这是一个三部分的页脚,具有作者名称,页面名称和"返回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类,详细介绍了Bullet 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;
    }
}

注意:全局变量仅用于基本测试。

在页码应达到您要寻找的结果之前添加*。在添加TOC页面时,将页码与 *字符的页码前缀将阻止链接更改。这是应该做出的更改:

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

您可以在GitHub上的代码中读取此方法的文档。

此外,更改页脚中的条件性将阻止其在TOC页面上打印。在当前配置中,它将跳过第一个内容页面。这是更改:

// 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');

最新更新