FPDF оглавление и проблемы с номерами страниц

В общем, я хотел бы начать оглавление (toc) на странице 2 и подсчитать номер каждой страницы toc. После того, как ток закончился, я бы хотел начать с основного контента. Эти страницы тоже должны быть пронумерованы.

В двух словах:

  • каждая страница должна иметь нижний колонтитул, кроме титульного листа
  • первая страница, которая появляется после ток, должна иметь страницу № 4 вместо страницы № 1 (не так, как в примере кода ниже)

Источник (http://www.fpdf.org/en/script/script73.php, имя файла toc.php)

<?php
require('fpdf.php');

class PDF_TOC extends FPDF {
var $_toc=array();
var $_numbering=false;
var $_numberingFooter=false;
var $_numPageNum=1;

function AddPage($orientation='', $format='') {
parent::AddPage($orientation,$format);
if($this->_numbering)
$this->_numPageNum++;
}

function startPageNums() {
$this->_numbering=true;
$this->_numberingFooter=true;
}

function stopPageNums() {
$this->_numbering=false;
}

function numPageNo() {
return $this->_numPageNum;
}

function TOC_Entry($txt, $level=0) {
$this->_toc[]=array('t'=>$txt,'l'=>$level,'p'=>$this->numPageNo());
}

function insertTOC( $location=1,
$labelSize=20,
$entrySize=10,
$tocfont='Times',
$label='Table of Contents'
) {
//make toc at end
$this->stopPageNums();
$this->AddPage();
$tocstart=$this->page;

$this->SetFont($tocfont,'B',$labelSize);
$this->Cell(0,5,$label,0,1,'C');
$this->Ln(10);

foreach($this->_toc as $t) {

//Offset
$level=$t['l'];
if($level>0)
$this->Cell($level*8);
$weight='';
if($level==0)
$weight='B';
$str=$t['t'];
$this->SetFont($tocfont,$weight,$entrySize);
$strsize=$this->GetStringWidth($str);
$this->Cell($strsize+2,$this->FontSize+2,$str);

//Filling dots
$this->SetFont($tocfont,'',$entrySize);
$PageCellSize=$this->GetStringWidth($t['p'])+2;
$w=$this->w-$this->lMargin-$this->rMargin-$PageCellSize-($level*8)-($strsize+2);
$nb=$w/$this->GetStringWidth('.');
$dots=str_repeat('.',$nb);
$this->Cell($w,$this->FontSize+2,$dots,0,0,'R');

//Page number
$this->Cell($PageCellSize,$this->FontSize+2,$t['p'],0,1,'R');
}

//Grab it and move to selected location
$n=$this->page;
$n_toc = $n - $tocstart + 1;
$last = array();

//store toc pages
for($i = $tocstart;$i <= $n;$i++)
$last[]=$this->pages[$i];

//move pages
for($i=$tocstart-1;$i>=$location-1;$i--)
$this->pages[$i+$n_toc]=$this->pages[$i];

//Put toc pages at insert point
for($i = 0;$i < $n_toc;$i++)
$this->pages[$location + $i]=$last[$i];
}

function Footer() {
if(!$this->_numberingFooter)
return;
//Go to 1.5 cm from bottom
$this->SetY(-15);
//Select Arial italic 8
$this->SetFont('Arial','I',8);
$this->Cell(0,7,$this->numPageNo(),0,0,'C');
if(!$this->_numbering)
$this->_numberingFooter=false;
}
}
?>

пример

<?php
require('toc.php');

$pdf= new PDF_TOC();
$pdf->SetFont('Times','',12);
$pdf->AddPage();
$pdf->Cell(0,5,'Cover',0,1,'C');
$pdf->AddPage();
$pdf->startPageNums();
$pdf->Cell(0,5,'TOC1',0,1,'L');
$pdf->TOC_Entry('TOC1', 0);
$pdf->Cell(0,5,'TOC1.1',0,1,'L');
$pdf->TOC_Entry('TOC1.1', 1);
$pdf->AddPage();
$pdf->Cell(0,5,'TOC2',0,1,'L');
$pdf->TOC_Entry('TOC2', 0);
$pdf->AddPage();
for($i=3;$i<=80;$i++){
$pdf->Cell(0,5,'TOC'.$i,0,1,'L');
$pdf->TOC_Entry('TOC'.$i, 0);
}
$pdf->stopPageNums();
//Generate and insert TOC at page 2
$pdf->insertTOC(2);
$pdf->Output();
?>

Как я могу это сделать? Я могу уточнить вопрос / код, если это необходимо. Буду признателен за любую помощь, чтобы решить мою проблему. Заранее спасибо.

1

Решение

Это можно сделать за несколько простых шагов.

  1. При создании содержимого документа PDF оставьте пустую страницу (или страницы), где вы хотите разместить оглавление, например:

    • $this->pdf->AddPage('P','letter');
    • $this->pdf->AddPage('P','letter');
  2. Добавляйте содержимое TOC в массив при создании содержимого PDF.

    • $toc[] = ['label' -> "item", 'page' -> $pdf->PageNo()];
  3. После создания всего содержимого сохраните номер текущей страницы:

    • $last_page = $pdf->PageNo();
  4. Установите номер страницы в соответствии с вашим местоположением оглавления:

    • $pdf->page = 2;
  5. Создайте свой TOC

    • (без разницы)
  6. ВАЖНО! Сбросьте номер страницы до сохраненного значения:

    • $pdf->page = $last_page
2

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

как уже упоминал @Matt Raines, вам нужно переключиться на TCPDF для достижения желаемого поведения.

0

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