TCPDF 添加 "Return to Table of Contents" 页脚 Link
TCPDF Add "Return to Table of Contents" Footer Link
情况
我正在尝试从提供的 HTML 代码动态生成 PDF。我已将内容格式设置下来,但我一直在尝试让页脚正常工作。这是一个由 3 部分组成的页脚,包含作者姓名、页码和 "Return to ToC" link,但 link 不起作用。
我尝试过的
- 我知道 TCPDF How do you make a link to the Table of Contents (TOC)? and have already attempted it's solution, a variation of the link found in the official example 045,但没有成功。我只尝试了解决方案和示例,其中 link 根据
TCPDF_STATIC::$alias_num_page
而不是实际页面声明。两者都产生了一个没有功能的 link(鼠标悬停时甚至鼠标图标都没有改变,他们的示例文件也是如此)。
- 模仿 link 创建
TCPDF::addTOCPage()
函数。这导致运行 links,但它们仅指向被点击页面所在的页面顶部。
- 通过模仿 link 创建
TCPDF::addTOCPage()
函数,我意识到 TCPDF::SetLink()
函数对应于生成的页面,而不是 TCPDF_STATIC::$alias_num_page
值(最终页码值)。因此,由于 ToC 是最后创建的页面,它的值应该匹配 TCPDF_STATIC::$alias_tot_pages
。所以,我尝试将 link 设置为那个,但它只适用于 ToC。所有其他页面都有没有功能或鼠标图标的 link。
- 我创建了一个新的 class 变量和两个用于设置和获取它的值的函数,但是由于在生成 ToC 页面时设置的变量和 links 在页脚中已在生成之前设置,使它们都使用默认值“1”。
代码
下面是我当前版本的 MYPDF
class,详见项目符号 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;
}
}
注意: 使用全局变量只是为了基本测试。
在页码前添加一个 *
应该可以达到您要查找的结果。在页码前加上 * 字符将防止 link 在添加 TOC 页面时发生变化。这是应该进行的更改:
// $this->SetLink($link, 0, $this->getTocPageNo());
$this->SetLink($link, 0, '*' . $this->getTocPageNo());
您可以在代码 here on 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');
情况
我正在尝试从提供的 HTML 代码动态生成 PDF。我已将内容格式设置下来,但我一直在尝试让页脚正常工作。这是一个由 3 部分组成的页脚,包含作者姓名、页码和 "Return to ToC" link,但 link 不起作用。
我尝试过的
- 我知道 TCPDF How do you make a link to the Table of Contents (TOC)? and have already attempted it's solution, a variation of the link found in the official example 045,但没有成功。我只尝试了解决方案和示例,其中 link 根据
TCPDF_STATIC::$alias_num_page
而不是实际页面声明。两者都产生了一个没有功能的 link(鼠标悬停时甚至鼠标图标都没有改变,他们的示例文件也是如此)。 - 模仿 link 创建
TCPDF::addTOCPage()
函数。这导致运行 links,但它们仅指向被点击页面所在的页面顶部。 - 通过模仿 link 创建
TCPDF::addTOCPage()
函数,我意识到TCPDF::SetLink()
函数对应于生成的页面,而不是TCPDF_STATIC::$alias_num_page
值(最终页码值)。因此,由于 ToC 是最后创建的页面,它的值应该匹配TCPDF_STATIC::$alias_tot_pages
。所以,我尝试将 link 设置为那个,但它只适用于 ToC。所有其他页面都有没有功能或鼠标图标的 link。 - 我创建了一个新的 class 变量和两个用于设置和获取它的值的函数,但是由于在生成 ToC 页面时设置的变量和 links 在页脚中已在生成之前设置,使它们都使用默认值“1”。
代码
下面是我当前版本的 MYPDF
class,详见项目符号 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;
}
}
注意: 使用全局变量只是为了基本测试。
在页码前添加一个 *
应该可以达到您要查找的结果。在页码前加上 * 字符将防止 link 在添加 TOC 页面时发生变化。这是应该进行的更改:
// $this->SetLink($link, 0, $this->getTocPageNo());
$this->SetLink($link, 0, '*' . $this->getTocPageNo());
您可以在代码 here on 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');