【问题标题】:TCPDF Add "Return to Table of Contents" Footer LinkTCPDF 添加“返回目录”页脚链接
【发布时间】:2018-08-06 09:43:33
【问题描述】:

情况

我正在尝试从提供的 HTML 代码动态生成 PDF。我已经把内容格式化了,但我一直在努力让页脚正常工作。这是一个由 3 部分组成的页脚,其中包含作者姓名、页面名称和“返回 ToC”链接,但该链接不起作用。

我的尝试

  1. 我知道TCPDF How do you make a link to the Table of Contents (TOC)? 并且已经尝试过它的解决方案,这是官方example 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;
    }
}

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

【问题讨论】:

    标签: php footer tcpdf tableofcontents


    【解决方案1】:

    在页码前添加* 应该可以达到您想要的结果。在页码前加上 * 字符将防止添加 TOC 页面时链接发生变化。这是应该做出的改变:

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

    您可以在代码here on 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');
    

    【讨论】:

    • 就是这样。所以其他线程中提出的解决方案让我有点困惑。它在链接的目的地定义了链接,如果实现的代码完全是程序性的,我认为这并没有错。我的不是,所以我认为这就是我的冲突出现的地方。关于IF 语句,由于还生成标题表,我仍然需要$this-&gt;PageNo() !== 1 条件,但结合这些条件可以使页脚远离两者页。感谢您的信息。 :) 现在我需要弄清楚这个表问题。
    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    相关资源
    最近更新 更多